Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA EXCEL范围语法_Vba_Excel - Fatal编程技术网

VBA EXCEL范围语法

VBA EXCEL范围语法,vba,excel,Vba,Excel,我不懂range的语法 为什么这样做有效: 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 =

我不懂range的语法

为什么这样做有效:

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
什么意思?为什么我不能用

Range("A" & lastRow), 0

如果没有关于错误的任何具体细节,我假设Match不会返回您期望的值,而是一个#N/A错误。Match有语法

=匹配(查找值、查找范围、匹配类型)

lookup_范围通常由多个单元格组成,可以是一列多行,也可以是一行多列

在公式中,查找范围中只有一个单元格。假设最后一排是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

您的语法没有问题,代码应该可以正常工作。
使用诸如
Match
Vlookup
等工作表函数和其他查找函数的问题在于,如果未找到要搜索的值,则会抛出错误

在您的情况下,您试图在一个单元格中搜索多个值。
那么让我们假设您的
最后一行
是9。您的代码将从
单元格(2,1)
循环到
单元格(9,1)
检查它是否在
范围(“A”&lastrow)
范围(“A9”)

如果从
单元格(2,1)
单元格(9,1)
的值与
范围(“A9”)
中的值相同,则不会出现错误

现在,如果您使用
范围(“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”)

重要的是,如果找不到匹配项,则处理错误。
一种方法是在错误恢复下一步时使用
,在错误转到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
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
时不会出错。因此,您可以在
变量中指定它的值,并在以后的代码中使用它,而不会出现任何问题。更好的方法是,使用
IsError
test检查是否在注释行中未找到值

在上述两种情况下,我都使用了
变量
类型
num
变量。
主要原因是,如果没有找到匹配项,它将处理任何其他值

至于范围语法,请不要混淆,它相当简单。
请参阅以下示例

  • 单电池-所有参考A1

    不要与使用单元格索引混淆。这就像从左到右、从上到下对所有单元格进行编号一样。

  • 相邻单元格的范围-全部参考A1:A10

    Range("A1:A10") ' Classic
    Range("A1", "A10") ' or below
    Range(Cells(1, 1), Cells(10, 1))
    
    上面使用了相同的语法
    范围(Cell1[Cell2])
    ,其中第一个语法省略了
    可选的
    参数
    [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”,等等。好的,这对于第二行来说是有意义的,但第一行的语法似乎很奇怪。我继续并发布了一个答案,试图更详细地解释这一点。希望这会有所帮助:)它将更容易理解为范围(“A”&i:“&”D”&i)或范围(“A”&i&“:“&”D”&i),但编译器需要这种特定的格式,所以我只需引用此线程,而不必思考!。谢谢在其lookup_数组参数中需要一个单元格数组<代码>=匹配(A1,A1,0)
    在工作表上工作,因为错误控制开销假设“足够接近”。它在VBA中不起作用,因为正确语法的栏稍高。使用
    num=WorksheetFunction.Match(Cells(i,1),Array(Range(“A”&lastRow)),0)
    明确地告诉它,您正在将一个单元格的数组传递到lookup\u数组参数中。我显然被纠正了。我不知道我的Excel VBA有那么生锈。错误答案被删除。谢谢!范围(“A1”、“A”和lastRow),0)用于查找lastRow=9的范围(A1到A9)。比Range(“A1:A”和lastRow)更容易阅读,0)L42,非常全面的答案,比我预期的要多得多。希望这能帮助其他人。num=WorksheetFunction.Match(单元格(i,1),Range(“A”&lastRow),0)给出运行时错误1004。无法获取工作表函数类的match属性。你是对的,我在找A1:A10,只是不懂语法
    Range("A1:A5","A6:A10")
    Range("A1", "A8:A10")
    Range("A1:A2", "A10")
    
    Range("A1,A3,A5,A7,A9") ' Classic