2009-07-24 3 views
5

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

Я пытаюсь написать скрипт vba для итерации файлов excel и копирования диапазона в одной таблице, но я не смог это сделать.

Есть ли простой способ сделать это?

+3

Qusetions: 1) Что у вас есть до сих пор? 2) как узнать, какие файлы открыть?и 3) В чем проблема, с которой вы сталкиваетесь? – RBarryYoung

ответ

3

Я написал эти годы назад, но, возможно, это поможет вам. Я добавил расширение для последней версии Excel (xlsx). Кажется, работает.

Sub MergeExcelDocs() 
    Dim lastRow As Integer 
    Dim docPath As String 
    Dim baseCell As Excel.range 
    Dim sysObj As Variant, folderObj As Variant, fileObj As Variant 
    Application.ScreenUpdating = False 
    docPath = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx", FilterIndex:=2, Title:="Choose any file") 
    Workbooks.Add 
    Set baseCell = range("A1") 
    Set sysObj = CreateObject("scripting.filesystemobject") 
    Set fileObj = sysObj.getFile(docPath) 
    Set folderObj = fileObj.ParentFolder 
    For Each fileObj In folderObj.Files 
     Workbooks.Open Filename:=fileObj.path 
     range(range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy 
     lastRow = baseCell.SpecialCells(xlLastCell).row 
     baseCell.Offset(lastRow, 0).PasteSpecial (xlPasteValues) 
     baseCell.Copy 
     ActiveWindow.Close SaveChanges:=False 
    Next 
End Sub 

EDIT:

Я должен упомянуть, как это работает. При запуске макроса открывается диалоговое окно «Открыть файл». Дважды щелкните первый файл в списке (или любой файл, если на то пошло). Затем он создаст новую рабочую книгу, а затем проверит все файлы в папке. Для каждого файла он копирует весь контент с первого листа и вставляет его в конец новой книги. Это почти все, что нужно.

+0

Работал как очарование! Я только что добавил: Диапазон ("H14: N14"). Копия Для удовлетворения моих потребностей; но по дороге, я стараюсь идти по пути ADO для большей гибкости. Большое спасибо, сэр! im один счастливый житель кабины! – Rodrigo

+0

Рад, что это помогло! – devuxer

1

ли вы попробовать

Tools->Macro->Record New Macro 

создать Maco, чтобы сделать то же самое

+0

Я сделал, чтобы понять, как vba что-то делает, но мне нужно Итератировать, чтобы делать то же самое с несколькими файлами. – Rodrigo

+0

Это отправная точка всех моих макросов. – Kieveli

+0

У вас может быть пустая целевая таблица с макросом в ней. Пробейте файлы, откройте их по одному, а затем скопируйте все. Попробуйте записать макрос, пока вы делаете это с несколькими файлами. – Kieveli

2

Другим решением является вашим рулонным доступом таблицы других таблиц по имени файла и захватить сами данные.

Для этого вам нужно будет открыть все электронные таблицы одновременно, чтобы обновлять ссылки, но это, вероятно, быстрее, чем открытие и копирование/вставка по одному, даже с помощью макроса , Каждая таблица должна иметь уникальное имя файла.

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

Пример, чтобы захватить одну ячейку данных из одного конкретного файла:

=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2") 

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

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

Пример:

= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL())) 

Формула выше будет идти в таблицу, имя которой находится в $ A2 (обратите внимание на отсутствие $ до «2», так что вы можете вставить ту же формулу для других строк для других файлов) и получить значение ячейки на листе MyWorksheet в третьей строке и столбец (так что, если это бит B2 в вашем свертке, он получает B3 из другого файла).

Отрегулируйте функцию ADDRESS, чтобы добавить смещения в нужную строку и столбец.

Преимущество вышеприведенного решения состоит в том, что одна и та же формула может быть скопирована и вставлена ​​через строки и столбцы, которые необходимо заполнить, и Excel будет корректировать $ A2 и COL() по мере необходимости. Очень удобно.

Редактировать как только у меня возникла аналогичная ситуация, и я не смог загрузить все электронные таблицы сразу (более 200). Я думаю, что в итоге я написал VBA, так что не действительно открыл и прочитал файлы Excel. Вместо этого я пропустил его по именам файлов, открыл для них ODBC-соединение и использовал ADO для чтения значений, которые мне нужны, из заданного именованного диапазона (который отображается как «таблица» в ODBC - рабочие листы также отображаются как «таблицы» «но есть правила о разрешенных именах»). Это было намного быстрее, чем открытие и закрытие файлов Excel, а также дополнительное преимущество не сбой Excel.

+0

Мне нравится делать это сейчас, используя формулу для вызова значения из таблицы; однако предпочтительным решением будет vba-скрипт от excel. – Rodrigo

1

Родриго,

Я предполагаю, что вы имеете в виду 100+ рабочие книги, которые Вы должны индивидуально открытым и скопировать и вставить в один? Звучит как забава :)

Если вы можете разместить их все в одном каталоге, открытие каждого файла достаточно просто, сначала выполните поиск по этому вопросу. (@Mark Biek отправил вам хороший пример)

Как только у вас откроется файл, я бы затем скопировал данные в набор записей ADO, к которому вы должны были бы добавить. У меня есть posted some code для того, чтобы сделать что-то очень похожее на слияние нескольких листов в одной книге.

Это не совсем то, что вам нужно, но это должно помочь. Если нет, сообщите, как далеко вы доберетесь, и у меня будет другой взгляд в течение недели.

6

Вот некоторые V код, который демонстрирует Перебор кучи файлов Excel в каталоге и открытие каждый из них:

Dim sourcePath As String 
Dim curFile As String 
Dim curWB As Excel.Workbook 
Dim destWB As Excel.Workbook 

Set destWB = ActiveWorkbook 
sourcePath = "C:\files" 

curFile = Dir(sourcePath & "\*.xls") 
While curFile <> "" 
    Set curWB = Workbooks.Open(sourcePath & "\" & curFile) 

    curWB.Close 
    curFile = Dir() 
Wend 

Надеется, что это будет хорошей достаточно отправной точки для Вас, чтобы работать существующий код макроса ,

+0

Это, большое спасибо Mark. Реальная проблема для меня, получала выбор: copy: change workbook: вставить последовательность последовательности. – Rodrigo

0

В прошлом я использовал VBA для создания внешних ссылок (ссылок).

Я отправил об этом здесь (пример 2):

Best short examples of the need for Excel VBA

Это похоже на использование КОСВЕННЫЕ, но без необходимости иметь учебные пособия первенствовать открыты.

Единственным недостатком является то, что старый компьютер или старая версия excel, не уверенный, что, может сделать этот процесс медленным. Я считаю, что каждый раз, когда добавляется новая внешняя ссылка, все остальные внешние ссылки обновляются. Чтобы ускорить работу, я устанавливаю «Расчет» в «Вручную», добавляет внешние ссылки и настраивает «Расчет» на «Автоматически» для их обновления.

После этого, если вы просто хотите получить значения, вы можете использовать ссылки перерыва, а также специальные значения для копирования и вставки.

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