【问题标题】:VBA Index Match ErrorVBA 索引匹配错误
【发布时间】:2014-11-14 12:10:27
【问题描述】:

我目前有一个包含大量行/列的评分表(产品名称在左侧,评分者在顶部,评分在此范围内的每个单元格中)。我正在尝试做的是在同一工作簿的另一张工作表上创建仅其中一些行和列的导出/快照。

我正在尝试找出最简单的方法来刷新此工作表上每个单元格中的分数,到目前为止,我已经使用索引/匹配。我想对其进行编码以使这个过程变得简单/自动化。理想情况下,我想匹配产品/列名称,以便我可以更改导出表上的订单、金额等。

我一直在尝试这段代码:

Sub KEY()

Dim Ratings As Range
Set Ratings = Worksheets("EXPORT").Range("B7:R33")
Dim iCell As Range

Worksheets("EXPORT").Activate
For Each iCell In ActiveSheet.Range("B7:R33")
    iCell.Formula = Application.Index(Worksheets("Master Scores").Range(Cells.Find(iCell.Value).EntireColumn), Application.Match(Sheets("EXPORT").Range(Cells(iCell.Row, 1)), Sheets("Master Scores").Range("A1:A500")))
    Next
End Sub

我得到“运行时错误'1004':应用程序定义的或对象定义的错误”

有人可以帮我解决这个问题吗?我以前从未尝试过使用代码来运行带有 VBA 的公式。我已经获得了一个常规的索引匹配来粘贴到每个单元格中,但想要保留我创建的“iCell”变量,以便在有意义的情况下按行/列名称引用。

如果有更好的方法来完成我想要完成的工作,请告诉我 - 我还没有找到。

【问题讨论】:

  • 不用看太多,不是Application.Index,而是Application.WorksheetFunction...
  • 忘了提-我之前将其设置为Application.WorksheetFunction...,然后刚刚将其切换回尝试另一种方式。不过我会把它放回去
  • @JohnBus​​tos - 允许删除 WorksheetFunction 部分,并且可以更容易编码,因为您可以使用 IsError() 检查返回值,而在使用 WorksheetFunction 版本时遇到错误将引发运行时错误,然后必须对其进行处理。
  • 不合格的范围对象。

标签: vba excel indexing match


【解决方案1】:

99% 的 1004 错误是因为您草率地定义了范围对象。

记住,只要您不将范围对象限定为其父 Sheet,编译器将默认假定此范围属于 ActiveSheet。当您试图在另一个工作表上定义一个范围时,当另一个工作表不活动时,这尤其成问题。

例如:如果 Sheet1 处于活动状态,则会引发错误:

Worksheets("Sheet2").Range(Cells(1,1),Cells(1,2))._ANY_METHOD_

你当然认为这是一个潜在的错误:

Worksheets("Master Scores").Range(Cells.Find(iCell.Value).EntireColumn

这将引发错误,因为另一个工作表由以下人员激活:

Worksheets("EXPORT").Activate

有两种方法可以解决这个问题:我推荐的基本方法是繁琐地跟踪哪个工作表是“活动的”并完全限定所有内容。但这是一件让人头疼的事情,并且会导致马虎、难以辨认的代码。另见:

How to avoid using Select in Excel VBA macros

解决此问题的另一种方法是适当限定您的范围。对于简单的情况,您可以使用 With 块:

With Worksheets("Master Scores")
    iCell.Formula = .Range(.Cells.Find(iCell.Value)...

End With

但由于您至少有两个不同的工作表引用,因此这是不可能的。您必须定义一些符合条件的范围变量,并使用这些变量来代替您尝试执行的复杂串联。

Dim INDEX_ARRAY As Range
Dim INDEX_COLUMN As Range
Dim INDEX_ROW As Range

With Worksheets("Master Scores")
    Set INDEX_ARRAY = .Range(.Cells.Find(iCell.Value).EntireColumn))
    Set INDEX_COLUMN = .Range("A1:A500"))
End With

With Worksheets("EXPORT")
    Set INDEX_ROW = .Range(.Cells(iCell.Row,1))
End WIth

然后你可以这样做:

iCell.Formula = Application.Index(INDEX_ARRAY, INDEX_ROW, INDEX_COLUMN)

请注意

您正在公式字符串中使用.Find 方法和.Match 函数。如果其中任何一个导致错误,则整个语句都会出错。我建议您调试这些,考虑单独评估每个部分,检查错误,然后仅在确保不会出错后为 .Formula 构建字符串。

【讨论】:

  • 谢谢你——我终于能够回到这个问题上,你的建议已经死了(更不用说,更容易调试)。
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2015-12-15
  • 2021-08-25
相关资源
最近更新 更多