VBA中引用表的索引匹配

时间:2019-02-28 20:06:42

标签: excel vba match

我想基于另一个工作表中的单元格更新表中的一行,为此,我打算使用索引匹配功能。当我运行下面的代码时,出现错误,提示它无法获取match函数类的属性。 在这方面正确的语法是什么?

Sub Update_Customer()

' Declarations
Dim rng as listobject
Dim wf as application.worksheetfunction
Dim cs_sht as string
Set rng = Sheets(1).ListObjects("Table_Customer")
Set ws = ThisWorkbook.ActiveSheet
cs_sht = ws.Name

' ERROR RUNNING THIS LINE vvvvv
wf.Index(rng.ListColumns("Firstname"), wf.Match(cs_sht, rng.ListColumns("Customer ID"), 0)) = ws.Range("C_Firstname").Value

End Sub

1 个答案:

答案 0 :(得分:0)

Excel函数需要嵌套,因为单元格的值需要解析为一个步骤。

VBA代码不需要这样做。 VBA指令效果最好,并且在拆分它们时使调试更容易。

所以代替这个:

wf.Index(rng.ListColumns("Firstname"), wf.Match(cs_sht, rng.ListColumns("Customer ID"), 0))

将其拆分:

Dim matchResult As Long
matchResult = WorksheetFunction.Match(cs_sht, rng.ListColumns("Customer ID").DataBodyRange, 0)

Dim indexResult As Variant
indexResult = WorksheetFunction.Index(rng.ListColumns("FirstName").DataBodyRange, matchResult)

请注意,如果任何一个函数都找不到所需的内容,则会出现运行时错误。使用On Error处理这种情况:

    On Error GoTo CleanFail

    Dim matchResult As Long
    matchResult = WorksheetFunction.Match(...)

    ...

    Exit Sub

CleanFail:
    MsgBox "Could not find record for '" & cs_sht & "'." & vbNewLine & Err.Description
End Sub

摆脱wf。没有必要复制已经全局的对象的对象引用。使用的全局变量越少越好。

  

如果名字更改,我可以更新表以匹配工作表中的新名称

您不能仅将indexResult分配给新值。 indexResult没有保存对任何单元格的引用,它只是INDEX工作表函数的结果。您需要使用该结果来获取要修改的单元格:

Dim targetCell As Range
Set targetCell = rng.ListColumns("FirstName").DataBodyRange.Cells(indexResult)
targetCell.Value = ws.Range("C_Firstname").Value