Excel VBA从只读工作簿复制并粘贴到当前工作表
不知道为什么,但我的复制和粘贴语句给了我一个运行时1004错误(“应用程序定义的或对象定义的错误”) 这就是问题所在:Excel VBA从只读工作簿复制并粘贴到当前工作表,vba,excel,Vba,Excel,不知道为什么,但我的复制和粘贴语句给了我一个运行时1004错误(“应用程序定义的或对象定义的错误”) 这就是问题所在: cs.Range(cs.Cells(2, 1), cs.Cells(lastRow - 1, lastColumn)).Copy _ Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow + 1, 1)) 这是我完整的子程序。我将文件路径和当前工作表传递给它-pasteSheet Sub copyAndPast
cs.Range(cs.Cells(2, 1), cs.Cells(lastRow - 1, lastColumn)).Copy _
Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow + 1, 1))
这是我完整的子程序。我将文件路径和当前工作表传递给它-pasteSheet
Sub copyAndPaste(filePath As String, pasteSheet As Worksheet)
Debug.Print "filePath = "; filePath
Dim cb As Workbook
Set cb = Workbooks.Open(filePath, 0, True)
Dim cs As Worksheet
Set cs = cb.Sheets(1)
Dim lastRow As Long
lastRow = cb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "LastRow = "; lastRow
Dim lastColumn As Long
lastColumn = cb.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Debug.Print "LastCol = "; lastColumn
Dim pasteRow As Long
pasteRow = pasteSheet.Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "PasteRow = "; pasteRow
cs.Range(cs.Cells(2, 1), cs.Cells(lastRow - 1, lastColumn)).Copy _
Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow + 1, 1))
cb.Close False
End Sub
如果工作簿
cb
中有pasteSheet
,您是否以只读方式打开了cb
,粘贴会失败?否则,请使用工作簿父项限定粘贴工作表
根据OP讨论进行编辑演示
为了说明这一点,我在代码中显式地指定了Sub的参数。请注意,这些是我的测试值,您需要确保在此表格中提供您的值。请注意,(1)pasteSheet
这里是完全限定的,(2)我已经调整了复制/粘贴行中的(粘贴)语法
Sub copyAndPaste()
Dim filepath As String
Dim pasteSheet As Worksheet
Set pasteSheet = ThisWorkbook.Sheets("Sheet2") 'provide your values
filepath = "C:\Data\\SOtestdata.xlsx" 'provide your values
Dim cb As Workbook
Set cb = Workbooks.Open(filepath, 0, True)
Dim cs As Worksheet
Set cs = cb.Sheets(1)
Dim lastRow As Long
lastRow = cb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "LastRow = "; lastRow
Dim lastColumn As Long
lastColumn = cb.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Debug.Print "LastCol = "; lastColumn
Dim pasteRow As Long
pasteRow = pasteSheet.Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "PasteRow = "; pasteRow
cs.Range(cs.Cells(2, 1), cs.Cells(lastRow - 1, lastColumn)).Copy _
Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow + 1, 1), pasteSheet.Cells(pasteRow + 1, 1))
cb.Close False
End Sub
你试过cb.Sheets(1)Range(cs.Cells(2,1),cb.Sheets(1)Cells(lastRow-1,lastColumn)).Copy Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow+1,1))@StevenMartin这会让事情变得更糟
cs=cb.Sheets(1)
所以说cb.Sheets(1.Range
和说cs.Range
没什么区别。那么,为什么要在一个地方调用cs.Cells
,而在另一个地方调用cb.Sheets(1)
?对不起,我的意思是在所有cb.Sheets(1)范围(cb.Sheets(1.Cells)(2,1),cb.Sheets(1.Cells)(lastRow-1,lastColumn)).Copy Destination:=pasteSheet.Range(pasteSheet.Cells(pasteRow+1,1))–这就是为什么我想知道为什么你定义了cs,然后直到冒犯者尝试了它才使用它,但仍然不起作用。。。我添加了一个参数并设置了wb=ActiveWorkbook
,并将其传递给子例程,您没有用这种方式更新代码中对粘贴工作表的所有引用吗,有趣的是,当我得到pasterrow
时,没有问题……但这不是意味着有问题吗?现在我得到一个438错误-对象不支持此属性或方法。。。我打错电话了你在哪里把文件扩展名包括在“粘贴到”工作簿引用中?e、 g.工作簿(“粘贴到.xlsx”)不是工作簿(“粘贴到”)。我认为最好明确说明源和目标工作簿。