Excel VBA中引用表的索引匹配
我想根据另一张工作表中的单元格更新表中的一行,为此,我打算使用索引匹配函数。当我运行下面的代码时,我得到一个错误,它无法获取match函数类的属性。 这方面的正确语法是什么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
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)