Excel VBA - чтение данных из другого ЗАКРЫТОГО листа Excel

Я пытаюсь прочитать данные из нескольких общих документов Excel, не открывая их, все они находятся в одном сетевом каталоге, за исключением файла, который я написал.

Это просто пример данных, которые я собираю:

=SUMPRODUCT(COUNTIFS('[Tracker_v1.2.xlsm]Work Log'!$D:$D,B5,'[Tracker_v1.2.xlsm]Work Log'!$J:$J,{"XXXX","YYYY"}))
=SUMPRODUCT(COUNTIFS('[B Tracker_v1.1.xlsm]Work Log'!$D:$D,B6,'[B Tracker_v1.1.xlsm]Work Log'!$J:$J,{"XXXX","YYYY"})+COUNTIFS('[A Tracker_v1.1.xlsm]Work Log'!$D:$D,B6,'[A Tracker_v1.1.xlsm]Work Log'!$J:$J,{"XXXX","YYYY"}))

Я пытался использовать пути к файлам тоже '\\network path\[A Tracker_v1.1.xlsm]Work Log'!

На данный момент мне нужно открыть их все, чтобы заполнить мои таблицы статистики, есть ли способ прочитать данные, не открывая вручную все четыре документа?

3 ответа

Решение

Так как вы не хотите открывать файлы вручную, я подозреваю, что вы можете открыть их автоматически. Вот простой пример того, как открывать и закрывать некоторые файлы и выполнять вычисления с использованием VBA. Вы по-прежнему будете технически открывать файлы, но только на короткое время и фактически не отображать их. Для иллюстрации предположим, что у вас есть два файла FileA.xlsm а также FileB.xlsm в папке "C:\MyPath\" со следующими данными в диапазоне от А1 до А3:

FileA           FileB
1               4444
22              55555
333             666666

Следующий код напечатает сумму каждого столбца в ближайшем окне.

Sub OpenClosedFiles()
' Opens some files, does some calculations and then closes those files.

    Application.ScreenUpdating = False ' Hide the files during the microseconds while they're open.

    ' Define the path:
    Const sPath As String = "C:\MyPath\" ' <--- Replace; don't forget the last backslash.

    Dim rngA, rngB As Range
    Dim sFileA, sFileB As String
    Dim wbA, wbB As Workbook

    sFileA = "FileA.xlsm"
    sFileB = "FileB.xlsm"

    Set wbA = Workbooks.Open(sPath & sFileA)
    Set wbB = Workbooks.Open(sPath & sFileB)

    Set rngA = wbA.Worksheets(1).Range("A1:A3")
    Set rngB = wbB.Worksheets(1).Range("A1:A3")

    ' Do calculations on the ranges here, for example:
    Debug.Print "Sum of FileA: " & Application.WorksheetFunction.Sum(rngA)
    Debug.Print "Sum of FileB: " & Application.WorksheetFunction.Sum(rngB)

    wbA.Close
    wbB.Close

    Application.ScreenUpdating = True
End Sub

Вы можете использовать ADO и драйвер ODBC для Excel, чтобы рассматривать закрытые книги как базы данных. Затем вы можете использовать SQL для извлечения данных. Но это предполагает, что вы располагаете информацией в виде таблиц с заголовками таблиц. AFAIK, это единственный способ работать с таблицей, не открывая ее.

Здесь проходит прогулка

Будет ли работать ссылка на закрытые файлы? (В Excel 2016 выберите "Данные"> "Получить данные"> "Из файла"> "Из рабочей книги".) Тогда будет только код VBA. ActiveWorkbook.RefreshAll,

Другие вопросы по тегам