Excel VBA中引用表的索引匹配

Excel VBA中引用表的索引匹配,excel,vba,match,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_Cus

我想根据另一张工作表中的单元格更新表中的一行,为此,我打算使用索引匹配函数。当我运行下面的代码时,我得到一个错误,它无法获取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

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 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

当wf更改为application.worksheetfunction时,它是否工作?我认为声明应该是
Dim wf作为新的应用程序。worksheetfunction
。您不需要
wf
。只需使用Application.WorksheetFunction
。。。奇怪的是,你得到的错误不是错误91,因为
wf
引用从来没有
Set
(赋值)-但是我认为如果你尝试的话,你不可能
New
创建
WorksheetFunction
类(类似于你不能只
New
创建
工作表
),是的,这是我试图解决的问题,但我没有机会得到一个完整的沙箱,并认为添加新的可能是一个解决办法。我的错。你不需要
wf
,它只是一个无用的全局对象的本地副本。只需使用全局的<代码>带应用程序。工作表功能
<代码>以结尾。我强烈建议将
列表对象
变量重命名为类似于
,或
自定义表
,甚至是
客户
-
rng
看起来非常像是一个
范围
,但事实并非如此。谢谢。当我执行代码时,我收到clean fail错误。在我的特殊情况下,它无法在客户ID列表中找到
106
,但我可以确认它在列表中,并且仍然报告无法获取匹配函数的属性。请注意前导/尾随空格,-哦,这是一个数值。。。不是一串<当您查找
“106”
时,code>匹配将找不到
106
。为
Match
函数提供转换后的值:
Application.Match(CLng(cs_sht),…
我听从了你的建议,但删除了行
Dim indexResult作为Variant indexResult=WorksheetFunction.Index(tbl_cs.ListColumns(“Fornavn”).dataodyrange,matchResult)
并更改了
Set targetCell=tbl_cs.ListColumns(“Fornavn”).DataBodyRange.Cells(indexresult)
设置targetCell=tbl_cs.ListColumns(“Fornavn”).DataBodyRange.Cells(matchResult)
现在可以工作了。谢谢!(我也重命名了我的listobject)