Вы могли динамично добавить форму с помощью DHTML и затем отправить.
Я написал это много лет назад, но, возможно, это поможет вам. Я добавил расширение для последней версии 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
РЕДАКТИРОВАТЬ:
Я должен упомянуть, как это работает. Когда вы запускаете макрос, он вызывает диалоговое окно «Открыть файл». Дважды щелкните первый файл в списке (или любой файл, если на то пошло). Он создаст новую книгу, а затем переберет все файлы в папке. Для каждого файла он копирует все содержимое из первого листа и вставляет его в конец новой книги. Вот и все.
Вы пытались
Tools->Macro->Record New Macro
создать maco, чтобы сделать то же самое
Другое решение - предоставить вашей сводной таблице доступ к другим таблицам по имени файла и захватить сами данные.
Для этого вам необходимо открыть все таблицы. в то же время, поэтому он может обновлять ссылки, но это все равно, вероятно, быстрее, чем открывать и копировать / вставлять по одной, даже с помощью макроса. У каждой электронной таблицы должно быть уникальное имя файла.
Если имена таблиц не известны до тех пор, пока вы их не получите, или они регулярно меняются, создайте столбец в сводной таблице для хранения имен файлов листов, затем создайте нужный адрес, используя манипуляции со строками, и получите данные с помощью INDIRECT ().
Пример получения одной ячейки данных из одного конкретного файла:
=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2")
Промойте и повторите описанные выше действия для каждой ячейки каждой электронной таблицы, которую вы хотите получить.
Вы должны уметь правильно передать строку в INDIRECT (). Создайте ее как формулу, чтобы вы могли использовать буквально ту же формулу для каждой ячейки, которую вам нужно получить.
Пример:
= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL()))
Формула выше перейдет в электронную таблицу, имя файла которой находится в $ A2 ( обратите внимание на отсутствие $ перед "2", чтобы вы могли вставить ту же формулу в другие строки для других файлов) и получите значение ячейки на листе MyWorksheet в строке 3 и столбце current (так , если он находится в B2 на вашем сворачивании, он получает B3 из другого файла).
Настройте функцию АДРЕС, чтобы добавить смещения к необходимой строке и столбцу.
Преимущество вышеприведенного решения состоит в том, что ту же формулу можно скопировать и вставить в строки и столбцы, которые необходимо заполнить, и Excel при необходимости скорректирует $ A2 и COL (). Очень удобен в обслуживании.
Отредактируйте , как только у меня была аналогичная ситуация, и я не мог загрузить все таблицы сразу (более 200). Я думаю, что закончил тем, что написал VBA, поэтому он , а не на самом деле открывал и читал файлы Excel. Вместо этого я заставил его перебирать имена файлов, открывать ODBC-соединение с каждым и использовать ADO для чтения необходимых мне значений из заданного именованного диапазона (который отображается как «таблица» в ODBC - рабочие листы также отображаются как «таблицы» "но есть правила о разрешенных именах). Это было намного быстрее, чем открытие и закрытие файлов Excel, и имело дополнительное преимущество, заключающееся в отсутствии сбоев Excel.
Я думаю, что закончил тем, что написал VBA, поэтому он , а не на самом деле открывал и читал файлы Excel. Вместо этого я заставил его перебирать имена файлов, открывать ODBC-соединение с каждым и использовать ADO для чтения необходимых мне значений из заданного именованного диапазона (который отображается как «таблица» в ODBC - рабочие листы также отображаются как «таблицы» "но есть правила о разрешенных именах). Это было намного быстрее, чем открытие и закрытие файлов Excel, и имело дополнительное преимущество, заключающееся в отсутствии сбоев Excel. Я думаю, что закончил тем, что написал VBA, поэтому он , а не на самом деле открывал и читал файлы Excel. Вместо этого я заставил его перебирать имена файлов, открывать ODBC-соединение с каждым и использовать ADO для чтения необходимых мне значений из заданного именованного диапазона (который отображается как «таблица» в ODBC - листы также отображаются как «таблицы» "но есть правила о разрешенных именах). Это было намного быстрее, чем открытие и закрытие файлов Excel, и имело дополнительное преимущество, заключающееся в отсутствии сбоев Excel.Вот код VBA, демонстрирующий перебор нескольких файлов 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
Надеюсь, это будет достаточно хорошей отправной точкой для работы с существующими код макроса.
Родриго,
Я предполагаю, что вы имеете в виду более 100 книг, которые вам нужно открывать по отдельности, копировать и вставлять в одну? Звучит весело :)
Если бы вы могли поместить их все в один каталог, открытие каждого файла было бы достаточно простым делом, сначала выполните поиск по нему. (@Mark Biek опубликовал для вас хороший пример)
Как только вы откроете файл, я скопирую данные в набор записей ADO, который вы затем добавите. Я опубликовал некоторый код для выполнения чего-то очень похожего с объединением нескольких листов в одну книгу.
Это не совсем то, что вам нужно, но должно помочь. Если нет, напишите, как далеко вы продвинулись, и я еще раз посмотрю в течение недели.
Этого можно достичь с помощью TransferSpreadsheet в Access. См. Эту ссылку:
Это решение не требует VBA.
Раньше я использовал VBA для создания внешних ссылок (ссылок).
Я писал об этом здесь (см. Пример 2):
Лучшие короткие примеры необходимости для Excel VBA
Это похоже на использование INDIRECT, но без необходимости открывать книги Excel.
Единственным недостатком является то, что старый компьютер или старая версия Excel, не зная, какая именно, может замедлить этот процесс. Я считаю, что это потому, что каждый раз, когда добавляется новая внешняя ссылка, все остальные внешние ссылки обновляются. Чтобы ускорить процесс, я установил для вычисления значение «Вручную», добавил внешние ссылки и установил для «Расчет» значение «Автоматически», чтобы обновить их.