VBA:循环中的相对单元格引用

时间:2016-12-27 15:16:14

标签: vba excel-vba loops excel

我试图在循环中使用相对引用。我的目标是使用索引和匹配组合来查找值,而与文件中存在的行数和列数无关。这是我到目前为止创建的,但它不起作用。存储在两张不同纸张上的数据相同。

 Error msg: Run-time error '1004':

无法获取WorksheetFunction

的匹配属性
  1. 子测试()

    Dim ActSor As Long, ActOsz As Long
    
    ActSor = ActiveSheet.UsedRange.Rows.Count 
    ActOsz = ActiveSheet.UsedRange.Columns.Count
    
    Dim ws1 As Worksheet, ws2 As Worksheet
    
    Set ws1 = Sheets("Sheet1")
    Set ws2 = Sheets("Sheet2")
    
    Dim Rg As Range
    
    Set Rg = ws2.Range("B2", Cells(ActSor, ActOsz))
    
    Dim RgActOsz As Long
    
    RgActOsz = Rg.Columns.Count
    
    Dim i As Long , sor As Long
    
    For i = 2 To RgActOsz
       For sor = 2 To ActSor
          Cells(sor, i).Value = Application.WorksheetFunction.Index(ws1.Columns(i),
          Application.WorksheetFunction.Match(Cells(sor, 1), Rg.Columns(1), 0))
       Next sor
    Next i
    
    End Sub
    

2 个答案:

答案 0 :(得分:1)

Set Rg = ws2.Range("B2", Cells(ActSor, ActOsz))

这是禁止的。正确的语法:

Set Rg = Range( ws2.Range("B2"), ws2.Cells(ActSor, ActOsz))

这有帮助吗?

答案 1 :(得分:0)

每次使用Range()对象时,都会使用隐式ActiveSheet.Range()命令。如果要从中拉出值的工作表未激活,Range()命令将给出错误的结果。

我的建议:

  1. 使用相应的工作表对象限定所有Range()函数,例如ws1.Range()
  2. 选择带有范围的表格中的左上角单元格,然后使用Resize()命令扩展到表格。例如,要选择单元格A2以及接下来的100行和20列,请使用ws1.Range("A2").Resize(100,20)
  3. 不使用具有隐式活动工作表的Cells(),而是使用现有范围并使用Offset()命令。从单元格A2开始选择包含20列的表的 i 行,使用Range("A2").Offset(i-1,0).Resize(1,20)
  4. 使用named ranges选择单元格引用,因为它们随单元格一起移动。例如Range("AccountsTable").Offset(i-1,0).Resize(1,20)