2016-01-22 10 views
0

В настоящее время я создаю скрипт, который будет импортировать все листы Excel в указанной папке в уникальную таблицу в доступе Microsoft. Теперь дело в том, что этот процесс предполагается делать ежемесячно или раз в два месяца, а заголовки на этих листах excel часто меняются. Я попытался использовать метод DoCmd.Transferspreadsheet, но проблема, с которой я сталкиваюсь, заключается в том, что поля не соответствуют таблице адресатов. Теперь я не могу просто создать таблицу с соответствующими именами полей, а затем импортировать ее, потому что, как я уже сказал, заголовки файла excel часто меняются.Импорт Excel в Access, динамические заголовки столбцов

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

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

, но это грязное обходное решение. Я знаю, что можно импортировать в совершенно новую таблицу, используя интерфейс доступа к Microsoft. Требуется несколько кликов, а затем все это хорошо.

Я хочу программное решение.

Function loadData() 

    Dim strPathFile As String, strFile As String, strPath As String 
    Dim strTable As String 
    Dim blnHasFieldNames As Boolean 

    ' Change this next line to True if the first row in EXCEL worksheet 
    ' has field names 
    blnHasFieldNames = True 

    ' Replace C:\Documents\ with the real path to the folder that 
    ' contains the EXCEL files 
    strPath = "C:\Bdz outputs\" 

    ' Replace tablename with the real name of the table into which 
    ' the data are to be imported 

    strFile = Dir(strPath & "*.xlsx") 
    strTable = Left(strFile, 8) 
    strPathFile = strPath & strFile 
    'Debug.Print (createTable("hello", "asdasd")) 

    Do While Len(strFile) > 0 
     strPathFile = strPath & strFile 
     DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Table1", strPathFile, False 

     ' Uncomment out the next code step if you want to delete the 
     ' EXCEL file after it's been imported 

     'Kill strPathFile 

     strFile = Dir() 

    Loop 

End Function 
+0

Если вы не можете найти способ сделать это с помощью TransferSpreadsheet, вы можете написать код для открытия и чтения таблицы Excel. Можно изменить названия заголовков программным способом или другой вариант, если типы значений столбца excel всегда соответствуют типам столбцов доступа, вы можете сохранить имена доступа и просто вставить после заголовка excel по очереди. – PKatona

+2

Возможно, я не понимаю, но если вы укажете несуществующее имя таблицы в аргументе таблицы [TransferSpreadsheet] (https://msdn.microsoft.com/en-us/library/office/ff844793.aspx) и укажите * True * для заголовков столбцов, MS Access импортирует электронную таблицу точно с заголовками файла Excel. – Parfait

ответ

2

Одним из возможных решений может быть использование «на лету» ссылка на данных Excel, например,

CurrentDb.Execute _ 
     "SELECT * INTO myNewTable " & _ 
     "FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Users\Gord\Desktop\foo.xlsx].[Sheet1$]", _ 
     dbFailOnError 

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

DoCmd.TransferSpreadsheet _ 
     TransferType:=acImport, _ 
     SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _ 
     TableName:="myNewTable", _ 
     FileName:="C:\Users\Gord\Desktop\foo.xlsx", _ 
     HasFieldNames:=True 

... где [myNewTable] еще не существует.

1

Свяжите таблицы и читать заголовки:

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "xlsTable1" , strPathFile, True 

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

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