Моя идея - это гибрид автоматизации Excel из Access и создание шаблона в Excel, который будет иметь таблицу данных, связанную с вашим запросом.
Для начала создайте свою таблицу данных в Excel. Вы можете начать три строки вниз и два столбца вправо, если хотите или где угодно. Перейдите на вкладку данных и нажмите «Доступ», найдите свою базу данных, выберите запрос, на который вы хотите сослаться, выберите таблицу в качестве переключателя, но вместо «ОК» нажмите «Свойства», снимите флажок «Включить фоновое обновление», эта часть является критической ... под На вкладке определения в строке подключения вы увидите часть, которая говорит: Mode = Share Deny Write. Измените ее на Mode = Read. Это позволит убедиться, что запрос обновляется без ошибок из MS Access VBA, пока база данных открыта, и сохранит ваши данные. пользователи от обратной записи в БД, если ваш запрос является записываемым запросом. После того, как вы это настроите, вы можете настроить форматирование таблицы так, как вы выберете на вкладке «Дизайн таблицы», и оно сохранит это форматирование.
В целях этого мы будем предполагать, что вы начали таблицу в ячейке B4 и назвали ее рабочим листом CurrentDay, для целей следующего примера VBA обязательно замените эту ссылку на ваше фактическое размещение.
Затем вернитесь к Access и напишите свой VBA. Сначала убедитесь, что в вашем окне VBA у вас есть ссылка на библиотеку объектов Microsoft Excel 12.0, выбрав Инструменты> Ссылки и выбрав ее в алфавитном списке.
Создайте свой саб следующим образом:
Sub query1_click()
Dim xl as Excel.Application
Dim wbk as Excel.Workbook
Dim wks as Excel.Worksheet
Dim RC as Integer
Dim CC as Integer
Set xl = New Excel.Application
Set wbk = xl.wbk.Open "X:\Filelocation\FileName.xlsx" 'name and path you saved the file you previously created
xl.Visible = True
'The above is not necessary but you may want to see your process work the first few times and it will be easier than going to task manager to end Excel if something fails.
RC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("B:B")) + 3 'This will count the rows of data in your table including your header so you can copy the data to another tab dynamically as the size of your table expands and shrinks we add 3 to it because we started at row 4 and we need the location of the last row of the record set.
CC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("4:4")) + 1 'This counts the header row and adds one space because we will use this as a location holder for our copy / paste function
Set wks = xl.wbk.Worksheets.Add
wks.Name = format(date(),"MM_dd_yy") 'this will name the tab with today's date... you can eliminate this step if you just want the sheets to be the generic Sheet1, Sheet2, etc.
With xl.wbk
.Worksheets("CurrentDay").Range(Cells(4,2),Cells(RC,CC)).Copy
.wks.PasteSpecial xlPasteValues 'This pastes the values so that the table links do not paste otherwise every tab would just refresh everyday.
.wks.PasteSpecial xlPasteFormats 'This gets your formatting.
.RefreshAll 'This will refresh your table
Wend
With xl
.Save
.Close False
.Quit
Wend
Set xl = Nothing
Set wbk = Nothing
Set wks = Nothing
End Sub
Это должно привести к тому, что ваши данные не будут запускаться на А1 ваших листов, каждый раз сохраняйте старые данные и автоматизируйте шаги доступа.