2010-03-23 5 views
2

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

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

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

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

+0

Несколько вопросов: # 1 Когда вы говорите «извлеките все запросы в Excel», вы имеете в виду, что хотите просто экспортировать результаты запросов? # 2 Выполняют ли эти запросы любые пользовательские вводные данные, то есть критерии даты, прежде чем они смогут запустить? – PowerUser

+0

Вы изучили автоматизацию Excel из Access? Это довольно большая тема. –

+0

PowerUser, запросы не требуют ввода какого-либо пользователя, и, к сожалению, я имею в виду экспорт в Excel с форматированием, есть ли у вас какие-либо рекомендации. Спасибо – MalsiaPro

ответ

0

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

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

0

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

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

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

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

0

Моя идея была бы гибридом автоматизации Excel от Access и созданием шаблона в Excel, а также с привязкой к вашему запросу таблицы данных. Чтобы начать создавать таблицу данных в Excel. Вы можете запустить три строки вниз и два столбца вправо, если хотите, или где угодно. Перейдите на вкладку данных и нажмите «Доступ», найдите свой дБ, выберите свой запрос, на который вы хотите установить ссылку, выберите «Таблица» в качестве переключателя, а затем нажмите «Свойства» вместо «ОК», снимите флажок «Включить фоновое обновление», эта часть имеет решающее значение ... под на вкладке «Определение» в строке подключения вы увидите часть, в которой указано изменение режима «Share Deny Write», которое в режиме = «Чтение», это позволит убедиться, что запрос обновляется без ошибок из MS Access VBA, а db открыт и будет поддерживать ваши пользователи возвращаются к db в случае, если ваш запрос является запросом на запись. После того, как вы установите это значение, вы можете настроить форматирование таблицы, однако вы выбираете вкладку «Дизайн таблицы», и оно будет поддерживать это форматирование.

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

Это должно заставить вас есть ваши данные, чтобы не начать на A1 ваших листы, сохранить ваши старые данные каждый раз, и автоматизировать этапы от доступа.