当更改为单元格时,范围产生运行时错误1004

时间:2015-04-09 06:36:32

标签: excel vba range runtime-error

当我将字母范围从字母更改为单元格时,下面的部分开始产生运行时错误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等,我无法弄清楚导致错误的原因。你能帮我健康检查吗?

2 个答案:

答案 0 :(得分:2)

这可能是因为您未正确认证Cells财产电话。如果您不符合资格,则会假定您指的是当前有效的工作表。

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)))
'                   ^^^^^         ^^^^^

这些细胞是什么样的?如此明确地说:

'                   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(4)不同的工作表恰好处于活动状态,则前一种情况会给您一个错误,因为它会在一张工作表中定义一个范围,其范围由另一张工作表上的单元格定义 - 显然是荒谬的

答案 1 :(得分:1)

仅当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