Экспорт запроса доступа в Excel - PullRequest
2 голосов
/ 23 марта 2010

У меня есть база данных Access 2007, в которой я создал около 15 запросов SQL для обработки определенных данных, я создал главное меню навигации с помощью меню в Access, теперь мне нужно извлечь все запросы в Excel, используя VBA код, мне удалось сделать это с кодом ниже, создав кнопку и указав этот код для нее.

Private Sub query1_Click()
DoCmd.TransferSpreadsheet acExport, _
acSpreadsheetTypeExcel9, "Total Users and Sessions", _
"C:\UsersandSessions.xls", , "Total Users & Sessions"
End Sub

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

Любые предложения или идеи очень приветствуются.

Ответы [ 3 ]

0 голосов
/ 12 апреля 2011

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

Однако, если человек затем изменяет файл, добавляя новые вкладки или добавляя вычисления и т. Д., То DoCmd.TransferSpreadsheet больше не будет работать и завершится с ошибочным сообщением об ошибке. Итак, что мы делаем в нашей среде - это DoCmd.TransferSpreadsheet в исходный файл с форматированием, а затем в VBA копируем файл на рабочий стол пользователя, а затем открываем эту копию, чтобы пользователь не испортил исходный источник. файл Excel.

Этот подход является минимальным кодом, чистым и простым в обслуживании решением. Но для этого требуется дополнительный «исходный» или оригинальный файл. Работает в Access 2007.

Вы также хотели бы, чтобы результаты оказались на новой вкладке. К сожалению, я думаю, что для этого потребуется некоторая автоматизация Excel. VBA внутри Acccess может вызывать функцию внутри VBA в Excel. Затем VBA может при необходимости копировать вкладки.

0 голосов
/ 30 августа 2015

Моя идея - это гибрид автоматизации 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 ваших листов, каждый раз сохраняйте старые данные и автоматизируйте шаги доступа.

0 голосов
/ 12 апреля 2011

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

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

...