Excel VBA - ошибка: переменная объекта или переменная блока не установлены - PullRequest
0 голосов
/ 02 января 2019

Я хочу скопировать последнюю ячейку определенного столбца листа в мастер-лист, но это дает мне ошибку не определенного объекта.Я не уверен, где я ошибся?

If fso.GetExtensionName(wbFile.Name) = "xls" Then 
Set wb = Workbooks.Open(wbFile.Path)
wsLR = wb.Sheets("financial_report").Cells(Rows.Count, 1).End(xlUp).Row
ThisWorkbook.Sheets("sheet1").Cells(y, 2) = wb.Sheets("financial_report").Cells(wsLR,7)

Ответы [ 3 ]

0 голосов
/ 02 января 2019
Sub Macro1_Query()
Dim wb As Workbook, ws As Worksheet
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.GetFolder("C:
y = ThisWorkbook.Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each wbfile In fldr.Files
If fso.GetExtensionName(wbfile.Name) = "xls" Then
With Workbooks.Open(wbfile.Path)
With .Worksheets("financial_report")
wsLR = .Cells(.Rows.Count, 1).End(xlUp).Row

ThisWorkbook.Sheets("sheet1").Cells(y, 2) = .Cells(wsLR, 7).Value

End With
.Close savechanges:=False
End With

wb.Close
End if
Next wbfile
End sub
0 голосов
/ 02 января 2019

Копировать ячейку из рабочих книг

Проверьте константы, и вы готовы к работе.Она выдаст ошибку, если рабочая книга не получила указанный рабочий лист («financial_report»).

Код

'*******************************************************************************
' Purpose:    Copies a cell value from all workbooks in a folder to a column
'             in this workbook.
'*******************************************************************************
Sub CopyCellFromWorkbooks()

    ' Source Folder Path
    Const cStrPath As String = _
        "C:\"
    ' Source Worksheet Name/Index
    Const cStrSource As Variant = "financial_report"
    Const cVntSource As Variant = 7   ' Source Column Letter/Number

    ' Target Worksheet Name/Index
    Const cStrTarget As Variant = "Sheet1"
    Const cVntTarget As Variant = 1   ' Target Column Letter/Number

    ' FSO Objects
    Dim objFSO As Object, objFolder As Object, objFile As Object

    Dim objTarget As Worksheet  ' Target Worksheet (ThisWorkbook)
    Dim lngTarget As Long       ' Target Column
    Dim lngSource As Long       ' Source Column

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(cStrPath)

    Set objTarget = ThisWorkbook.Sheets(cStrTarget)

    For Each objFile In objFolder.Files
        If objFSO.GetExtensionName(objFile.Name) = "xls" Then
            With Workbooks.Open(objFile.Path).Worksheets(cStrSource)
                With objTarget
                    lngTarget = _
                            .Cells(.Rows.Count, cVntTarget).End(xlUp).Row + 1
                End With
                lngSource = .Cells(.Rows.Count, cVntSource).End(xlUp).Row
                objTarget.Cells(lngTarget, cVntTarget) _
                        = .Cells(lngSource, cVntSource).Value
                .Parent.Close False
            End With
        End If
    Next
End Sub
'*******************************************************************************

РЕДАКТИРОВАТЬ:

Sub CopyCellFromWorkbooksEDIT()

    ' Source Folder Path
    Const cStrPath As String = _
        "C:\"
    ' Source Worksheet Name/Index
    Const cStrSource As Variant = "financial_report"
    Const cVntSource As Variant = "Y"   ' Source Column Letter/Number

    ' Target Worksheet Name/Index
    Const cStrTarget As Variant = "Sheet1"
    Const cVntTarget As Variant = 1     ' Target Column Letter/Number

    ' FSO Objects
    Dim objFSO As Object, objFolder As Object, objFile As Object

    Dim objTarget As Worksheet  ' Target Worksheet (ThisWorkbook)
    Dim lngTarget As Long       ' Target Column
    Dim lngSource As Long       ' Source Column

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(cStrPath)

    Set objTarget = ThisWorkbook.Sheets(cStrTarget)

    For Each objFile In objFolder.Files
        If objFSO.GetExtensionName(objFile.Name) = "xls" Then
            With Workbooks.Open(objFile.Path).Worksheets(cStrSource)
                With objTarget
                    lngTarget = _
                            .Cells(.Rows.Count, cVntTarget).End(xlUp).Row + 1
                End With
                lngSource = .Cells(.Rows.Count, cVntSource).End(xlUp).Row
                objTarget.Cells(lngTarget, cVntTarget) _
                        = .Cells(2, 7).Value ' (G2)
                objTarget.Cells(lngTarget, cVntTarget + 1) _
                        = .Cells(lngSource, cVntSource).Value
                .Parent.Close False
            End With
        End If
    Next
End Sub
'*******************************************************************************
0 голосов
/ 02 января 2019

Следующая проблема фактически генерирует 1004: ошибка приложения или объекта * , но я публикую это как предупреждающее напоминание о правильных явных родительских ссылках при работе со смесью старыхРабочие книги XLS и более новые рабочие книги XLSX. Возможно, вы захотите запустить этот код, чтобы увидеть, как он помогает идентифицировать номер строки вашей исходной ошибки.

Ваша внешняя рабочая книга - XLS с 65536 строками.Если ThisWorkbook представляет собой XLSX или аналогичную новую книгу, то в ней 1048576 строк.Rows.Count не имеет явного родительского листа и, возможно, пытается найти 1048576-ю строку на листе, который имеет только 65536 строк.

'at this point, y should be defined as a number greater than zero

If fso.GetExtensionName(wbFile.Name) = "xls" Then 

    with Workbooks.Open(wbFile.Path)
        with .workSheets("financial_report")
            wsLR = .Cells(.Rows.Count, 1).End(xlUp).Row
            ThisWorkbook.Sheets("sheet1").Cells(y, 2) = .Cells(wsLR, 7).value
        end with
        .close savechanges:=false
    end with

end if

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...