vba ошибка импорта ячеек из других книг

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

'runtime '1004' error 
Error defined by application or object

если я попытаюсь использовать синтаксис "range (ячейки (i,j), ячейки (k,h))" вместо диапазона ("A1:Z1"). То есть в следующем коде строка "PASTE 1" выдает ошибку, а строка "PASTE 2" работает гладко (очевидно, я не хочу использовать второй, потому что мне нужно запустить цикл в разных диапазонах).

Sub Importa()

Dim directory As String
Dim fileName  As String
Dim wbfrom    As Workbook
Dim wbto    As Workbook

Application.ScreenUpdating = False
Application.DisplayAlerts = False

directory = "mydirectory"
fileName = Dir(directory & "*.xl??")   'find the first *.xl?? file; '  wildcards: multiple character (*) single character (?)
Set wbto = ThisWorkbook
Set wbfrom = Workbooks.Open(directory & fileName, False, True)

' copy some cells
wbfrom.Sheets(1).Range(Cells(9, 6), Cells(15, 6)).Copy

'PASTE 1
wbto.Sheets(1).Range(Cells(9, 1), Cells(15, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

'PASTE 2
'wbto.Sheets(1).Range("A1:A8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


wbfrom.Close SaveChanges:=False
'Turn on screen updating and displaying alerts again
Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

1 ответ

Решение

Проблема в том, что вам нужно квалифицировать Cells на конкретный лист / рабочую книгу. В противном случае это косвенно относится к ActiveSheetи так как wbFrom Активен во время выполнения, диапазон не может существовать (потому что ячейки на одном листе не могут определять диапазон на другом листе)

Два способа справиться с этим, один квалифицирующий Cells вот так:

With wbto.Sheets(1)
    .Range(.Cells(9, 1), .Cells(15, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With

Другой заключается в приведении адреса из ячеек:

wbto.Sheets(1).Range(Cells(9, 1).Address, Cells(15, 1).Address).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

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

Другие вопросы по тегам