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

我有一些以下的代码。 这是“运行时错误'1004'方法'范围'的对象'_Worksheet'失败”。 我可以通过使用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 

如果您没有为每个单元格/范围参考指定一个工作表,那么代码将假定应用活动工作表,因此您的范围可能会覆盖两个工作表,因此会出现错误。 您可以使用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)"