設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 5993|回復(fù): 2
打印 上一主題 下一主題

[模塊/函數(shù)] 【總結(jié)】Access導(dǎo)出到Excel方法匯總

[復(fù)制鏈接]

點擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-10-29 13:47:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 盜夢 于 2015-10-29 15:35 編輯

Access vba有各種方法可以導(dǎo)出到Excel,大致如下:

方法 優(yōu)點缺點
查詢導(dǎo)出 可以根據(jù)查詢設(shè)計(直觀) 格式固定
ADO逐條遍歷 寫入位置可以靈活控制 速度較慢
CopyFromRecordset 速度極快   格式固定
Excel插入QueryTable 速度較快,可以匯總
復(fù)制粘貼 標(biāo)題、格式和子窗體一致 只能導(dǎo)出數(shù)據(jù)表顯示的子窗體數(shù)據(jù)

1、利用查詢導(dǎo)出
  1. DoCmd.OutputTo acOutputQuery, "具體的查詢名稱", acFormatXLS, , True
復(fù)制代碼

執(zhí)行這條語句,即可把對應(yīng)的查詢導(dǎo)出到Excel文件

拓展:
1)、當(dāng)然,你也可以根據(jù)SQL語句自動創(chuàng)建查詢,再導(dǎo)出。
    CurrentDb.CreateQueryDef "新的查詢名稱", "SQL語句"  '創(chuàng)建查詢
2)、然后,導(dǎo)出之后,你可以刪除掉這個查詢
    DoCmd.DeleteObject acQuery, "查詢名稱"              '刪除查詢
3)、當(dāng)然,你可以修改當(dāng)前查詢的SQL語句之后,再導(dǎo)出
    Dim qdf As Object  'DAO.QueryDef
    Set qdf = CurrentDb.QueryDefs("查詢名稱")
    qdf.SQL = strSQL   '設(shè)置新的SQL語句


2、ADO逐條遍歷
這種方法是最傳統(tǒng)和最典型的方法,也是最靈活的。
打開一個記錄集,然后遍歷數(shù)據(jù)對Excel操作即可。重點在操作Excel。
  1.     Dim rs As New ADODB.Recordset
  2.     Dim xlApp As Object     'Excel.Application
  3.     Dim xlBook As Object    'Excel.Workbook
  4.     Dim xlSheet As Object   'Excel.Worksheet

  5.     Set xlApp = CreateObject("Excel.Application")
  6.     Set xlBook = xlApp.Workbooks.Add    '添加一個新的Book
  7.     Set xlSheet = xlApp.ActiveSheet     '使用當(dāng)前的Sheet

  8.     Dim strSql As String
  9.     Dim i As Long

  10.     strSql="Select * from 表1 where ID<10"
  11.     rs.Open strSql, CurrentProject.Connection, 1, 1
  12.         Do While Not rs.EOF
  13.             xlSheet.Cells(2 + i,1)=rs("ID")   '從第2行開始寫數(shù)據(jù)
  14.             xlSheet.Cells(2 + i,2)=rs("FName")
  15.             rs.MoveNext
  16.             i=i+1
  17.         Loop
  18.     rs.Close

  19.     xlApp.Visible=True
復(fù)制代碼



3、CopyFromRecordset導(dǎo)出數(shù)據(jù)
CopyFromRecordset是Excel vba的方法,可以快速把一個記錄集的數(shù)據(jù)填充到Excel單元格中。
  1. '標(biāo)題:根據(jù)SQL語句,快速導(dǎo)出到Excel文件
  2. '作者:阿航

  3. '創(chuàng)建日期:2015-01-10
  4. '說明:
  5. '   - 會將SQL語句的字段名作為標(biāo)題?梢杂肁s的方式設(shè)置對應(yīng)字段的標(biāo)題,如果是關(guān)鍵字,要加中括。
  6. '   - 示例:ExportToExcel "select FID as [ID], FText as 文本 from 表1"

  7. '更新日期:2015-09-05
  8. '   - 添加一個長度可變的參數(shù),用于傳遞標(biāo)題
  9. '   - 示例:ExportToExcel "select FID,FText from 表1","主鍵","文本"
  10. Public Function ExportToExcel(strSql As String, ParamArray VarExpr() As Variant) As Boolean
  11.     Dim rs As Object        'DAO.Recordset(用ADO也行)
  12.     Dim xlApp As Object     'Excel.Application
  13.     Dim xlBook As Object    'Excel.Workbook
  14.     Dim xlSheet As Object   'Excel.Worksheet
  15.     Dim i As Integer
  16.          
  17.     '創(chuàng)建Excel文件
  18. On Error GoTo Err_Show
  19.     Set xlApp = CreateObject("Excel.Application")
  20.     Set xlBook = xlApp.Workbooks.Add    '添加一個新的Book
  21.     Set xlSheet = xlApp.ActiveSheet     '使用當(dāng)前的Sheet
  22.          
  23.     Set rs = CurrentDb.OpenRecordset(strSql)
  24.     '先寫入標(biāo)題(可以考慮用DAO的字段標(biāo)題屬性 rs(i-1).Properties("Caption"))
  25. '    For i = 1 To rs.Fields.Count
  26. '        xlSheet.cells(1, i) = rs(i - 1).Name
  27. '    Next
  28.     '更新部分(2015-09-05)長度可變的參數(shù),相當(dāng)于一個數(shù)組
  29.     For i = 0 To UBound(VarExpr)
  30.         xlSheet.cells(1, i + 1) = VarExpr(i)
  31.     Next
  32.               
  33.     '再寫入數(shù)據(jù)
  34.     xlSheet.Range("A2").CopyFromRecordset rs
  35.     rs.Close
  36.          
  37.     '調(diào)整列寬
  38.     xlSheet.Columns.EntireColumn.AutoFit
  39.     xlApp.Visible = True
  40.     xlBook.Activate
  41.     ExportToExcel = True
  42.          
  43. Err_Exit:
  44.     Set xlSheet = Nothing
  45.     Set xlBook = Nothing
  46.     Set xlApp = Nothing
  47.     Set rs = Nothing
  48.     Exit Function
  49. Err_Show:
  50.     MsgBox "導(dǎo)出出錯,請重新嘗試" & vbCrLf & Err.Description, "導(dǎo)出出錯"
  51.     On Error Resume Next
  52.     '出錯則清掉文件,避免有多個Excel進程
  53.     xlBook.Close False
  54.     If xlApp.Workbooks.Count = 0 Then xlApp.Quit
  55.     GoTo Err_Exit
  56. End Function
復(fù)制代碼



4、Excel插入QueryTable
QueryTable是Excel的一種表格對象,可以插入一個DAO記錄集
  1. '---用記錄填充Excel表格
  2. '輸入?yún)?shù): RS,需要填充的記錄集
  3. '          InsertSheet, 需要填充的Excel工作表
  4. '          InsertSheet, 需要開始填充的單元格
  5. '返回參數(shù), 填充完畢的range

  6. Public Function FillRS(ByRef rsInsert As DAO.Recordset, ByRef sheetInsert As Excel.Worksheet, rangeInsert As Excel.Range) As Excel.Range
  7.     Dim qtTable As Excel.QueryTable
  8.     Dim loListObject As Excel.ListObject

  9.     '根據(jù)記錄集生成一個querytable
  10.     rsInsert.MoveFirst

  11.     Set qtTable = sheetInsert.QueryTables.Add(Connection:=rsInsert, Destination:=rangeInsert)

  12.     With qtTable
  13.         .FieldNames = True
  14.         .AdjustColumnWidth = True
  15.         .Refresh BackgroundQuery:=False
  16.     End With


  17.     ' 把QueryTable ListObject
  18.     Set loListObject = sheetInsert.ListObjects.Add(xlSrcRange, qtTable.ResultRange, , xlYes)

  19.     With loListObject
  20.         .ShowTotals = True   '顯示匯總列
  21.         .ShowAutoFilter = True

  22.         '顯示匯總數(shù)據(jù)
  23.         Dim fld As DAO.Field
  24.         For Each fld In rsInsert.Fields
  25.             Select Case fld.Type
  26.                 Case dbCurrency
  27.                     '.ListColumns(fld.Name).TotalsCalculation = xlTotalsCalculationSum
  28.                     .ListColumns(fld.Name).Range.NumberFormat = "#,##0.00;-#,##0.00"

  29.                 Case dbDate
  30.                     .ListColumns(fld.Name).Range.NumberFormat = "yyyy-mm-dd;@"
  31.             End Select
  32.         Next
  33.         '.TableStyle = "TableStyleMedium9"

  34.         '.Range.AutoFormat xlRangeAutoFormatList1
  35.         Set FillRS = .Range
  36.         .Unlink
  37.         .Unlist
  38.     End With

  39.     Set qtTable = Nothing
  40. End Function
復(fù)制代碼



5、復(fù)制粘貼的方法,快速導(dǎo)出數(shù)據(jù)
在某次發(fā)現(xiàn)了,可以手動復(fù)制子窗體上的數(shù)據(jù),然后粘貼到Excel中。于是就嘗試用這代碼實現(xiàn)這個功能
  1.     Me.子窗體控件名.SetFocus                    '子窗體控件獲得焦點
  2.     DoCmd.RunCommand acCmdSelectAllRecords      '選中所有記錄
  3.     DoCmd.RunCommand acCmdCopy                  '復(fù)制
  4.     DoEvents

  5.     Dim Obj As Object
  6.     Set Obj = CreateObject("excel.application") '創(chuàng)建Excel對象
  7.     Obj.workbooks.Add                           '新建工作簿
  8.     Obj.Visible = True                          '設(shè)為可見
  9.     SendKeys "^v", True                         '粘貼數(shù)據(jù)
復(fù)制代碼



當(dāng)然,還有其他各種方法,例如利用OpenXML方法導(dǎo)出。大家可以回復(fù)討論交流一下。

評分

參與人數(shù) 1經(jīng)驗 +10 金錢 +10 技術(shù) +1 V幣 +1 收起 理由
5988143 + 10 + 10 + 1 + 1 (其它)優(yōu)秀教程、原創(chuàng)內(nèi)容、以資鼓勵、其.

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2015-10-29 14:58:16 | 只看該作者
好貼.
回復(fù)

使用道具 舉報

3#
發(fā)表于 2015-10-30 07:39:55 | 只看該作者
總結(jié)不錯!謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 08:22 , Processed in 0.220171 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表