我绞尽脑汁想弄清楚为什么我会收到错误 1004。我有一个带有唯一标识符的工作表,我需要在另一个工作表中找到它,然后在该行的不同列中返回一个值,它似乎是 WorksheetFunction.Index+Match。我需要的数据偏移一列(因此是 Count_2 - 1)。我已经声明了变量,甚至解锁了表格以防万一。我知道我可以在 excel 中使用索引匹配,但我正在尝试使用 vba 进行所有计算,这样最终用户就不会搞砸任何事情,这样更容易看到工作簿实际在做什么。有任何想法吗?
另外,我一直将其设置为将数字打印到特定单元格,以便我可以更轻松地查看代码在哪里死亡。
For Count_1 = 2 to 51
For Count_2 = 4 To 44
Sheet8.Cells(Count_1, Count_2) = WorksheetFunction.Index(Sheet7.Range(Cells(47, Count_2 -1), _
Cells(904, Count_2 - 1)), WorksheetFunction.Match(Sheet8.Cells(Count_1, 1).Value, _
Sheet7.Range("A47:A904"), 0))
Count_3 = Count_3 + 1
Sheet1.Range("D1") = 2
Next
Next
最佳答案
Cells(47, …
与 Sheet7.Range
不引用同一工作表您必须为每个 Cells
指定一个工作表也反对。喜欢:…Sheet7.Range(Sheet7.Cells(47, …
WorksheetFunction.Match
如果没有任何东西会抛出错误。所以你需要捕获那个案例并决定在没有匹配的情况下该怎么做。 Option Explicit
: 在 VBA 编辑器中转到工具 › 选项 › Require Variable Declaration并正确声明所有变量。 Count_1
和 Count_2
非常糟糕,因为很快就会混淆。而是始终使用有意义的变量名称,例如 iRow
和 iColumn
. 所以你最终会得到类似的东西:
Option Explicit
Public Sub Example()
Dim CellsProcedured As Long
Dim iRow As Long
For iRow = 2 To 51
Dim iColumn As Long
For iColumn = 4 To 44
Dim MatchResult As Double
On Error GoTo NO_MATCH
MatchResult = Application.WorksheetFunction.Match(Sheet8.Cells(iRow, 1).Value, Sheet7.Range("A47:A904"), 0)
On Error GoTo 0
On Error GoTo NO_INDEX
Sheet8.Cells(iRow, iColumn) = Application.WorksheetFunction.Index(Sheet7.Range(Sheet7.Cells(47, iColumn - 1), Sheet7.Cells(904, iColumn - 1)), MatchResult)
On Error GoTo 0
CellsProcedured = CellsProcedured + 1
Sheet1.Range("D1") = 2
Next iColumn
Next iRow
Exit Sub
NO_MATCH:
MsgBox "The value '" & Sheet8.Cells(iRow, 1).Value & "' was not found in Range A47:A904. Aborting."
Exit Sub
NO_INDEX:
MsgBox "Index failed at cell(" & iRow & ", " & iColumn & "). Aborting."
End Sub
关于excel - 获取应用程序定义或用户定义的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59666780/