2015-05-22 245 views
1

我不明白範圍的語法。VBA EXCEL範圍語法

爲什麼這個工作:

For i = 1 To 10 
    Range("A" & i & ":D" & i).Copy 
Next 

但是,這並不工作:

For i = 2 To lastRow 
    num = WorksheetFunction.Match(Cells(i, 1), Range("A" & lastRow), 0) 
Next  

爲什麼我需要使用

For i = 2 To lastRow 
    'num = WorksheetFunction.Match(Cells(i, 1), Range("A1:A" & lastRow), 0) 
Next 

什麼A1:的平均?爲什麼我不能使用

+0

你指定的起點和「A1:A」不是你正在使用的,而是「A1:A3」來表示一個範圍 - 單個單元格範圍可以只是「A1:A1」等。 –

+0

OK,對於第二行是有意義的,但首先的語法看起來很奇怪。 – equalizer

+0

我繼續併發布了一個試圖更詳細地解釋這個問題的答案。希望這將有助於:) –

回答

2

沒有什麼不對您的語法你的代碼應該工作得很好。
使用工作表函數如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 NextOn 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.MatchWorksheetFunction.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變量。
主要原因是如果沒有找到匹配的情況下,它可以處理任何其他值。

至於範圍語法,不要混淆,它很簡單。
請參考下面的例子。

  1. 單細胞 - 都指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 
    

    不要使用細胞指數相混淆。這就像你從左到右,從上到下編號所有單元格一樣。 enter image description here

    Cells(16385) ' refer to A2 
    
  2. 連續單元的範圍 - 所有參考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") 
    
  3. 非連續的單元格 - 都指A1,A3,A5,A7,A9

    Range("A1,A3,A5,A7,A9") ' Classic 
    
+0

我明顯站得更正。我沒有意識到我的Excel VBA很生疏。刪除了惡意答案。 –

+1

謝謝!範圍(「A1」,「A」和lastRow),0)用lastrow = 9查找範圍(A1到A9)。比範圍(「A1:A」和lastRow)更容易閱讀,0) – equalizer

+0

L42,非常全面的答案,比我期待的要多得多。希望這會幫助其他人。 – equalizer

1

沒有關於錯誤的任何具體細節,我假設Match不會返回您期望的值,而是#N/A錯誤。匹配的語法是

=匹配(Lookup_Array中,lookup_range,MATCH_TYPE)

的lookup_range通常由幾個範圍單元中的,或者是具有若干行或列與多個列的行。

在您的公式中,lookup_range中只有一個單元格。比方說,LASTROW是10環的前三個運行生成式

=Match(A2,A10,0) 
=Match(A3,A10,0) 
=Match(A4,A10,0) 

這是一個有效的公式,但在大多數情況下,結果將不會是一個比賽,但一個錯誤。儘管你可能想要的是

=Match(A2,A1:A10,0) 

你的代碼再來看,縫合在一起,並找出爲什麼你需要A1:A作爲一個字符串公式中恆:

For i = 2 To lastRow 
    num = WorksheetFunction.Match(Cells(i, 1), Range("A1:A" & lastRow), 0) 
Next 
+0

num = WorksheetFunction.Match(Cells(i,1),Range(「A」&lastRow),0) 給出運行時錯誤1004.無法獲取Worksheet函數類的匹配屬性。你是對的,我正在尋找A1:A10,只是不明白語法 – equalizer