簡體   English   中英

將訪問查詢導出到 Excel

[英]Exporting Access Query to Excel

我有一個 Access 2007 數據庫,我在其中創建了大約 15 個 SQL 查詢來處理特定數據,我使用 Access 中的菜單創建了一個主框架導航菜單,我現在需要使用 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 電子表格已經存在該查詢輸出,那么當再次點擊時,它將再次寫入下一個可用的工作表。

非常歡迎任何建議或想法。

我的想法是將來自 Access 的 Excel 自動化與在 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

這應該讓您的數據不在工作表的 A1 上開始,每次都保存舊數據,並自動執行訪問步驟。

簡短的故事,是你不能。 您也許可以在 Excel 端編寫一些腳本來格式化生成的文件。 如果你想要一些漂亮的東西,你可能想要創建一個報告。

您可以將 Excel 工作表安裝為表格,然后在 Excel 文件中的單獨工作表上,引用第一張工作表,並設置第二張工作表的格式以供查看。

如果您使用 DoCmd.TransferSpreadsheet 並創建一個原始文件,然后對其進行編輯以使格式正確,則您可以再次運行 DoCmd.TransferSpreadsheet,它將使用值更新文件但保留格式。

但是,如果隨后有人通過添加新選項卡或添加計算等方式更改文件,則 DoCmd.TransferSpreadsheet 將不再工作,並且會失敗並顯示難看的錯誤消息。 所以我們在我們的環境中做的是將 DoCmd.TransferSpreadsheet 轉換為帶有格式的原始文件,然后在 VBA 中通過將文件復制到用戶桌面來跟進,然后打開該副本,這樣用戶就不會弄亂原始源excel文件。

這種方法是代碼最少、干凈且易於維護的解決方案。 但它確實需要一個額外的“源”或原始文件。 適用於 Access 2007。

您還希望結果最終出現在新選項卡上。 不幸的是,我認為需要一些 excel 自動化才能做到這一點。 Acccess里面的VBA可以在Excel中調用VBA里面的函數。 然后,該 VBA 可以根據需要復制選項卡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM