#excel #vba #ms-access
#excel #vba #ms-access
Вопрос:
Итак, я пытаюсь найти способы облегчить рекомбинирование данных в таблицах Excel с помощью access. То, что я пытаюсь сделать, это взять несколько файлов Excel, которые имеют одинаковый формат, и объединить их в непрерывную таблицу. Прямо сейчас у меня есть функция VBA, которая позволит мне настроить таргетинг на один лист Excel в каталоге файлов Excel и объединить их в одну таблицу access. Мой вопрос в том, как я могу сделать то же самое, но для КАЖДОГО листа в каталоге за один раз, вместо того, чтобы запускать и изменять код для каждого листа.
TL; DR У вас есть 100 файлов Excel, в каждом из которых по 7 листов. Форматирование идентично, но данные отличаются. Как мне взять все 100 файлов и объединить их рабочие листы в 7 соответствующих таблиц MS Access?
****** ПРОБЛЕМА РЕШЕНА. РАБОЧИЙ КОД ВЫГЛЯДИТ СЛЕДУЮЩИМ ОБРАЗОМ *******
Модуль 1 с именем SingleModule:
Option Compare Database
Public Function importExcelSheets(Directory As String, TableName As String, WkShtName As String) As Long
On Error Resume Next
Dim strDir As String
Dim strFile As String
Dim I As Long
I = 0
If Left(Directory, 1) <> "" Then
strDir = Directory amp; ""
Else
strDir = Directory
End If
strFile = Dir(strDir amp; "*.XLSX")
While strFile <> ""
I = I 1
strFile = strDir amp; strFile
Debug.Print "importing " amp; strFile
DoCmd.TransferSpreadsheet acImport, , TableName, strFile, True, WkShtName
strFile = Dir()
Wend
importExcelSheets = I
End Function
Модуль 2 с именем MultipleModule:
Public Function importMultipleExcelFiles(Directory As String) As Long
For x = 1 To 7
Dim TableName As String
Dim WkShtName As String
TableName = Choose(x, "Table1", "Table2", "Table3", "Table4")
WkShtName = Choose(x, "Table1!", "Table2!", "Table3!", "Table4!")
Call SingleModule.importExcelSheets(Directory, TableName, WkShtName)
Next x
End Function
Используйте следующую команду в немедленном окне для выполнения (убедитесь, что вы изменили путь к файлу):
? importMultipleExcelFiles("C:Excel File Directory")
ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ:
Вы можете настроить таргетинг на один рабочий лист, используя следующую команду для SingleModule в окне Immediate:
? importExcelSheets("C:FilePath", "TableName", "WkShtName!")
Комментарии:
1. Вы можете сделать это с помощью SQL, google SQL Insert Into из Excel, что-то вроде
......FROM [Excel 12.0;HDR=Yes;Database='c:excelsheet.xlsx'].[Sheet1$]
, затем вы можете использовать Currentdb.execute или docmd.runsql для этого
Ответ №1:
Извините, я не видел, как ваше имя таблицы входило в процедуру. Используйте FOR-NEXT с функцией ВЫБОРА, когда вы вызываете функцию importExcelSheets .
for x= 1 to 7
TableName = choose(x, "Table1", "Table2"...)
WkShtName = choose(x, "ContactDetails!", ...)
importExcelSheets Dir, TableName, WkshtName
next x
Комментарии:
1. затем ваш код работает как оригинальный, и все, что вам нужно сделать, это определить переменную WkShtName и добавить ее в вашу команду TransferSpreadsheet.
2. Прошу прощения, я действительно новичок в VBA и MS-Access. Возможно, вам потребуется немного подробнее описать шаги. Я действительно ценю вашу помощь. Я использовал немедленное окно для запуска кода. Вы предлагаете мне создать новый модуль с использованием этого кода и ссылаться на мой исходный код?
3. Вы, должно быть, вызываете ImportExcelSheets из функции вызова, верно? Используйте код, который я дал вам в другой процедуре, и запустите ее. Он вызовет ваш исходный код как есть, но просто отредактируйте следующее:
Public Function importExcelSheets(Directory As String, TableName As String, WkShtName as string) As Long
и замените «ContactDetails!» на WkShtName.4. например.
DoCmd.TransferSpreadsheet acImport, , TableName, strFile, True, WkShtName
5. С помощью правильного поиска в Google я понял это! Большое вам спасибо, вы очень помогли!