Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA从只读工作簿复制并粘贴到当前工作表_Vba_Excel - Fatal编程技术网

Excel VBA从只读工作簿复制并粘贴到当前工作表

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

不知道为什么,但我的复制和粘贴语句给了我一个运行时1004错误(“应用程序定义的或对象定义的错误”)

这就是问题所在:

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”)不是工作簿(“粘贴到”)。我认为最好明确说明源和目标工作簿。