沒有什麼不對您的語法你的代碼應該工作得很好。
使用工作表函數如Match
,Vlookup
和其他查找函數的問題是,如果找不到值被搜索,它會引發錯誤。
就你而言,你試圖在一個單元中搜索多個值。
因此,讓我們說你的lastrow
是9.你的代碼將從Cell(2,1)
循環到Cell(9,1)
檢查它是否在Range("A" & lastrow)
或Range("A9")
。
如果值從Cell(2,1)
通過Cell(9,1)
相同的價值Range("A9")
,你不會得到一個錯誤。
現在,如果您使用Range("A1:A" & lastrow)
,它肯定會奏效,因爲您試圖將該範圍的每個元素都與自己匹配,並且肯定會找到匹配項。
WorksheetFunction.Match(Cells(2,1), Range("A1:A9")) 'will return 2
WorksheetFunction.Match(Cells(3,1), Range("A1:A9")) 'will return 3
'
'
'And so on if all elements are unique
如果使用Range("A9")
或Range("A1:A9")
沒關係。
重要的是,如果您沒有找到匹配,您將處理錯誤。
一種方法是使用On Error Resume Next
和On Error Goto 0
這樣的:
Sub ject()
Dim num As Variant
Dim i As Long, lastrow As Long: lastrow = 9
For i = 2 To lastrow
On Error Resume Next
num = WorksheetFunction.Match(Cells(i, 1), Range("A" & lastrow), 0)
If Err.Number <> 0 Then num = "Not Found"
On Error GoTo 0
Debug.Print num
Next
End Sub
另一種方法是使用Application.Match
在WorksheetFunction.Match
這樣的:
Sub ject()
Dim num As Variant
Dim i As Long, lastrow As Long: lastrow = 9
For i = 2 To lastrow
num = Application.Match(Cells(i, 1), Range("A" & lastrow), 0)
Debug.Print num
'If Not IsError(num) Then Debug.Print num Else Debug.Print "Not Found"
Next
End Sub
Application.Match
工作方式相同,但它並不會報錯了當它返回#N/A
。因此,您可以將其值分配給Variant
變量,並稍後在代碼中使用,而不會有任何問題。更好的是,使用IsError
測試來檢查在註釋行中是否找不到如上所示的值。
在上述兩種情況下,我使用了Variant
類型num
變量。
主要原因是如果沒有找到匹配的情況下,它可以處理任何其他值。
至於範圍語法,不要混淆,它很簡單。
請參考下面的例子。
單細胞 - 都指A1
Cells(1,1) ' Using Cell property where you indicate row and column
Cells(1) ' Using cell property but using just the cell index
Range("A1") ' Omits the optional [Cell2] argument
不要使用細胞指數相混淆。這就像你從左到右,從上到下編號所有單元格一樣。
Cells(16385) ' refer to A2
連續單元的範圍 - 所有參考A1:A10
Range("A1:A10") ' Classic
Range("A1", "A10") ' or below
Range(Cells(1, 1), Cells(10, 1))
以上使用相同的語法Range(Cell1,[Cell2])
其中所述第一個,省略了optional
參數[Cell2]
。正因爲如此,以下也適用:
Range("A1:A5","A6:A10")
Range("A1", "A8:A10")
Range("A1:A2", "A10")
非連續的單元格 - 都指A1,A3,A5,A7,A9
Range("A1,A3,A5,A7,A9") ' Classic
你指定的起點和「A1:A」不是你正在使用的,而是「A1:A3」來表示一個範圍 - 單個單元格範圍可以只是「A1:A1」等。 –
OK,對於第二行是有意義的,但首先的語法看起來很奇怪。 – equalizer
我繼續併發布了一個試圖更詳細地解釋這個問題的答案。希望這將有助於:) –