Board logo

標題: [發問] 關於WorksheetFunction.match的使用方法? [打印本頁]

作者: l020330320    時間: 2015-6-30 14:44     標題: 關於WorksheetFunction.match的使用方法?

不好意思 各位前輩 最近小弟在工作上剛好有使用到EXCEL的VBA
但是恰好碰到一些問題實在搞不懂 所以上來發問請求指點!!

1.本來是使用 Find 方法來尋找相符的資料並用 FindNext 來尋找下一筆,但發現資料量一大之後電腦的執行速度實在慢到有點誇張(2000筆資料需要20秒左右),故改寫了Match的方法。
2.Match方法支援的資料型態是哪種呢?因為小弟使用string型態來執行(也嘗試過Variant一樣會錯),發現部分的資料匯入是行得通的(EX:21040523007)這筆可以,但有部分資料卻跳出錯誤1004 無法取得類別worksheetFunction 的 Match 屬性(EX:21040508010)這筆,有點疑惑,因為都是用同一判斷方式,怎麼會有多種不同的結果。
3.Match的尋找下一筆的語法小弟去MSDN看過,可是不是很了解,上面只寫了 "match = match.NextMatch()  " 可是我把它變數轉換帶進去後,跳出錯誤 不正確的定位項(qualifier)。

以上三個問題真的很頭疼,在此附上檔案附件以及代碼麻煩各位前輩指引一下,感激不盡。

※CODE的位置在"登錄"此工作表內的"輸入號碼"的位置
  1. Private Sub CommandButton4_Click() '輸入工卡號碼

  2. Dim a As String, cardnumber As String

  3. Application.ScreenUpdating = False

  4. cardnumber = InputBox("請輸入工卡號碼(建議使用條碼器)")
  5. i = 9

  6. Sheets("資料庫").Activate

  7. a = Application.WorksheetFunction.Match(CDbl(cardnumber), Sheets("資料庫").[B:B], 0) '設定資料庫裡的B欄搜尋結果為a
  8. If a = "0" Then
  9.     MsgBox "未搜尋到您所輸入的工卡號碼,請確認資料來源無誤。"
  10.     Sheets("登錄").Select
  11.     Exit Sub
  12. Else
  13.     Sheets("登錄").Range("A2") = cardnumber
  14.     firstAddress = Cells(a, 2).Address
  15.                   
  16.     Do
  17.         Sheets("資料庫").Select
  18.         ActiveSheet.Range(ActiveSheet.Cells(a, 1), ActiveSheet.Cells(a, 62)).Select '選擇並複製欄位
  19.         Selection.Copy
  20.    
  21.         Sheets("登錄").Select
  22.             '如果判定B欄C欄及K欄都為空值的話則貼上
  23.             If (ActiveSheet.Cells(i, 2) = "" And ActiveSheet.Cells(i, 3) = "" And ActiveSheet.Cells(i, 6) = "") Then
  24.             ActiveSheet.Cells(i, 2).Select
  25.             Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  26.             Application.CutCopyMode = False
  27.         
  28.             Sheets("資料庫").Select
  29.         
  30.             'a = a.Nextmatch()
  31.             secondAddress = Cells(a, 2).Address '判斷ADDRESS後選取複製欄位
  32.             Else
  33.             End If
  34.         i = i + 1
  35.            
  36.     Loop While secondAddress <> firstAddress
  37.     Sheets("登錄").Select
  38.    
  39. End If

  40. Range("K9") = "=G7"
  41. Range("K10") = "=H7"
  42. Range("K11") = "=I7"
  43. Range("K12") = "=J7"
  44. Range("K13") = "=K7"
  45. Range("K14") = "=L7"
  46. Range("K15") = "=M7"
  47. Range("K16") = "=N7"
  48. Range("K17") = "=O7"
  49. Range("K18") = "=P7"


  50. Application.ScreenUpdating = True
  51. End Sub
複製代碼
[attach]21300[/attach]
作者: lpk187    時間: 2015-6-30 19:30

回復 1# l020330320

搜尋速度要快可以利用陣列來找速度會快很多的!下面代碼給你參考!
  1. Private Sub CommandButton4_Click() '輸入工卡號碼
  2. Dim a As String, cardnumber As String
  3. Dim arr2()
  4. Application.ScreenUpdating = False
  5. cardnumber = InputBox("請輸入工卡號碼(建議使用條碼器)")
  6. i = 9
  7. x = 1
  8. arr = Sheets("資料庫").Range("a2:bj" & Sheets("資料庫").Cells(Rows.Count, 2).End(xlUp).Row)

  9. For j = 1 To UBound(arr, 1)
  10.     If arr(j, 2) = cardnumber Then
  11.         ReDim Preserve arr2(1 To 42, 1 To x)
  12.         arr1 = Application.Transpose(Application.Index(arr, j, 0))
  13.         For s = 1 To 42
  14.             arr2(s, x) = Application.Transpose(arr1(s, 1))
  15.         Next
  16.         x = x + 1
  17.     End If
  18. Next
  19. [a2] = cardnumber
  20. [b9].Resize(UBound(arr2, 2), UBound(arr2, 1)) = Application.Transpose(arr2)
  21. 'Sheets("資料庫").Activate

  22. 'a = Application.WorksheetFunction.Match(CDbl(cardnumber), Sheets("資料庫").[B:B], 0) '設定資料庫裡的B欄搜尋結果為a
  23. 'If a = "0" Then
  24. '    MsgBox "未搜尋到您所輸入的工卡號碼,請確認資料來源無誤。"
  25. '    Sheets("登錄").Select
  26. '    Exit Sub
  27. 'Else
  28. '    Sheets("登錄").Range("A2") = cardnumber
  29. '    firstAddress = Cells(a, 2).Address
  30. '
  31. '    Do
  32. '        Sheets("資料庫").Select
  33. '        ActiveSheet.Range(ActiveSheet.Cells(a, 1), ActiveSheet.Cells(a, 62)).Select '選擇並複製欄位
  34. '        Selection.Copy
  35. '
  36. '        Sheets("登錄").Select
  37. '            '如果判定B欄C欄及K欄都為空值的話則貼上
  38. '            If (ActiveSheet.Cells(i, 2) = "" And ActiveSheet.Cells(i, 3) = "" And ActiveSheet.Cells(i, 6) = "") Then
  39. '            ActiveSheet.Cells(i, 2).Select
  40. '            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  41. '            Application.CutCopyMode = False
  42. '
  43. '            Sheets("資料庫").Select
  44. '
  45. '            'a = a.Nextmatch()
  46. '            secondAddress = Cells(a, 2).Address '判斷ADDRESS後選取複製欄位
  47. '            Else
  48. '            End If
  49. '        i = i + 1
  50. '
  51. '    Loop While secondAddress <> firstAddress
  52. '    Sheets("登錄").Select
  53. '
  54. 'End If
  55. Range("K9") = "=G7"
  56. Range("K10") = "=H7"
  57. Range("K11") = "=I7"
  58. Range("K12") = "=J7"
  59. Range("K13") = "=K7"
  60. Range("K14") = "=L7"
  61. Range("K15") = "=M7"
  62. Range("K16") = "=N7"
  63. Range("K17") = "=O7"
  64. Range("K18") = "=P7"
  65. Application.ScreenUpdating = True
  66. End Sub
複製代碼

作者: GBKEE    時間: 2015-6-30 20:27

回復 1# l020330320

http://forum.twbts.com/viewthread.php?tid=10339
作者: l020330320    時間: 2015-7-1 08:32

回復 2# lpk187

好的,謝謝L大的提點,我也正在想如果沒辦法搞定,再換個方式寫看看!!
作者: l020330320    時間: 2015-7-1 08:34

回復 3# GBKEE

G大謝謝囉,原來常常發生錯誤找不到match的值?可是明明表單裡面有那個值阿...怎麼還是會找不到呢?
作者: GBKEE    時間: 2015-7-1 15:40

回復 5# l020330320

[attach]21303[/attach]


自己改一下 儲存格 是文字格式 , CDbl 格式為 Double 數字
   
  1. Sheets("資料庫").Activate
  2.         'CDbl(cardnumber)
  3. a = Application.Match(cardnumber, Sheets("資料庫").[B:B], 0) '設定資料庫裡的B欄搜尋結果為a
複製代碼

作者: l020330320    時間: 2015-7-1 16:44

回復 6# GBKEE

感謝,因為office沒有顯示綠色標籤提醒,居然忘記了最原始儲存格格式的問題。難怪問題寥寥....感謝指導~!!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)