Offest和FillDown:运行时错误' 1004'方法'范围'对象' _Worksheet'失败

时间:2017-11-03 14:32:00

标签: excel vba excel-vba

我在下面有一些代码。这就是"运行时错误' 1004'方法'范围'对象' _Worksheet'失败&#34 ;.我可以通过使用ws.Activate方法来实现这一点(参见第二块),但我想理解为什么这不起作用。

仅发生故障:  1)在带有.FillDown的行上  2)当代码在非活动工作表上运行时。

Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)

ws1.Range("D2").Formula = "=CONCATENATE(B2,"" "", C2)"
ws1.Range("D2", Range("C2").End(xlDown).Offset(0, 1)).FillDown

ws2.Range("D2").Formula = "=MID(C2, 3, 6)"
ws2.Range("D2", Range("C2").End(xlDown).Offset(0, 1)).FillDown



'''This code works.

Worksheets(1).Activate

Range("D2").Formula = "=CONCATENATE(B2,"" "", C2)"
Range("D2", Range("C2").End(xlDown).Offset(0, 1)).FillDown

Worksheets(2).Activate

Range("D2").Formula = "=MID(C2, 3, 6)"
Range("D2", Range("C2").End(xlDown).Offset(0, 1)).FillDown

1 个答案:

答案 0 :(得分:1)

如果您没有为每个单元格/范围引用指定工作表,则代码将假定活动工作表适用,因此您的范围可能会覆盖两张,因此错误。您可以使用With语句 - 记下范围参考前面的点,然后您不需要激活任何工作表。

With ws1
    .Range("D2").Formula = "=CONCATENATE(B2,"" "", C2)"
    .Range("D2", .Range("C2").End(xlDown).Offset(0, 1)).FillDown
End With

With ws2
    .Range("D2").Formula = "=MID(C2, 3, 6)"
    .Range("D2", .Range("C2").End(xlDown).Offset(0, 1)).FillDown
End With

您的代码也可以缩短为例如。

ws1.Range("C2", ws1.Range("C2").End(xlDown)).offset(,1).Formula = "=CONCATENATE(B2,"" "", C2)"