Получить последнее значение в строке определенного столбца из нескольких закрытых книг без открытия в подпапке, используемой в VBA в Excel - PullRequest
0 голосов
/ 25 октября 2018

Это кажется почти легким для выполнения до динамического паритета.

У меня есть список файлов на листе, ссылки на файлы в подпапке текущего каталога.Мне нужно получить значение определенной ячейки (можно изменить) в определенном листе (константе).

Я имею в виду, 10 файлов, которые находятся в подпапке и у всех есть лист, называемый "Resumen"Я хочу получить значение последней строки в столбце G.

Пока у меня есть это

Sub read_data_from_file_WO_openning()

Dim outputs_address As String
Dim FolderName As String, wbName As String,  cValue As Variant
outputs_address = Sheets("lista_macro").Range("G2").Value
ruta_csv_output = ActiveWorkbook.Path & outputs_address

FolderName = ruta_csv_output
'select files to review
For Each file_analysis In Sheets("archivos_en_outputs").Range("I2", Range("I2").End(xlDown))
wbName = file_analysis.Value

cValue = GetInfoFromClosedFile2(FolderName, wbName, "resumen", "G1")
MsgBox (file_analysis & cValue) 'to see the values
Next file_analysis
End Sub




Private Function GetInfoFromClosedFile2(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    If Right(wbPath, 1) <> "\" Then wbPath = wbPath & "\"
    arg = "'" & wbPath & "[" & wbName & "]" & _
        wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)

    GetInfoFromClosedFile2 = ExecuteExcel4Macro(arg)
End Function

В диапазоне I2 и ниже у меня есть список файлов.Проблема в том, что мой «G1» извлекает данные только из ячейки G1 всех файлов, и мне нужен последний ряд столбца G для каждого файла.Иногда в этих файлах 7 строк, в других 15. Количество строк может меняться, но всегда равно как минимум 2.

Кто-нибудь может мне помочь, пожалуйста?Я знаю, что проблема в ссылке на ячейку, но я не знаю, как это изменить, чтобы выполнить то, что я сказал.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Другой подход, предполагающий ограниченное количество строк в выходных файлах (<1000?) </p>

Option Explicit

Sub find_in_closed_files()
    Application.ScreenUpdating = False

    Dim Fch As Range
    Dim Wb1 As Workbook: Set Wb1 = ActiveWorkbook
    Dim Fld As String: Fld = Wb1.Path & Sheets("lista_macro").Range("G2").Value
    If Not Right(Fld, 1) = "\" Then Fld = Fld & "\"
    Dim Ws1 As Worksheet: Set Ws1 = Wb1.Sheets(1)
    Dim Ws2 As Worksheet: Set Ws2 = Wb1.Sheets("tmp pull") 'This is a temp draft sheet to pull the data that you'll need to create

    For Each Fch In Ws1.Range("I2", Ws1.Range("I2").End(xlDown))
        Ws2.Cells.Clear
        Ws2.Range("G1:G999").FormulaR1C1 = "=IF('" & Fld & "[" & Fch.Value & "]resumen'!RC<>"""",'" & Fld & "[" & Fch.Value & "]resumen'!RC,"""")"
        Ws2.Range("G1:G999").Value2 = Ws2.Range("G1:G999").Value2
        MsgBox Ws2.Range("G9999").End(xlUp).Value
    Next Fch

    Application.ScreenUpdating = True
End Sub
0 голосов
/ 25 октября 2018

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

Sub xlsxLastG()

    Dim i As Long, f As String

    With Worksheets("archivos_en_outputs")

        For i = 2 To .Cells(.Rows.Count, "I").End(xlUp).Row
            'conform C:\Users\public\AppData\Documents\test.xlsb
            '     to 'C:\Users\public\AppData\Documents\[test.xlsb]resumen'!G:G
            f = .Cells(i, "I").Value
            f = Left(f, InStrRev(f, Chr(92))) & Chr(91) & Right(f, Len(f) - InStrRev(f, Chr(92)))
            f = Chr(39) & f & Chr(93) & "resumen'!G:G"

            .Cells(i, "G").Formula = _
              "=index(" & f & ", max(iferror(match(1e99, " & f & "), 0), iferror(match(""zzz"", " & f & "), 0)))"
        Next i

    End With

End Sub

#N/A ошибки обычно означают столбецG был пустым;#REF! ошибки могут указывать на то, что в указанной книге нет рабочей книги или рабочей таблицы возобновления.

0 голосов
/ 25 октября 2018

Предполагая, что в столбце G нет пробелов, вы можете использовать ExecuteExcel4Macro с WorksheetFunction CountA, чтобы найти последнюю строку.

Function getLastValueInColumnG(ByVal wbPath As String, wbName As String, wsName As String) As Variant
    Dim count As Long
    Dim Address As String
    Address = getExternalR1C1Address(wbPath, wbName, wsName, "G:G")
    count = ExecuteExcel4Macro("CountA(" & Address & ")")
    Address = getExternalR1C1Address(wbPath, wbName, wsName, "G" & count)
    getLastValueInColumnG = ExecuteExcel4Macro(Address)
End Function

Function getExternalR1C1Address(ByVal wbPath As String, wbName As String, wsName As String, cellRef As String) As String
    If Right(wbPath, 1) <> "\" Then wbPath = wbPath & "\"
    getExternalR1C1Address = "'" & wbPath & "[" & wbName & "]" & wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...