我目前有一张包含大量行/列的分数表(产品名称在左侧,记分员在顶部,分数在此范围内的每个单元格中)。我要做的是创建一个只有少数几行的导出/快照。同一工作簿中另一个工作表上的列。
我正在尝试找出刷新此工作表中每个单元格中得分的最简单方法,到目前为止已经使用了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”变量,所以如果有意义的话,我可以按行/列名称引用。
如果有更好的方法来做我想要完成的事情,请告诉我 - 我还没有找到一个。
答案 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
构建字符串。