Excel 为什么所有这些变体都使用正确的公式?

Excel 为什么所有这些变体都使用正确的公式?,excel,vba,Excel,Vba,我制作了一个宏,将三个报告合并为一个。 我首先通过查看打开的工作簿找到匹配的名称来找到动态名称 For Each wk In Workbooks If Left(wk.Name, 14) = "PayrollSummary" Then Set wbpay = Workbooks(wk.Name) End If If Left(wk.Name, 12) = "PunchedHours" Then Set

我制作了一个宏,将三个报告合并为一个。 我首先通过查看打开的工作簿找到匹配的名称来找到动态名称

For Each wk In Workbooks
    If Left(wk.Name, 14) = "PayrollSummary" Then
        Set wbpay = Workbooks(wk.Name)
    End If
    If Left(wk.Name, 12) = "PunchedHours" Then
        Set wbpun = Workbooks(wk.Name)
    End If
Next
从一开始,这一行就是它正在处理的报告

ws.Range("K5").Formula = "=IFERROR(VLOOKUP(A5,['" & wbpay.Name & "']payrollsummary!$B:$B,1,FALSE),""Fel"")"
然后那条线开始起作用,这起作用了:

ws.Range("K5").Formula = "=IFERROR(VLOOKUP(A5,[" & wbpay.Name & "]payrollsummary!$B:$B,1,FALSE),""Fel"")"
现在我添加了第三个:

On Error Resume Next
ws.Range("K5").Formula = "=IFERROR(VLOOKUP(A5,['" & wbpay.Name & "']payrollsummary!$B:$B,1,FALSE),""Fel"")"
ws.Range("K5").Formula = "=IFERROR(VLOOKUP(A5,[" & wbpay.Name & "]payrollsummary!$B:$B,1,FALSE),""Fel"")"
ws.Range("K5").Formula = "=IFERROR(VLOOKUP(A5,'[" & wbpay.Name & "]payrollsummary'!$B:$B,1,FALSE),""Fel"")"
On Error GoTo 0
因为今天只有第三条线起作用了。 以下是Excel中公式的示例:

工作簿名称将始终为ParollSummary\u DateFrom\u DateTo\u SomeRandomStuff.xlsx。 看这张图片,我好像不小心下载了两次文件1。 但不管怎样,我仍然不明白为什么三行不同的代码在不同的文件中随机工作。
有没有办法确保它始终有效,这样我就不必在下周找出正确的方法了?

很抱歉在这里发布了答案,但讨论的空间已经不够了。让我们详细看看您的代码

For Each wk In Workbooks
    If Left(wk.Name, 14) = "PayrollSummary" Then
        Set wbpay = Workbooks(wk.Name)
    End If
    If Left(wk.Name, 12) = "PunchedHours" Then
        Set wbpun = Workbooks(wk.Name)
    End If
Next
不清楚为什么应该检查以PayrollSummary开头的工作簿名称是否也以PunchedHours开头。这两者是相互排斥的。当两者都找到时,搜索应停止,当其中一个未找到时,宏的其余部分不应执行。上述任何一种情况都可能发生在您的代码中,从而导致后面的错误。下面的代码不会有刚才描述的错误

Sub Trial()

    Dim WbPay       As Workbook
    Dim WbPun       As Workbook
    
    If GetWorkbook(WbPay, "PayrollSummary") Then
        If Not GetWorkbook(WbPun, "PunchedHours") Then Exit Sub
        
        ' continue your code here
        Debug.Print WbPay.Name
        Debug.Print WbPun.Name
    End If
End Sub

Private Function GetWorkbook(Wb As Workbook, _
                             WbName As String) As Boolean

    For Each Wb In Workbooks
        If InStr(1, Wb.Name, WbName, vbTextCompare) = 1 Then
        GetWorkbook = True
        Exit For
    Next Wb
End Function
现在我们知道剩下的代码不会失败,因为其中一个工作簿没有找到。WbPay和WbPun实际上都存在并且是开放的

这就引出了一个问题,为什么我们需要使用工作表函数来访问它们。既然他们的内容都可以访问,为什么不直接获取呢?但是你想要这个:-

=IFERROR(VLOOKUP(A5,['ParollSummary_DateFrom_DateTo_SomeRandomStuff.xlsx']payrollsummary!$B:$B,1,FALSE),"Fel")
这项要求附有三个问题

公式在哪个工作簿中?请记住,A5位于该工作簿的活动页上。如果输入公式的工作表当时不处于活动状态,会发生什么情况?我不知道,但如果Excel在这种情况下尝试执行公式,则必须发生错误-可能是错误1004。 “ParollSummary\u DateFrom\u DateTo\u SomeRandomStuff.xlsx”应为WbPay.Name。为什么不使用这个定义呢?它将保证引用的工作簿确实存在并处于打开状态。我们不知道“ParollSummary\u DateFrom\u DateTo\u SomeRandomStuff.xlsx”的用法。事实上,这个名字包含一个拼写错误,甚至在这里从您发布的代码中删除。 为什么要从查找数组的第1列返回值?这与A5中的值相同。这并不是说这本身会导致错误,而是增加了普遍的混乱。
因此,结论是你的计划风险高,精确度低。解决方案必须是降低风险和提高精度。

delete On Error Resume Next(错误时删除)然后尝试运行。在这种情况下,前两行将出错,第三行将正常工作。对于你所看到的问题,装腔作势并不是一个非常有用的描述。只有在字符名称中有空格时,才必须在字符之间放置名称/路径。包含1的变量有一个空格…Excel不会创建公式,您是。确切的过程是,您指示VBA编造一个字符串,当指定给Formula属性时,该字符串将由Excel解释为公式。首先,我对每个代码的运行都没有问题。只有我使用这段代码,我知道在运行它之前我需要打开三个报告。当然,我可以在找到这两个之后退出循环,但是我通常只有这三个或者可能还有一个打开的。该公式被写入名为Dagmar Dagab Frukt&Grönt版本2.0 12.xlsx的工作簿中。这次是12,下次可能是13。。。这里也是一个王朝的名字。代码从外接程序运行,代码开头首先确保此工作簿处于活动状态,然后再执行其他操作。你的2:我就是这么做的。看看VBAcode。ws.RangeK5.Formula==iferrovlookupa5,[&wbpay.Name&]payrollsummary'$B:$B,1,FALSE,Fel,其中wbpay引用的工作簿的变量名在上面几行中找到。这里是达格玛。。。。12档案。3因为这样我可以知道这一行的值是用wbpay还是wbpun链接的。如果Vlookup在wbpay中失败,那么该值必须存在于wbpun中。抱歉!显然,在评估您的问题时,我是在看您代码的工作副本,而不是原件。我的方法是基于对使用VBA编写工作表函数的固有不信任。你试图写的函数很复杂,你的经历加深了我的不信任。我会寻找一个解决方案,不涉及编写Excel在特定情况下难以接受的公式。