Excel中的VBA-更改列中的VLOOKUP公式以基于静态单元格值插入图纸名称
我有一个包含多张工作表的工作簿,新工作表将定期添加,标题为[mmm yy]格式。在我的主工作表(“联系人列表”)中,我有一个IF公式,三列中有一个“嵌套”的VLOOKUP公式,用于从相应的工作表中提取相应的数字,我还有一个单元格,其中的日期格式为我想要的格式。我希望我的脚本查看包含日期的单元格,并使用该单元格的值更新VLOOKUP公式的列以匹配该值。例如,在2月份,我的主工作表上的单元格将显示“2月20日”,因此我的VLOOKUP公式将显示在标题为“2月20日”的工作表中。在三月份,该单元格将更新,我希望我的脚本(最好是自动的,但绑定到一个按钮是可以的)更新所有的VLOOKUP函数,现在可以在“Mar 20”表中查看 我觉得我已经尝试了一百万件事情,不断地出现各种各样的错误,但我现在只是被卡住了。我最近的尝试是将公式的各个部分设置为变量,然后将其他变量设置为一起解析的那些部分Excel中的VBA-更改列中的VLOOKUP公式以基于静态单元格值插入图纸名称,excel,vba,vlookup,Excel,Vba,Vlookup,我有一个包含多张工作表的工作簿,新工作表将定期添加,标题为[mmm yy]格式。在我的主工作表(“联系人列表”)中,我有一个IF公式,三列中有一个“嵌套”的VLOOKUP公式,用于从相应的工作表中提取相应的数字,我还有一个单元格,其中的日期格式为我想要的格式。我希望我的脚本查看包含日期的单元格,并使用该单元格的值更新VLOOKUP公式的列以匹配该值。例如,在2月份,我的主工作表上的单元格将显示“2月20日”,因此我的VLOOKUP公式将显示在标题为“2月20日”的工作表中。在三月份,该单元格将更
Sub Update_Counts()
Dim rng As Range
Dim cellnum As Integer
Dim curr As Object
Dim v1 As String, v2 As String, v3 As String, v4 As String, v5a As String, v5b As String, v5c As String
Dim v6a As String, v6b As String, v6c As String, strFormC As String, strFormMR As String, strFormMD As String
v1 = "=IF(VLOOKUP("
v2 = Cells(cell.Row, "A")
v3 = ",'"
v4 = Cells(1, 6).Value
v5a = "'!B7:F50, 2, FALSE) = 0, 'EMPTY', VLOOKUP("
v5b = "'!B7:F50, 3, FALSE) = 0, 'EMPTY', VLOOKUP("
v5c = "'!B7:F50, 4, FALSE) = 0, 'EMPTY', VLOOKUP("
v6a = "'!B7:F50, 2, FALSE))"
v6b = "'!B7:F50, 3, FALSE))"
v6c = "'!B7:F50, 4, FALSE))"
strFormC = v1 & v2 & v3 & v4 & v5a & v2 & v3 & v4 & v6a
strFormMR = v1 & v2 & v3 & v4 & v5b & v2 & v3 & v4 & v6b
strFormMD = v1 & v2 & v3 & v4 & v5c & v2 & v3 & v4 & v6c
Set curr = Worksheets("ContactList").Cells(cellnum, 6)
Set rng = Sheets("ContactList").Range("F3:H55")
For cellnum = 3 To 55
If Cells(2, 6).Value = "Commercial Total" Then
curr.Value = strFormC
ElseIf Cells(2, 7).Value = "Medicare" Then
curr.Value = strFormMR
ElseIf Cells(2, 8).Value = "Medicaid" Then
curr.Value = strFormMD
End If
Next cellnum
End Sub
这就是我到目前为止所做的。我当前收到“运行时错误'424';需要对象”。我原以为将
curr
作为一个对象可以让我度过难关,但我认为我的cellnum
值是For
语句的“需要成为对象”部分。但是,我不知道如何在没有设置的情况下获取单元格值。我尝试了一个“For Each”循环,但也遇到了很多问题。我找不到任何人想要通过包含单元格值来更新其单元格公式的例子,但也许我找的地方不对。任何建议都将不胜感激 正如我在评论中所说,您不需要使用VBA来实现这一点
如果我正确阅读了您的代码,我认为您只需要在单元格A3中使用以下公式并将其复制下来:
=IF(VLOOKUP($A3,INDIRECT("'"&$F$1&"'!B7:F50"),IF($F$2="Commercial Total",2,IF($G$2="Medicare",3,IF($H$2="Medicaid",4,1))),FALSE)=0,"EMPTY",VLOOKUP($A3,INDIRECT("'"&$F$1&"'!B7:F50"),IF($F$2="Commercial Total",2,IF($G$2="Medicare",3,IF($H$2="Medicaid",4,1))),FALSE))
这是基于我在阅读您的代码时所做的假设:
单元格F1包含要从中获取数据的工作表的名称
其中一个单元格F2、G2和H2将分别包含关键字Commercial Total、Medicare和Medicaid
如果您需要一些代码,我将这样灵活地构建查找:
Sub Update_Counts()
Dim rng As Range
With Sheets("ContactList")
Set rng = .Range("F3:F55")
lookupformula = "=IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F50,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F50,<colnum>,FALSE))"
For Each c In rng.Cells
sheetname = .Cells(1, 6).Value
thisrow = c.Row
If .Cells(2, 6).Value = "Commercial Total" Then
colnum = 2
ElseIf .Cells(2, 7).Value = "Medicare" Then
colnum = 3
ElseIf .Cells(2, 8).Value = "Medicaid" Then
colnum = 4
End If
finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
c.Formula = finalformula
Next
End With
End Sub
子更新_计数()
变暗rng As范围
带工作表(“联系人列表”)
设置rng=.Range(“F3:F55”)
lookupformula=“=IF(VLOOKUP(A)”,!B7:F50,FALSE)=0,“空”,VLOOKUP(A,,!B7:F50,FALSE))“
对于每个c In rng.单元格
sheetname=.Cells(1,6).Value
thisrow=c.行
如果.Cells(2,6).Value=“商业总计”,则
colnum=2
ElseIf.Cells(2,7).Value=“Medicare”然后
colnum=3
ElseIf.Cells(2,8).Value=“Medicaid”然后
colnum=4
如果结束
finalformula=Replace(Replace(Replace(lookupformula,”,thisrow),“”,sheetname),“”,colnum)
c、 公式=最终公式
下一个
以
端接头
我从@CLR的答案中找到了答案,谢谢!我很费劲,因为我计算出了日期值来阻止脚本尝试导入新文档,但是If/ElseIf标准变得有点混乱。由于所有的标题都一直存在,它输入了最后一个条件,这意味着我得到了所有三列的第3列数据。我相信有一种更简洁的方法可以做到这一点,但至少对我来说,我很高兴将这三个功能分开,并让一个按钮同时运行这三个功能
Private Sub CommandButton1_Click()
Update_Counts_COM
Update_Counts_MR
Update_Counts_MD
End Sub
Sub Update_Counts_COM()
Dim rng As Range
With Sheets("ContactList")
Set rng = .Range("F3:F21,F24:F27,F30:F51")
lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"
For Each c In rng.Cells
sheetname = .Cells(1, 6).Value
thisrow = c.Row
If .Cells(2, 6).Value = "Commercial Total" Then
colnum = 2
End If
finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
c.Formula = finalformula
Next
End With
End Sub
Sub Update_Counts_MR()
Dim rng As Range
With Sheets("ContactList")
Set rng = .Range("G3:G21,G24:G27,G30:G51")
lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"
For Each c In rng.Cells
sheetname = .Cells(1, 6).Value
thisrow = c.Row
If .Cells(2, 7).Value = "Medicare" Then
colnum = 3
End If
finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
c.Formula = finalformula
Next
End With
End Sub
Sub Update_Counts_MD()
Dim rng As Range
With Sheets("ContactList")
Set rng = .Range("H3:H21,H24:H27,H30:H51")
lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"
For Each c In rng.Cells
sheetname = .Cells(1, 6).Value
thisrow = c.Row
If .Cells(2, 8).Value = "Medicaid" Then
colnum = 4
End If
finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
c.Formula = finalformula
Next
End With
End Sub
Private子命令按钮1\u单击()
更新\u计数\u COM
更新\u计数\u先生
更新\u计数\u MD
端接头
子更新\u计数\u COM()
变暗rng As范围
带工作表(“联系人列表”)
设置rng=.Range(“F3:F21、F24:F27、F30:F51”)
lookupformula=“=IFERROR(如果(VLOOKUP(A),!B7:F59,FALSE)=0”,“空”,VLOOKUP(A,,!B7:F59,FALSE)),“未找到”)
对于每个c In rng.单元格
sheetname=.Cells(1,6).Value
thisrow=c.行
如果.Cells(2,6).Value=“商业总计”,则
colnum=2
如果结束
finalformula=Replace(Replace(Replace(lookupformula,”,thisrow),“”,sheetname),“”,colnum)
c、 公式=最终公式
下一个
以
端接头
子更新\u计数\u MR()
变暗rng As范围
带工作表(“联系人列表”)
设置rng=.范围(“G3:G21、G24:G27、G30:G51”)
lookupformula=“=IFERROR(如果(VLOOKUP(A),!B7:F59,FALSE)=0”,“空”,VLOOKUP(A,,!B7:F59,FALSE)),“未找到”)
对于每个c In rng.单元格
sheetname=.Cells(1,6).Value
thisrow=c.行
如果.Cells(2,7).Value=“Medicare”,则
colnum=3
如果结束
finalformula=Replace(Replace(Replace(lookupformula,”,thisrow),“”,sheetname),“”,colnum)
c、 公式=最终公式
下一个
以
端接头
子更新\u计数\u MD()
变暗rng As范围
带工作表(“联系人列表”)
设置rng=.Range(“H3:H21、H24:H27、H30:H51”)
lookupformula=“=IFERROR(如果(VLOOKUP(A),!B7:F59,FALSE)=0”,“空”,VLOOKUP(A,,!B7:F59,FALSE)),“未找到”)
对于每个c In rng.单元格
sheetname=.Cells(1,6).Value
thisrow=c.行
如果.Cells(2,8).Value=“Medicaid”,则
colnum=4
如果结束
finalformula=Replace(Replace(Replace(lookupformula,”,thisrow),“”,sheetname),“”,colnum)
c、 公式=最终公式
下一个
以
端接头
这就是我最终的工作!谢谢大家:)哪一行抛出了错误?
v2=Cells(cell.Row,“A”)
-我猜<代码>单元格没有在任何地方设置或定义。我认为您根本不需要VBA来实现这一点。您可以使用INDIRECT
引用以单元格值命名的工作表。@Bi