VBA索引匹配错误

我目前有一个记分单,其中有大量的行/列(产品名称在左边,记分员在最上面,分数在这个范围内的每个单元格中)。 我想要做的是在同一工作簿中的另一个工作表上创build一个只有几个这些行和列的导出/快照。

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

我一直在试这个代码:

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':应用程序定义的或对象定义的错误”

有人可以帮我解决这个问题吗? 我从来没有尝试过使用代码来运行公式W / VBA。 我已经得到了一个常规的索引匹配来粘贴到每个单元格,但是想保留我创build的“iCell”variables,所以我可以通过行/列名引用,如果这是有道理的。

如果有更好的方法去做我想做的事,请让我知道 – 我只是还没有find一个。

994%的时间1004错误是因为你有斜坡定义的范围对象。

记住 ,只要你没有限定一个范围对象到它的父页面,编译器将默认假设这个范围属于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 

有两种方法可以解决这个问题:我推荐的基本方法是单调地logging哪个表是“主动”,并且完全符合所有条件。 但是,这是一个痛苦的屁股,使马虎,难以辨认的代码。 也可以看看:

如何避免在Excel VBAmacros中使用select

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

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

但是由于您至less有两个不同的工作表参考,这是不可能的。 您必须定义一些合格的范围variables,并使用这些variables代替您正在尝试执行的复杂级联。

 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) 

还要注意

您正在公式string中使用.Find方法和.Match函数。 如果其中任何一个出现错误,整个语句将会出错。 我build议你debugging那些,考虑分别评估每一块,检查错误,然后build立.Formulastring,只有当你确保它不会出错。