Ошибка 400 при попытке копирования / вставки между книгами - PullRequest
0 голосов
/ 29 апреля 2019

У меня проблема с Excel VBA: я пытаюсь открыть существующий шаблон пустой книги (pn), скопировать данные из существующего листа (wb) и вставить его в «pn», но я продолжаюполучение всех видов ошибок, таких как ошибка 400, подстрочный индекс вне диапазона и постоянное замораживание.

Я пробовал код со многими вариантами, но в основном (и в моей последней попытке ниже) ошибка происходит в следующемline:

Workbooks (pn) .Sheets ("data"). Выберите

Это связано с тем, что VBA правильно получает имя открытого файла или переключается между книгами?Как правильно переключаться между различными книгами и копировать / вставлять данные?

РЕДАКТИРОВАТЬ: также, при запуске кода в режиме отладки с помощью («Шаг в») он работает просто отлично.Я заметил, что реальное открытое имя файла появляется только тогда, когда код ожидает полного открытия рабочей книги или когда я нажимаю alt + tab в ней, иначе его имя продолжает отображаться как «Excel», и возникает ошибка!

'opens template
fileName = Application.GetOpenFilename("Excel-files,*.xlsx", 1, "OPEN TEMPLATE", , False)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error GoTo Err1
Workbooks.Open (fileName)
pn = ActiveWorkbook.Name

'copy and paste between workbooks
Windows(wb).Activate
Workbooks(wb).Sheets("Info").Select
Workbooks(wb).Worksheets("Info").Range("A4:Z1000").Select
Selection.Copy 'Destination:=Workbooks(pn).Sheets("data").Cells(3, 1)
Workbooks(pn).Sheets("data").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Это сработало хорошо.Отныне я обычно использую следующую структуру в коде:

Dim wb As Workbook
Dim hld As Workbook
Set wb = ThisWorkbook
...
wb.Sheets("Info1").Range("A2:AP1500").Copy Destination:=hld.Sheets("Info1").Cells(1, 1)
...

Иногда я могу заставить работать только Копировать / Вставить или Копировать / Назначение вместо прямого присвоения значений по какой-то причине, но все женамного лучше, чем я делал раньше.Спасибо!

0 голосов
/ 29 апреля 2019

Вам никогда не нужно использовать копирование и вставку в VBA.Вы можете присваивать значения переменным или вы можете назначать ячейки ячейкам напрямую.

ПРИМЕР:

'opens template
Filename = Application.GetOpenFilename("Excel-files,*.xlsx", 1, "OPEN TEMPLATE", , False)
Dim pn As Workbook
pn = Workbooks.Open(Filename)

'copy and paste between workbooks
pn.Sheets("data").Range("A3") = Workbooks(wb).Worksheets("Info").Range("A4:Z1000")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...