У меня есть база данных Access, которая суммирует и форматирует данные персонала, экспортированные из другой системы, в виде файла Excel. Текущий процесс требует от пользователя соблюдения следующих шагов / правил:
- должен иметь имя
Alpha_Roster.xls*
или Alpha_Roster.xlsx
и находиться в той же папке, что и база данных
- две верхние строки должны быть удалены, чтобы перенести заголовки столбцов из строки 3 в строку 1
- все «лишние» столбцы должны быть удалены из файла Alpha_Roster, так как данные в этих столбцах не используются и
DoCmd.TransferSpreadsheet
завершится ошибкой, если они присутствуют
Как видите, это не так уж плохо, когда вы имеете дело только с несколькими целевыми столбцами, но мы ищем информацию именно из 25 или около того столбцов, и они смешиваются с избыточным столбцы, которые нам нужно удалить (в экспортируемом файле 76 столбцов), поэтому подготовить файл к обновлению довольно утомительно, что мы должны делать еженедельно.
Как только заголовки отсортированы, скрипт стирает данные из таблицы AlphaList, а затем использует DoCmd.TransferSpreadsheet acImport, 10, "AlphaList", FilePath & "Alpha_Roster", True
для перемещения новых данных.
Итак, у меня есть несколько целей для обновления:
- Удалите весь бит имени файла / местоположения - готово, используя
Application.FileDialog(msoFileDialogFilePicker)
и некоторые операторы If, чтобы проверить, какое расширение мы добавляем.
- Убрать требование по редактированию кода Access VBA, если макет экспортированных данных изменяется - считается выполненным, с использованием цикла для извлечения полей, требуемых базой данных, для сбора SQL-запроса для обновления базы данных
- Убрать требование по редактированию экспортированного файла 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
. Хотя выгрузка всего файла в таблицу с уже настроенными заголовками, совпадающими с тем, что у нас есть в настоящее время, будет самым простым вариантом, второе что-то изменит в исходном файле, поскольку заголовки затронуты, процесс прерывается. Кроме того, хотя я, возможно, достаточно разбираюсь в технологиях, чтобы разорвать код на части и выяснить, куда идут дела, конечные пользователи здесь ... ну, скажем так, их уровень квалификации довольно прост. Им все равно, как это работает, только то, что это работает.