2014-02-06 18 views
1

Я пытаюсь создать скрипт VBA, который будет собирать данные из четырех разных книг. Пока что я просто тестирую код с одной рабочей книгой, но я получаю сообщение об ошибке при попытке получить данные. Хотя я хотел бы получить данные из четырех Рабочих книг, не открывая их, мне нужно будет открыть их, чтобы найти последнюю строку данных. Вот мой текущий код:VBA - Извлечение данных из закрытой книги Excel

Public Sub GetData() 

Application.ScreenUpdating = False 

Dim LastRow As Integer 
Dim WB As Workbook 
Dim xlsPath As String 
Dim xlsFilename As String 
Dim SheetName As String 

xlsPath = "C:\Users\a27qewt\My Documents\Document Retention\FI_DocumentRetention.xlsm" 

Set WB = Workbooks.Open(xlsPath) 

'Workbooks("FI_DocumentRetention.xlsm").Sheets("S&S Document Locations").Unprotect 

LastRow = Workbooks("FI_DocumentRetention.xlsm").Sheets("S&S Document Locations").Cells(Rows.Count, "A").End(xlUp).Row 

Workbooks("SS_Index.xlsm").Sheets("Document Index").Range(Cells(2, 1), Cells(LastRow, 5)).Value = _ 
Workbooks("FI_DocumentRetention.xlsm").Sheets("S&S Document Locations").Range(Cells(2, 1), Cells(LastRow, 5)).Value 

WB.Close False 

End Sub 

Я получаю 1004 приложения/объект, определенную ошибку в в Workbooks("FI_DocumentRetention.xlsm").Sheets("S&S Document Locations").Range ... линию. Любые предложения почему?

+0

При использовании 'Range (Cells(), Cells())' как Range() и Cells() - если не квалифицирован с рабочим листом - будет относиться к активной таблице. Вам нужно указать рабочий лист для всех частей этого выражения. Ваш код будет легче управлять, если вы объявите переменную для каждого листа и используете эти ссылки при работе с диапазонами, вместо того, чтобы всегда использовать «Рабочие книги (...). Листы (...)' –

+0

@TimWilliams, спасибо за предложение. Я смог успешно использовать «Range (« A2: E »и LastRow)». Есть ли более эффективный или более чистый способ сделать это? – CJK

ответ

1

Вы уже решили проблему, но вот как я бы подойти к этому

Public Sub GetData() 

    Dim LastRow As Long '<< not Integer 
    Dim WB As Workbook 
    Dim xlsPath As String 
    Dim xlsFilename As String 
    Dim SheetName As String 
    Dim shtSrc As Worksheet, shtDest As Worksheet, rngSrc As Range 

    Application.ScreenUpdating = False 

    xlsPath = "C:\Users\a27qewt\My Documents\Document Retention\FI_DocumentRetention.xlsm" 

    Set WB = Workbooks.Open(xlsPath) 

    Set shtSrc = WB.Sheets("S&S Document Locations") 
    Set shtDest = Workbooks("SS_Index.xlsm").Sheets("Document Index") 

    LastRow = shtSrc.Cells(shtSrc.Rows.Count, "A").End(xlUp).Row 

    Set rngSrc = shtSrc.Range(shtSrc.Range("A2"), _ 
           shtSrc.Cells(LastRow, 5)) 

    shtDest.Range("A2").Resize(rngSrc.Rows.Count, _ 
           rngSrc.Columns.Count).Value = rngSrc.Value 

    WB.Close False 

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