Excel - VBA Вопрос. Необходим доступ к данным из всех файлов Excel в каталоге, не открывая файлы - PullRequest
0 голосов
/ 23 сентября 2011

Итак, у меня есть «мастер» файл Excel, который мне нужно заполнить данными из файлов Excel в каталоге. Мне просто нужно получить доступ к каждому файлу и скопировать одну строку со второго листа в каждой книге и вставить ее в свой мастер-файл, не открывая файлы Excel.

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

Редактировать ...

Итак, я пытался использовать функцию dir для запуска каталога с циклом, но я не знаю, как перейти к первому файлу. Я видел это на сайте, но для меня цикл не останавливается, и он получает доступ только к первому файлу в каталоге.

Folder = "\\Drcs8570168\shasad\Test"
    wbname = Dir(Folder & "\" & "*.xls")

    Do While wbname <> ""

i = i + 1
ReDim Preserve wblist(1 To i)
wblist(i) = wbname
wbname = Dir(FolderName & "\" & "*.xls")

Как wbname перемещается по списку файлов?

Ответы [ 5 ]

4 голосов
/ 23 сентября 2011

Вы не должны открывать файлы (ADO может быть вариантом, например, создание ссылок с кодом или использование ExecuteExcel4Macro) , но обычно открытие файлов с кодом является наиболее гибким и самый простой подход.

  1. Копирование диапазона из закрытой рабочей книги (ADO)
  2. ExecuteExcel4Macro
  3. Метод ссылок

Но почему вы не хотите открывать файлы - действительно ли это жесткое ограничение?

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

Его можно легко адаптировать к строке X листа 2, если вы довольны этим процессом

2 голосов
/ 23 сентября 2011

Я просто хочу отметить: вам не нужен VBA для получения значений из закрытой книги. Вы можете использовать формулу, такую ​​как:

='C:\MyPath\[MyBook.xls]Sheet1'!$A$3

Вы также можете реализовать этот подход в VBA:

Dim rngDestinationCell As Range
Dim rngSourceCell As Range
Dim xlsPath As String
Dim xlsFilename As String
Dim sourceSheetName As String

Set rngDestinationCell = Cells(3,1) ' or Range("A3")
Set rngSourceCell = Cells(3,1)
xlsPath = "C:\MyPath"
xlsFilename = "MyBook.xls"
sourceSheetName = "Sheet1"

rngDestinationCell.Formula = "=" _
    & "'" & xlsPath & "\[" & xlsFilename & "]" & sourceSheetName & "'!" _
    & rngSourceCell.Address

Другие ответы также предлагают хорошие решения, возможно, более элегантные, чем эта.

0 голосов
/ 03 мая 2013

Несколько битов из моего класса-обертки для Excel:

Dim wb As Excel.Workbook
Dim xlApp As Excel.Application

Set xlApp = New Excel.Application
xlApp.DisplayAlerts = False  ''# prevents dialog boxes
xlApp.ScreenUpdating = False ''# prevents showing up
xlApp.EnableEvents = False   ''# prevents all internal events even being fired

''# start your "reading from the files"-loop here
    Set wb = xlApp.Workbooks.Add(sFilename) '' better than open, because it can read from files that are in use

    ''# read the cells you need...
    ''# [....]

    wb.Close SaveChanges:=False     ''# clean up workbook
''# end your "reading from the files"-loop here

''# after your're done with all files, properly clean up:
xlApp.Quit
Set xlApp = Nothing

Удачи!

0 голосов
/ 20 января 2012

В начале вашего макроса добавьте

Application.ScreenUpdating = false

затем в конце

Application.ScreenUpdating = True

и вы не увидите открытых файлов, так как макрос выполняет свою функцию.

0 голосов
/ 23 сентября 2011

brettdj и paulsm4 ответы дают много информации, но я все еще хотел добавить мои 2 цента .

как iDevlop ответил в этой теме ( Копировать данные из другой рабочей книги через VBA ), вы также можете использовать GetInfoFromClosedFile () .

...