2016-09-06 6 views
0

У меня возникли проблемы с выяснением проблемы с моим кодом. Я запускаю папку, создавая лист на основе имени файла, копируя одну ячейку (A1) и передавая ее на новом листе. Тем не менее, я продолжаю получать следующее сообщение об ошибке:Копирование/Вставка между книгами (Подзаголовок за пределами допустимого диапазона)

Subscript out of range (Run-time error '9')

У меня есть следующий код:

Sub InsertDepartments() 
    Dim MyObj As Object, MySource As Object, file As Variant 
    file = Dir(ThisWorkbook.Path & "\Departments\") 
    While (file <> "") 
     Set WS = Sheets.Add(After:=Sheets("Start")) 
     WS.Name = Left(file, InStr(file, ".") - 1) 

     Workbooks(ThisWorkbook.Path & "\Departments\" & file).Sheets("XXX").Range("A1").Copy 
     Sheets(WS.Name).Range("A1").PasteSpecial Paste:=xlPasteValues 

     file = Dir 
    Wend 

End Sub 

Может кто-нибудь увидеть, что не так в коде? Заранее спасибо.

+1

Не уверен, что линия эта ошибка возникает на но попробуйте это: 'File = Dir (ThisWorkbook.Path & "\ Факультеты \ * XLSX.")' Параметр '*' персонаж будет возвращать все файлы с именем ' .xlsx' в папке, например. Фактически, я думаю, что ответ заключается в том, что сначала вам нужно открыть книгу, прежде чем вы сможете скопировать любые значения диапазона. Поэтому перед методом копирования вставьте метод «Workbooks.Open». (Оставляя первую часть в случае, если она помогает). –

+0

Эта ошибка появится в любом из ваших 'Sheets()' или 'Workbooks()', если элемент, который вы пытаетесь использовать, отсутствует в коллекции. Проверьте значение 'ThisWorkbook.Path & \ \ Departments \" & file', чтобы убедиться, что это имя уже открытой книги. Убедитесь, что у рабочей книги есть лист с именем «XXX» и проверьте, что ваша ActiveWorkbook имеет лист с именем «WS.Name» – Mikegrann

ответ

1

Это должно решить проблему. Вы не открывали книгу до копирования/вставки.

Sub InsertDepartments() 
    Dim wbOutput As Workbook 
    Dim wsOutput As Worksheet 
    Dim wbSource As Workbook 
    Dim file As Variant 

    file = Dir(ThisWorkbook.Path & "\Departments\*.xls*") 
    Set wbOutput = ActiveWorkbook 

    While (file <> "") 

     Set wsOutput = wbOutput.Sheets.Add(After:=wbOutput.Sheets("Start")) 
     wsOutput.Name = Left(file, InStr(file, ".") - 1) 
     Set wbSource = Workbooks.Open(ThisWorkbook.Path & "\Departments\" & file) 
     wbSource.Sheets("XXX").Cells.Copy 
     wsOutput.Range("A1").PasteSpecial xlPasteValues 
     Application.CutCopyMode = False 
     wbSource.Close False 
     file = Dir 
    Wend 

End Sub 
+0

. Я бы предложил добавить описание того, почему это поможет OP. – Chrismas007

+0

Просто личная настройка - поскольку OP просто хочет значения, вы можете вообще пропустить '.Copy' и просто установить два диапазона:' wsOutput.Range («A1»). Значение = wbSource.Sheets («XXX»)) .Cells.Value'. (Это должно сработать. Если нет, вам просто нужно определить два диапазона, равные друг другу). – BruceWayne

+0

Я не задавал диапазоны, потому что в зависимости от того, сколько данных находится на исходном листе, это может привести к ошибке «Недостаточно памяти». – Coolshaikh

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