Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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-评估和索引函数返回#值!错误_Excel_Vba_Indexing_Evaluate - Fatal编程技术网

Excel VBA-评估和索引函数返回#值!错误

Excel VBA-评估和索引函数返回#值!错误,excel,vba,indexing,evaluate,Excel,Vba,Indexing,Evaluate,所以我有一个宏用于一个文件,其中有三列。宏将检测其他工作簿中我的三列文件的特定列和行。工作簿1请参见下图 然后,它应该查看工作簿2的行和列(见下文),找到与工作簿1匹配的A列和B列的位置,并将C列的相应值粘贴到工作簿2中(值1)。然而,我一直在得到#价值!错误,我不知道为什么会发生 仅供参考-列继续显示,但无法放入图像中 以下是此宏的代码: Sub Location() Dim i As Long, k As Long, ws1 As Worksheet, ws2 As Worksh

所以我有一个宏用于一个文件,其中有三列。宏将检测其他工作簿中我的三列文件的特定列和行。工作簿1请参见下图

然后,它应该查看工作簿2的行和列(见下文),找到与工作簿1匹配的A列和B列的位置,并将C列的相应值粘贴到工作簿2中(值1)。然而,我一直在得到#价值!错误,我不知道为什么会发生

仅供参考-列继续显示,但无法放入图像中

以下是此宏的代码:

Sub Location()
    Dim i As Long, k As Long, ws1 As Worksheet, ws2 As Worksheet
    Dim lastrow As Long

    Set ws1 = Workbooks("Book3.xlsm").Worksheets("Sheet1")
    Set ws2 = Workbooks("Book4.xlsm").Worksheets("Sheet1")
    lastrow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
    For i = 2 To ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
        For k = 2 To ws2.Cells(1, ws2.Columns.Count).End(xlToLeft).Column
            ws2.Cells(i, k).Value = ws2.Evaluate("IFERROR(INDEX(" & ws1.Range("B1:B" & lastrow).Address(0, 0, xlA1, 1) & ",AGGREGATE(15,6,ROW(" & ws1.Range("A1:A" & lastrow).Address(0, 0, xlA1, 1) & ")" & _
            "/((" & ws1.Range("A1:A" & lastrow).Address(0, 0, xlA1, 1) & " = " & ws2.Cells(i, 1).Address(0, 0) & ")*(" & ws1.Range("C1:C" & lastrow).Address(0, 0, xlA1, 1) & "=" & _
            ws2.Cells(1, k).Address(0, 0) & ")),1)),"""")")
        Next k
    Next i

End Sub

有什么帮助吗?谢谢。

我应该先想到这个公式:

Sub Location()
    Dim i As Long, k As Long, ws1 As Worksheet, ws2 As Worksheet
    Dim LastRow As Long

    Set ws1 = Workbooks("Book3.xlsm").Worksheets("Sheet1")
    Set ws2 = Workbooks("Book4.xlsm").Worksheets("Sheet1")
    LastRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
    For i = 2 To ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
        For k = 2 To ws2.Cells(1, ws2.Columns.Count).End(xlToLeft).Column
            ws2.Cells(i, k).Value = Application.WorksheetFunction.SumIfs(ws1.Range("C1:C" & LastRow), ws1.Range("A1:A" & LastRow), ws2.Cells(i, 1), ws1.Range("B1:B" & LastRow), ws2.Cells(1, k))
            If ws2.Cells(i, k).Value = 0 Then ws2.Cells(i, k).Value = ""
        Next k
    Next i

End Sub

运行时两个工作簿都打开了吗?@ScottCraner是的,它们都打开了,这是问题的原因吗?不,如果两者都打开了。这在某些情况下有效,但在其他情况下无效?@ScottCraner是的,如果工作簿1中的列大小与工作簿2中的行和列大小大致相同,则有效。但是,如果工作簿1的列大小远小于工作簿2的行和列大小,则可能会出现此错误。您的数据与上一个问题略有不同,因此我有两个问题。C总是数字吗?这里的前三行是相同的A和B,请将c中的数字相加,然后返回
9
?供将来参考,我可以问一下问题的原因吗?第一个公式是为覆盖所有基数而编写的,它将返回第一个匹配项,无论是数字还是文本。由于C总是数字,SUMIF速度更快,开销更小。另一个公式是数组类型的公式,使用了大量开销。它在引用大型数据集时基本上会短路。上次我应该问关于C是数字的问题。抱歉。最后一件事是可以为代码查看的区域设置范围。而不是扫描下面的所有内容,因为如果工作簿1中A列中的任何文本在工作簿2中扫描区域下方再次出现,则会覆盖值?这样,它查看的行数是固定的。您可以将Lastrow更改为固定行:
Lastrow=500
,for循环以特定行结束,并且列将两行中
后的所有内容替换为各自的行号和列号。