Есть ли способ импортировать электронную таблицу Excel как набор записей? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть база данных Access, которая суммирует и форматирует данные персонала, экспортированные из другой системы, в виде файла Excel. Текущий процесс требует от пользователя соблюдения следующих шагов / правил:

  1. должен иметь имя Alpha_Roster.xls* или Alpha_Roster.xlsx и находиться в той же папке, что и база данных
  2. две верхние строки должны быть удалены, чтобы перенести заголовки столбцов из строки 3 в строку 1
  3. все «лишние» столбцы должны быть удалены из файла Alpha_Roster, так как данные в этих столбцах не используются и DoCmd.TransferSpreadsheet завершится ошибкой, если они присутствуют

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

Как только заголовки отсортированы, скрипт стирает данные из таблицы AlphaList, а затем использует DoCmd.TransferSpreadsheet acImport, 10, "AlphaList", FilePath & "Alpha_Roster", True для перемещения новых данных.

Итак, у меня есть несколько целей для обновления:

  1. Удалите весь бит имени файла / местоположения - готово, используя Application.FileDialog(msoFileDialogFilePicker) и некоторые операторы If, чтобы проверить, какое расширение мы добавляем.
  2. Убрать требование по редактированию кода Access VBA, если макет экспортированных данных изменяется - считается выполненным, с использованием цикла для извлечения полей, требуемых базой данных, для сбора SQL-запроса для обновления базы данных
  3. Убрать требование по редактированию экспортированного файла Excel.

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

Вот что у меня есть для тестового кода, с которым я играю:

    Dim cnn As New ADODB.Connection
    Dim fDialog As Office.FileDialog
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fDialog
        .Title = "Select Alpha Roster File"
        .AllowMultiSelect = False
        .ButtonName = "Open"
        .Filters.Clear
        .Filters.Add "Excel Workbook", "*.xls;*.xlsx"
        If .Show = True Then
            SelFile = .SelectedItems.Item(1)
        End If
    End With
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=" & SelFile & ";" & _
             "Extended Properties='Excel 12.0 XML;HDR=Yes'"

Где я терплю неудачу, как мне получить отсюда какой-то набор записей, для которого я могу выполнить свой запрос на обновление? Или я могу выполнить свой запрос ("SELECT " & qryStr & " from ...") отсюда? Или я совершенно не на том пути?

Как примечание, по той или иной причине в любое время, когда я пытаюсь определить ADODB.Recordset, программа проверки кода полностью завершает работу Access, поэтому, к сожалению, я не смог полностью отразить некоторые примеры, которые я видел в Интернете.

Некоторые вещи, которые нужно учитывать - я пытаюсь доказать это в будущем, поскольку я не знаю, какие поля могут быть добавлены в экспортируемый файл. Вот почему я не просто ныряю прямо на DoCmd.TransferSpreadsheet. Хотя выгрузка всего файла в таблицу с уже настроенными заголовками, совпадающими с тем, что у нас есть в настоящее время, будет самым простым вариантом, второе что-то изменит в исходном файле, поскольку заголовки затронуты, процесс прерывается. Кроме того, хотя я, возможно, достаточно разбираюсь в технологиях, чтобы разорвать код на части и выяснить, куда идут дела, конечные пользователи здесь ... ну, скажем так, их уровень квалификации довольно прост. Им все равно, как это работает, только то, что это работает.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вы можете запросить лист, используя SheetName $.(Требуется знак доллара)

Dim db As ADODB.Connection, rs As ADODB.Recordset
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
ExelFileFullPath = "FilePath\filename.xlsx"
db.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ExelFileFullPath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;""")
SQL = "SELECT * FROM [SheetName$]"
rs.Open SQL, db, adOpenKeyset, adLockReadOnly

Ваши столбцы должны иметь заголовки с уникальными именами, чтобы избежать проблем.

1 голос
/ 07 мая 2019

Вы можете связать рабочий лист / диапазон в виде таблицы с одной строкой кода:

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12Xml, ...

затем используйте его как любую другую таблицу, но только для чтения.

...