Импорт идентичных файлов Excel в access с несколькими листами

#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 я понял это! Большое вам спасибо, вы очень помогли!