返回列表 上一主題 發帖

[發問] 想請教如何用VBA判斷關鍵字,並複製一列

各位高手好,我想請教一下
我有一份關鍵字清單並已分類好
現在有一份課程名稱要來查詢出關鍵字
目前可查出 ...
hasrhgni 發表於 2014-12-19 16:51

我猜你的結果是要像 Sheet4 中所顯示的情形,
程式修改如下:
  1. Dim iCol%
  2.   Dim strSA$, strC$, strA$, strca$, Dilimiter$  '定義字串變數,用來承接範圍名稱

  3.   strSA = "class_name" '待搜尋字串的範圍名稱(橘色範圍)
  4.   strC = "keyword"        '欲在(紅色範圍)中搜尋的關鍵字(藍色範圍)
  5.   strA = "Answer"       '用來承接答案的範圍名稱(紅色範圍)
  6.   strca = "catalog"
  7.   Dilimiter = ","       '用來做為區隔符號的變數,方便後續文書處理用

  8. For i = 1 To Range(strSA).Rows.Count 'Range("範圍名稱")就是一個工作表中的"範圍名稱"所代表的範圍
  9.     For j = 1 To Range(strC).Rows.Count '.Rows.Count 為總資料行數
  10.         If InStr(Range(strSA).Cells(i + lIns, 1), Range(strC).Cells(j, 1).Value) <> 0 Then
  11.             With Range(strA).Cells(i, 1)
  12.               iCol = .Offset(, Columns.Count - 2).End(xlToLeft).Column - 1
  13.               .Offset(, iCol) = Range(strC).Cells(j, 1).Offset(0, -1)
  14.             End With
  15.         End If
  16.     Next
  17. Next
複製代碼
如果你要的是 B 欄放全部鍵值,
但以 , 做區隔的話就改成底下這樣:
  1.   Dim strSA$, strC$, strA$, strca$, Dilimiter$  '定義字串變數,用來承接範圍名稱

  2.   strSA = "class_name" '待搜尋字串的範圍名稱(橘色範圍)
  3.   strC = "keyword"        '欲在(紅色範圍)中搜尋的關鍵字(藍色範圍)
  4.   strA = "Answer"       '用來承接答案的範圍名稱(紅色範圍)
  5.   strca = "catalog"
  6.   Dilimiter = ","       '用來做為區隔符號的變數,方便後續文書處理用
  7.   
  8. For i = 1 To Range(strSA).Rows.Count 'Range("範圍名稱")就是一個工作表中的"範圍名稱"所代表的範圍
  9.     Range(strA).Cells(i, 1) = ""
  10.     For j = 1 To Range(strC).Rows.Count '.Rows.Count 為總資料行數
  11.         If InStr(Range(strSA).Cells(i + lIns, 1), Range(strC).Cells(j, 1).Value) <> 0 Then
  12.             With Range(strA).Cells(i, 1)
  13.               If .Value <> "" Then
  14.                 .Value = .Value & Dilimiter & Range(strC).Cells(j, 1).Offset(0, -1)
  15.               Else
  16.                 .Value = Range(strC).Cells(j, 1).Offset(0, -1)
  17.               End If
  18.             End With
  19.         End If
  20.     Next
  21. Next
複製代碼

TOP

本帖最後由 luhpro 於 2014-12-22 00:40 編輯

回復 4# hasrhgni
你的程式沒考慮到每當插入一列時,
對應的標的儲存格會有位移,
所以要用一個變數來存放此位移值並套用到應該隨之變更的數字上:
  1.   Dim strSA$, strC$, strA$, strca$, Dilimiter$  '定義字串變數,用來承接範圍名稱
  2.   Dim lIns& ' 插入列時的位移值

  3. strSA = "class_name" '待搜尋字串的範圍名稱(橘色範圍)
  4. strC = "keyword"        '欲在(紅色範圍)中搜尋的關鍵字(藍色範圍)
  5. strA = "Answer"       '用來承接答案的範圍名稱(紅色範圍)
  6. strca = "catalog"
  7. Dilimiter = ","       '用來做為區隔符號的變數,方便後續文書處理用

  8. lIns = 0
  9. For i = 1 To Range(strSA).Rows.Count 'Range("範圍名稱")就是一個工作表中的"範圍名稱"所代表的範圍
  10.   Range(strA).Cells(i + lIns, 1) = "" '設定承接答案用的儲存格為空值,避免重複按按鈕時資料累加
  11.     For j = 1 To Range(strC).Rows.Count '.Rows.Count 為總資料行數
  12.         If InStr(Range(strSA).Cells(i + lIns, 1), Range(strC).Cells(j, 1).Value) <> 0 Then
  13.           With Range(strA).Cells(i + lIns, 1)
  14.             If .Value = "" Then  '若承接答案用的儲存格為空,則直接放入關鍵字
  15.                  .Value = Range(strC).Cells(j, 1).Offset(0, -1)
  16.             Else    '若不為空值則保留原來資料 插入分隔符號 再插入新資料
  17.                         With .EntireRow
  18.                           .Copy
  19.                           .Insert Shift:=xlDown
  20.                         End With
  21.                         .Value = Range(strC).Cells(j, 1).Offset(0, -1).Value
  22.                         lIns = lIns + 1
  23.             End If
  24.           End With
  25.         End If
  26.     Next
  27. Next
複製代碼

TOP

luhpro 大師您好!
不知我是否可以加入個判斷,如果分類大於2筆時多複製一筆為"綜合類"
hasrhgni 發表於 2014-12-22 17:44

那就再加個變數囉:
  1.   Dim strSA$, strC$, strA$, strca$, Dilimiter$  '定義字串變數,用來承接範圍名稱
  2.   Dim lIns&, iCnt%  ' <=====加這行, 計算是否超過 2 個

  3. strSA = "class_name" '待搜尋字串的範圍名稱(橘色範圍)
  4. strC = "keyword"        '欲在(紅色範圍)中搜尋的關鍵字(藍色範圍)
  5. strA = "Answer"       '用來承接答案的範圍名稱(紅色範圍)
  6. strca = "catalog"
  7. Dilimiter = ","       '用來做為區隔符號的變數,方便後續文書處理用

  8. lIns = 0
  9. For i = 1 To Range(strSA).Rows.Count 'Range("範圍名稱")就是一個工作表中的"範圍名稱"所代表的範圍
  10.   Range(strA).Cells(i + lIns, 1) = "" '設定承接答案用的儲存格為空值,避免重複按按鈕時資料累加
  11.   iCnt = 0 '<=====加這行, 歸零
  12.     For j = 1 To Range(strC).Rows.Count '.Rows.Count 為總資料行數
  13.         If InStr(Range(strSA).Cells(i + lIns, 1), Range(strC).Cells(j, 1).Value) <> 0 Then
  14.           With Range(strA).Cells(i + lIns, 1)
  15.             If .Value = "" Then  '若承接答案用的儲存格為空,則直接放入關鍵字
  16.               .Value = Range(strC).Cells(j, 1).Offset(0, -1)
  17.             Else    '若不為空值則保留原來資料 插入分隔符號 再插入新資料
  18.               With .EntireRow
  19.                 .Copy
  20.                 .Insert Shift:=xlDown
  21.               End With
  22.               .Value = Range(strC).Cells(j, 1).Offset(0, -1).Value
  23.               lIns = lIns + 1
  24.               iCnt = iCnt + 1 '<=====加這行, 計數值加 1
  25.             End If
  26.           End With
  27.         End If
  28.     Next
  29.   '<=====加這段-頭
  30.     If iCnt > 2 Then ' 超過 2 個加一行
  31.       With Range(strA).Cells(i + lIns, 1)
  32.         With .EntireRow
  33.           .Copy
  34.           .Insert Shift:=xlDown
  35.         End With
  36.         .Value = "綜合類"
  37.         lIns = lIns + 1
  38.       End With
  39.     End If
  40.   '<=====加這段-尾
  41. Next
複製代碼

TOP

        靜思自在 : 稻穗結得越飽滿,越會往下垂,一個人越有成就,就要越有謙沖的胸襟。
返回列表 上一主題