VBA索引匹配错误

时间:2014-09-19 20:09:39

标签: excel vba excel-vba indexing match

我目前有一张包含大量行/列的分数表(产品名称在左侧,记分员在顶部,分数在此范围内的每个单元格中)。我要做的是创建一个只有少数几行的导出/快照。同一工作簿中另一个工作表上的列。

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

我一直在尝试这段代码:

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”变量,所以如果有意义的话,我可以按行/列名称引用。

如果有更好的方法来做我想要完成的事情,请告诉我 - 我还没有找到一个。

1 个答案:

答案 0 :(得分:2)

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构建字符串。