我想基于另一个工作表中的单元格更新表中的一行,为此,我打算使用索引匹配功能。当我运行下面的代码时,出现错误,提示它无法获取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
答案 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