Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel中的VBA-更改列中的VLOOKUP公式以基于静态单元格值插入图纸名称_Excel_Vba_Vlookup - Fatal编程技术网

Excel中的VBA-更改列中的VLOOKUP公式以基于静态单元格值插入图纸名称

Excel中的VBA-更改列中的VLOOKUP公式以基于静态单元格值插入图纸名称,excel,vba,vlookup,Excel,Vba,Vlookup,我有一个包含多张工作表的工作簿,新工作表将定期添加,标题为[mmm yy]格式。在我的主工作表(“联系人列表”)中,我有一个IF公式,三列中有一个“嵌套”的VLOOKUP公式,用于从相应的工作表中提取相应的数字,我还有一个单元格,其中的日期格式为我想要的格式。我希望我的脚本查看包含日期的单元格,并使用该单元格的值更新VLOOKUP公式的列以匹配该值。例如,在2月份,我的主工作表上的单元格将显示“2月20日”,因此我的VLOOKUP公式将显示在标题为“2月20日”的工作表中。在三月份,该单元格将更

我有一个包含多张工作表的工作簿,新工作表将定期添加,标题为[mmm yy]格式。在我的主工作表(“联系人列表”)中,我有一个IF公式,三列中有一个“嵌套”的VLOOKUP公式,用于从相应的工作表中提取相应的数字,我还有一个单元格,其中的日期格式为我想要的格式。我希望我的脚本查看包含日期的单元格,并使用该单元格的值更新VLOOKUP公式的列以匹配该值。例如,在2月份,我的主工作表上的单元格将显示“2月20日”,因此我的VLOOKUP公式将显示在标题为“2月20日”的工作表中。在三月份,该单元格将更新,我希望我的脚本(最好是自动的,但绑定到一个按钮是可以的)更新所有的VLOOKUP函数,现在可以在“Mar 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