VBA将单元格从工作表复制到新的错误1004

看来我有两行有问题的代码。 没有他们,代码可以运行良好,包括他们,我会得到一个运行时错误'1004'应用程序定义或对象定义的错误。

我基本上想要做的就是发送一个命令,从工作簿C的条件复制一个单元格的范围从工作簿A工作簿B,我的代码如下:

请看我标记的两条有问题的线。 这对我来说看起来非常好,但VBA不会执行它。 任何人都可以向我解释为什么这样吗?

我似乎碰到类似的问题,只要我搞乱了很多的工作簿,所以我想这是一个普遍的问题,当我处理多个工作簿,并不仅限于复制单元格…

Sub TrySaveAs() Dim wkb0 As Workbook Set wkb0 = ThisWorkbook Dim wkb1 As Workbook Dim wkb2 As Workbook Dim i As Integer i = 2 Do Until IsEmpty(wkb0.Worksheets("Sheet2").Cells(i, 1)) Dim full_path As String full_path = C:\something\something.xlsx Set wkb1 = Workbooks.Open(Filename:=somename) wkb1.SaveAs Filename:=full_path Set wkb2 = Workbooks.Open(Filename:=someothername) Dim last_row As Integer last_row = wkb2.Worksheets("RAW").Range("A1").End(xlDown).Row wkb2.Worksheets("RAW").Range(Cells(1, 1), Cells(last_row, 5)).Copy <--------problematic wkb1.Worksheets("Sheet1").Range(Cells(1, 1), Cells(last_row, 5)).Paste <--------problematic wkb2.Close SaveChanges:=False wkb1.Close SaveChanges:=True i = i + 1 Loop End Sub 

你可以做

wkb2.Worksheets("RAW").Range(Cells(1, 1).Address & ":" & Cells(last_row, 5).Address).Copy

wkb1.Worksheets("Sheet1").Range(Cells(1, 1).Address & ":" & Cells(last_row, 5).Address).PasteSpecial

编辑

为了更好地理解为什么看这个,与评论

 Sub hello() Dim rr1 As Range Dim rr2, rr3 As Range Debug.Print Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(3, 3)).Address(External:=False) Set rr1 = Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(3, 3)) Debug.Print rr1.Parent.Name & "'!" & rr1.Address(External:=False) MsgBox rr1.Parent.Name & "'!" & rr1.Address(External:=False) 'notice it says "Sheet1'!$A$1:$C$3 Worksheets(2).Activate Set rr2 = Cells(1, 1) 'if we dont qualify Cells, with a range object, it defaults to cells of ActiveSheet Set rr3 = Cells(3, 3) Debug.Print Range(rr2, rr3).Parent.Name & "'!" & Range(rr2, rr3).Address(External:=False) MsgBox Range(rr2, rr3).Parent.Name & "'!" & Range(rr2, rr3).Address(External:=False) 'notice it says "Sheet2'!$A$1:$C$3, because that is the current ActiveSheet Worksheets(3).Activate Set rr2 = Cells(1, 1) 'if we dont qualify Cells with a range object, it defaults to cells of ActiveSheet Set rr3 = Cells(3, 3) Debug.Print Range(rr2, rr3).Parent.Name & "'!" & Range(rr2, rr3).Address(External:=False) MsgBox Range(rr2, rr3).Parent.Name & "'!" & Range(rr2, rr3).Address(External:=False) 'notice it says "Sheet3'!$A$1:$C$3, because that is the current ActiveSheet On Error GoTo theError Debug.Print Worksheets(1).Range(rr1, rr2).Address MsgBox Worksheets(1).Range(rr1, rr2).Address theError: Debug.Print "Error because ranges rr1 and rr2 are cells of Worksheet(3), not Worksheet(1)" Debug.Print Range(Cells(1, 1), Cells(3, 3)).Parent.Name & "'!" & _ Range(Cells(1, 1), Cells(3, 3)).Address(External:=False) MsgBox Range(Cells(1, 1), Cells(3, 3)).Parent.Name & "'!" & _ Range(Cells(1, 1), Cells(3, 3)).Address(External:=False) 'notice it says "Sheet3'!$A$1:$C$3, because that is the current ActiveSheet 'Moral of story you cannot do Worksheets(1).range(cells(a,b),cells(c,d)) because 'cannot guarantee Cells refer to Worksheet(1) 'If you really want to refer to unqualified Cells, one way is to mimic the Excel 'range syntax by grabbing the cell address Debug.Print Worksheets(1).Range(Cells(1, 1).Address & ":" & Cells(3, 3).Address).Parent.Name & "'!" & _ Worksheets(1).Range(Cells(1, 1).Address & ":" & Cells(3, 3).Address).Address(External:=False) MsgBox Worksheets(1).Range(Cells(1, 1).Address & ":" & Cells(3, 3).Address).Parent.Name & "'!" & _ Worksheets(1).Range(Cells(1, 1).Address & ":" & Cells(3, 3).Address).Address(External:=False) End Sub 

你有一个对ActiveSheet的隐藏引用。 对Range传递一个string或非限定引用的Cells的非限定调用默认为Activesheet.RangeActiveSheet.Cells 。 所以你的第一个问题线成为

  wkb2.Worksheets("RAW").Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(last_row, 5)).Copy 

而且,除非ActiveSheet.Cells(1, 1)wkb2.Worksheets("RAW") ,否则会出错。

正确的方法来做到这一点,所以它不会错误的是将工作表引用到Cells的调用,而不是调用Range

 Range(wkb2.Worksheets("RAW").Cells(1, 1), _ wkb2.Worksheets("RAW").Cells(last_row, 5)).Copy 

参考@Rusan Kax的答案, Cells(1, 1).Address默认为ActiveSheet.Cells(1, 1).Address成为stringA1 。 和电话

 wkb2.Worksheets("RAW").Range("A1:...").Copy 

是有效的语法。

尝试

 wkb2.Worksheets("RAW").Range(Cells(1, 1), Cells(last_row, 5)).Copy destination:= _ wkb1.Worksheets("Sheet1").Range(Cells(1, 1), Cells(last_row, 5)) 

我想.Paste剪贴板的内容粘贴到指定的范围