【问题标题】:Excel VBA - Evaluate and index function returning #VALUE! errorExcel VBA - 评估和索引函数返回#VALUE!错误
【发布时间】:2017-08-25 12:35:08
【问题描述】:

所以我有一个宏用于包含三列的文件。该宏为我的三列文件检测另一个工作簿中的特定列和行。工作簿 1 见下图。

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

仅供参考 - 列继续为 51,但无法放入图像

下面是这个宏的代码:

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

有什么帮助吗?谢谢。

【问题讨论】:

  • 运行时两个工作簿都打开了吗?
  • @ScottCraner 是的,是它造成的问题吗?
  • 否,如果两者都打开。这对某些人有效,但对其他人无效?
  • @ScottCraner 是的,如果工作簿 1 中的列大小与工作簿 2 中的行和列大小大致相同,则它可以工作。但是如果工作簿 1 的列大小远小于行和工作簿 2 的列大小,似乎出现了此错误。
  • 您的数据与上一个问题略有不同,所以我有两个问题。 C总是数字吗?并且,在这里你的前三行是相同的 A 和 B 你会把 c 中的数字相加并返回9

标签: excel vba indexing evaluate


【解决方案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 = 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

【讨论】:

  • 为了以后参考,请问是什么原因造成的问题?
  • 第一个公式是为了覆盖所有的碱基而编写的,无论是数字还是文本,它都会返回第一个匹配项。 C 始终是数字,SUMIF 更快,开销更少。另一个公式是数组类型的公式,使用了很多开销。引用大型数据集时,它基本上会短路。上次我应该问关于 C 是数字的问题。对不起。
  • 最后一件事是可以为代码查看的区域设置一个范围。而不是扫描下面的所有内容,因为如果在扫描区域下方的工作簿 2 中再次看到工作簿 1 中 A 列的任何文本,它似乎会覆盖值?
  • 这样它查看的行数是固定的。
  • 您可以将 Lastrow 更改为固定行:LastRow = 500 和 for 循环以在特定行和列结束,将两行中 To 之后的所有内容替换为各自的行号和列号.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多