Подтвердить что ты не робот

Копирование из одной книги и вставка в другую

Я написал следующий код и постоянно вижу, что pastespecial метод класса провалился. Я пытался решить эту проблему, но ничего не работает. Я пытаюсь скопировать весь лист из одной рабочей книги и вставить ее в другую:

Set x = Workbooks.Open(" path to copying book ")
Workbooks.Open(" path to copying book ").Activate
Range("A1").Select
'Cells.Select
Selection.Copy
Set y = Workbooks.Open("path to pasting book")
Workbooks.Open("Path to pasting book").Activate

With y
    Sheets("sheetname").Cells.Select
    Range("A1").PasteSpecial
    'Sheets("sheetname").PasteSpecial
    .Close
End With

With x
    .Close
End With
4b9b3361

Ответ 1

Это должно сделать это, дайте мне знать, если у вас есть проблемы с этим:

Sub foo()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, copy what you want from x:
x.Sheets("name of copying sheet").Range("A1").Copy

'Now, paste to y worksheet:
y.Sheets("sheetname").Range("A1").PasteSpecial

'Close x:
x.Close

End Sub

В качестве альтернативы вы можете просто:

Sub foo2()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, transfer values from x to y:
y.Sheets("sheetname").Range("A1").Value = x.Sheets("name of copying sheet").Range("A1") 

'Close x:
x.Close

End Sub

Чтобы распространить это на весь лист:

With x.Sheets("name of copying sheet").UsedRange
    'Now, paste to y worksheet:
    y.Sheets("sheet name").Range("A1").Resize( _
        .Rows.Count, .Columns.Count) = .Value
End With

И еще один способ, сохранить значение как переменную и записать переменную в место назначения:

Sub foo3()
Dim x As Workbook
Dim y As Workbook
Dim vals as Variant

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Store the value in a variable:
vals = x.Sheets("name of sheet").Range("A1").Value

'Use the variable to assign a value to the other file/sheet:
y.Sheets("sheetname").Range("A1").Value = vals 

'Close x:
x.Close

End Sub

Последний метод, описанный выше, обычно самый быстрый для большинства приложений, но обратите внимание, что для очень больших наборов данных (100 тыс. Строк) он заметил, что буфер обмена фактически превосходит дамп массива:

Copy/PasteSpecial против Range.Value = Range.Value

Тем не менее, существуют и другие соображения, помимо скорости, и может случиться так, что снижение производительности большого набора данных стоит компромисса, чтобы избежать взаимодействия с буфером обмена.

Ответ 2

Вы скопировали использование ячеек.
Если это так, нет необходимости в PasteSpecial, поскольку вы копируете данные в точно таком же формате.
Вот ваш код с некоторыми исправлениями.

Dim x As Workbook, y As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet

Set x = Workbooks.Open("path to copying book")
Set y = Workbooks.Open("path to pasting book")

Set ws1 = x.Sheets("Sheet you want to copy from")
Set ws2 = y.Sheets("Sheet you want to copy to")

ws1.Cells.Copy ws2.cells
y.Close True
x.Close False

Если вы действительно хотите вставить специальные, используйте динамический диапазон ( "Адрес" ) для копирования с.
Вот так:

ws1.Range("Address").Copy: ws2.Range("A1").PasteSpecial xlPasteValues
y.Close True
x.Close False

Обратите внимание на двоеточие : после символа .Copy, который является символом Statement Separating.
Использование Object.PasteSpecial требует выполнения в новой строке.
Надеюсь, вам это поможет.

Ответ 3

Сэр, вы можете добавить в приведенный выше код, если конкретный столбец имеет значение больше нуля, тогда данные должны быть экспортированы, а во-вторых, диапазон данных может быть больше или меньше, но диапазон столбца будет фиксированным... поэтому внесите эту модификацию в приведенный выше код, это будет очень полезно для меня. пожалуйста