2015-09-25 6 views
1

Я пытаюсь открыть и скопировать данные листа из файла CSV и вставить его в другую книгу, но я получаю Ошибка времени выполнения 9 - Подстрока вне допустимого диапазона.Ошибка времени выполнения 9 - Подпись вне диапазона при копировании из одной книги в другую

Option Explicit 
Sub import() 
Dim filename As String 

Dim curfilename As String 
curfilename = ThisWorkbook.Path 

filename = Application.GetOpenFilename 
Application.ScreenUpdating = False 

Dim x As Workbook 
Set x = Workbooks.Open(filename) 
Workbooks(filename).Sheets("Owners").Range("A1:Z10000").Copy 'Error on this line 
Workbooks(curfilename).Sheets("Owners").Range("A1:Z10000").Paste 

'Close x: 
x.Close 

End Sub 
+0

Измените '.Paste' на' .PasteSpecial'. – Jeeped

+0

@Jeeped Но ошибка на линии копирования –

+0

Есть ли лист «Владельцы» ?, Когда вы наводите курсор на 'filename', что показывает подсказка? – Davesexcel

ответ

1

Application.GetOpenFilename method возвращает полный путь и имя файла, включая расширение. Вы хотите только имя файла с расширением, если ссылаетесь на открытую книгу; не путь.

Worksheet.Paste не работает так, но Range.PasteSpecial method. Измените код, чтобы быть,

Dim Filename As String, currFilename As String 
Dim x As Workbook 

Application.ScreenUpdating = False 
currFilename = ThisWorkbook.Name 
Filename = Application.GetOpenFilename 
Set x = Workbooks.Open(Filename) 

x.Sheets("Owners").Range("A1:Z10000").Copy 
Workbooks(currFilename).Sheets("Owners").Range("A1").PasteSpecial 

Application.DisplayAlerts = False 
x.Close SaveChanges:=False 
Application.DisplayAlerts = True 
Application.ScreenUpdating = True 

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

В качестве альтернативы можно использовать Range.Copy method, и вы должны указать пункт назначения непосредственно в качестве параметра.

x.Sheets("Owners").Range("A1:Z10000").Copy _ 
    Destination:=Workbooks(curfilename).Sheets("Owners").Range("A1") 

Обратите внимание, что для указания цели операции вставки требуется только верхняя левая ячейка в диапазоне.

+0

по первому методу строка «Рабочие книги (curfilename). Таблицы (« Владельцы »). Диапазон (« A1 »). PasteSpecial« снова возвращает ту же ошибку –

+1

Используйте 'curfilename = ThisWorkbook.Name'. – Jeeped

+0

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

Смежные вопросы