更改为单元格时产生运行时错误 1004 的范围
Range producing runtime error 1004 when changed to cells
当我将范围从字母更改为单元格时,以下部分开始产生运行时错误 1004:
有字母:
Application.SumIf(Sheets(4).Range("E:P"), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range("K:K"))
没有字母:
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11)))
它是更大循环的一部分:
intLstRowA = Sheets(4).Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To 9
Sheets(6).Cells(i, 2) = _
Format( _
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11))) _
/ _
Application.SumIf(Sheets(4).Range("E:P"), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range("P:P")) * 0.01, _
"Percent")
Next i
我从不使用 .Select、.Active 等,我无法弄清楚是什么导致了错误。你能帮我检查一下吗?
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16))
只有在 Sheets(4)
是 ActiveSheet
时才有效。
这是因为 Cells(1,5)
没有说明是指谁的单元格。所以ActiveSheet的单元格是可信的。
Sheets(4).Range(Sheets(4).Cells(1, 5), Sheets(4).Cells(intLstRowA, 16))
会起作用。
但你最好使用 With
:
With ActiveWorkbook.Sheets(4)
...
... .Range(.Cells(1, 5), .Cells(intLstRowA, 16))...
...
End With
这可能是因为您没有正确地限定您的 Cells
属性 通话。如果您不符合条件,它会假设您指的是当前活跃的 sheet。
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11)))
' ^^^^^ ^^^^^
这些细胞在什么 sheet 上?这么明确地说:
' vvvvvvvvvvvvvvv vvvvvvvvvvvvvvv
Application.SumIf( _
Sheets(4).Range(Sheets(4).Cells(1, 5), Sheets(4).Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Sheets(4).Cells(1, 11), Sheets(4).Cells(intLstRowA, 11)))
' ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
如果 sheet 不同于 Sheet(4)
恰好处于活动状态,前一种情况会给你一个错误,因为它会在 sheet 中定义一个范围,其角由另一个单元格定义 sheet — 显然是荒谬的。
当我将范围从字母更改为单元格时,以下部分开始产生运行时错误 1004:
有字母:
Application.SumIf(Sheets(4).Range("E:P"), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range("K:K"))
没有字母:
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11)))
它是更大循环的一部分:
intLstRowA = Sheets(4).Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To 9
Sheets(6).Cells(i, 2) = _
Format( _
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11))) _
/ _
Application.SumIf(Sheets(4).Range("E:P"), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range("P:P")) * 0.01, _
"Percent")
Next i
我从不使用 .Select、.Active 等,我无法弄清楚是什么导致了错误。你能帮我检查一下吗?
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16))
只有在 Sheets(4)
是 ActiveSheet
时才有效。
这是因为 Cells(1,5)
没有说明是指谁的单元格。所以ActiveSheet的单元格是可信的。
Sheets(4).Range(Sheets(4).Cells(1, 5), Sheets(4).Cells(intLstRowA, 16))
会起作用。
但你最好使用 With
:
With ActiveWorkbook.Sheets(4)
...
... .Range(.Cells(1, 5), .Cells(intLstRowA, 16))...
...
End With
这可能是因为您没有正确地限定您的 Cells
属性 通话。如果您不符合条件,它会假设您指的是当前活跃的 sheet。
Application.SumIf( _
Sheets(4).Range(Cells(1, 5), Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Cells(1, 11), Cells(intLstRowA, 11)))
' ^^^^^ ^^^^^
这些细胞在什么 sheet 上?这么明确地说:
' vvvvvvvvvvvvvvv vvvvvvvvvvvvvvv
Application.SumIf( _
Sheets(4).Range(Sheets(4).Cells(1, 5), Sheets(4).Cells(intLstRowA, 16)), _
Sheets(6).Cells(i, 1).Value2, _
Sheets(4).Range(Sheets(4).Cells(1, 11), Sheets(4).Cells(intLstRowA, 11)))
' ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
如果 sheet 不同于 Sheet(4)
恰好处于活动状态,前一种情况会给你一个错误,因为它会在 sheet 中定义一个范围,其角由另一个单元格定义 sheet — 显然是荒谬的。