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
Я предпочитаю первый вариант, так как он имеет тенденцию быть более динамичным и легко читаемым и изменяемым позже, если вам нужно это сделать.