Access導出到Excel方法匯總


From:https://www.cnblogs.com/aademeng/articles/12951434.html

Access vba有各種方法可以導出到Excel,大致如下:

 

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

1、利用查詢導出

DoCmd.OutputTo acOutputQuery, "具體的查詢名稱", acFormatXLS, , True

執行這條語句,即可把對應的查詢導出到Excel文件

拓展:
1)、當然,你也可以根據SQL語句自動創建查詢,再導出。
    CurrentDb.CreateQueryDef "新的查詢名稱", "SQL語句"  '創建查詢
2)、然后,導出之后,你可以刪除掉這個查詢
    DoCmd.DeleteObject acQuery, "查詢名稱"            '刪除查詢
3)、當然,你可以修改當前查詢的SQL語句之后,再導出

 

    Dim qdf As Object  'DAO.QueryDef
    Set qdf = CurrentDb.QueryDefs("查詢名稱")
    qdf.SQL = strSQL   '設置新的SQL語句

 

 

2、ADO逐條遍歷
這種方法是最傳統和最典型的方法,也是最靈活的。

打開一個記錄集,然后遍歷數據對Excel操作即可。重點在操作Excel。

 

                                                        
    Dim rs As New ADODB.Recordset
    Dim xlApp As Object     'Excel.Application
    Dim xlBook As Object    'Excel.Workbook
    Dim xlSheet As Object   'Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add    '添加一個新的Book
    Set xlSheet = xlApp.ActiveSheet     '使用當前的Sheet
    Dim strSql As String
    Dim i As Long
    strSql="Select * from 表1 where ID<10"
    rs.Open strSql, CurrentProject.Connection, 1, 1
        Do While Not rs.EOF
            xlSheet.Cells(2 + i,1)=rs("ID")   '從第2行開始寫數據
            xlSheet.Cells(2 + i,2)=rs("FName")
            rs.MoveNext
            i=i+1
        Loop
    rs.Close
    xlApp.Visible=True


3、CopyFromRecordset導出數據
CopyFromRecordset是Excel vba的方法,可以快速把一個記錄集的數據填充到Excel單元格中。

'標題:根據SQL語句,快速導出到Excel文件
'作者:阿航

'創建日期:2015-01-10
'說明:
'   - 會將SQL語句的字段名作為標題。可以用As的方式設置對應字段的標題,如果是關鍵字,要加中括。
'   - 示例:ExportToExcel "select FID as [ID], FText as 文本 from 表1"
'更新日期:2015-09-05
'   - 添加一個長度可變的參數,用於傳遞標題
'   - 示例:ExportToExcel "select FID,FText from 表1","主鍵","文本"
Public Function ExportToExcel(strSql As String, ParamArray VarExpr() As Variant) As Boolean
    Dim rs As Object        'DAO.Recordset(用ADO也行)
    Dim xlApp As Object     'Excel.Application
    Dim xlBook As Object    'Excel.Workbook
    Dim xlSheet As Object   'Excel.Worksheet
    Dim i As Integer
          
    '創建Excel文件
On Error GoTo Err_Show
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add    '添加一個新的Book
    Set xlSheet = xlApp.ActiveSheet     '使用當前的Sheet
          
    Set rs = CurrentDb.OpenRecordset(strSql)
    '先寫入標題(可以考慮用DAO的字段標題屬性 rs(i-1).Properties("Caption"))
'    For i = 1 To rs.Fields.Count
'        xlSheet.cells(1, i) = rs(i - 1).Name
'    Next
    '更新部分(2015-09-05)長度可變的參數,相當於一個數組
    For i = 0 To UBound(VarExpr)
        xlSheet.cells(1, i + 1) = VarExpr(i)
    Next
              
    '再寫入數據
    xlSheet.Range("A2").CopyFromRecordset rs
    rs.Close
          
    '調整列寬
    xlSheet.Columns.EntireColumn.AutoFit
    xlApp.Visible = True
    xlBook.Activate
    ExportToExcel = True
          
Err_Exit:
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Set rs = Nothing
    Exit Function
Err_Show:
    MsgBox "導出出錯,請重新嘗試" & vbCrLf & Err.Description, "導出出錯"
    On Error Resume Next
    '出錯則清掉文件,避免有多個Excel進程
    xlBook.Close False
    If xlApp.Workbooks.Count = 0 Then xlApp.Quit
    GoTo Err_Exit
End Function



4、Excel插入QueryTable
QueryTable是Excel的一種表格對象,可以插入一個DAO記錄集

'---用記錄填充Excel表格
'輸入參數: RS,需要填充的記錄集
'          InsertSheet, 需要填充的Excel工作表
'          InsertSheet, 需要開始填充的單元格
'返回參數, 填充完畢的range


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

    '根據記錄集生成一個querytable
    rsInsert.MoveFirst

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

    With qtTable
        .FieldNames = True
        .AdjustColumnWidth = True
        .Refresh BackgroundQuery:=False
    End With
' 把QueryTable ListObject
    Set loListObject = sheetInsert.ListObjects.Add(xlSrcRange, qtTable.ResultRange, , xlYes)

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

        '顯示匯總數據
        Dim fld As DAO.Field
        For Each fld In rsInsert.Fields
            Select Case fld.Type
                Case dbCurrency
                    '.ListColumns(fld.Name).TotalsCalculation = xlTotalsCalculationSum
                    .ListColumns(fld.Name).Range.NumberFormat = "#,##0.00;-#,##0.00"

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

        '.Range.AutoFormat xlRangeAutoFormatList1
        Set FillRS = .Range
        .Unlink
        .Unlist
    End With

    Set qtTable = Nothing
End Function


5、復制粘貼的方法,快速導出數據
在某次發現了,可以手動復制子窗體上的數據,然后粘貼到Excel中。於是就嘗試用這代碼實現這個功能

 Me.子窗體控件名.SetFocus                    '子窗體控件獲得焦點
    DoCmd.RunCommand acCmdSelectAllRecords      '選中所有記錄
    DoCmd.RunCommand acCmdCopy                  '復制
    DoEvents

    Dim Obj As Object
    Set Obj = CreateObject("excel.application") '創建Excel對象
    Obj.workbooks.Add                           '新建工作簿
    Obj.Visible = True                          '設為可見
    SendKeys "^v", True                         '粘貼數據

https://www.cnblogs.com/aademeng/articles/12951434.html

一、ACCESS數據庫加密
1、ACCESS 2013數據庫加密方式
(1)使用舊版加密(適用於反向兼容和多用戶數據)
(2)使用默認加密(安全性較高)
ADO連接僅支持舊版加密,使用VBA代碼動態創建帶密碼的Access 數據庫文件,也是舊版加密。
2、數據庫如果采用手工設置密碼,則要設置為舊版加密方式:
打開ACCESS 2013—Access選項—客戶端設置—加密方法--使用舊版加密(適用於反向兼容和多用戶數據)
二、設置ADO連接ACCESS數據庫方式一
(1)引用 Microsoft ActiveX Data Objects 2.x Library(操作方式:Visual Basic-工具-引用,不同office版本不同)
  說明:當未引用,運行后會顯示“用戶定義類型未定義”
(2)連接代碼
Sub 導入數據1()
    Dim cnn As ADODB.Connection      '數據庫連接
    Dim mydata As String                   '數據庫的完整路徑和名稱
    Dim mytable As String                  '數據表名稱
    Dim sql As String                         'sql語句
    Dim rs As ADODB.Recordset          '臨時數據表紀錄
    Dim i As Integer                           '循環數據變量(獲取數據表字段)

    '1、連接數據庫
    Set cnn = New ADODB.Connection
    mydata = ThisWorkbook.Path & "\進銷存數據庫.accdb"

    With cnn
        .Provider = "Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Database Password='123456'"
        .Open mydata
    End With

    '2、建立與數據庫的連接
    mytable = "采購數據3"
    sql = "select 采購數據3.ID,采購數據3.采購日期,采購數據3.供貨類型,采購數據3.采購分類,采購數據3.供應商,采購數據3.名稱,采購數據3.單位,采購數據3.單價,采購數據3.數量,采購數據3.金額,采購數據3.入賬日期" & " from " & mytable & " order by 采購日期"
    Set rs = New ADODB.Recordset
    rs.Open sql, cnn, adOpenKeyset, adLockOptimistic

     '3、復制數據庫數據
    ' (1)清除原數據
    ActiveSheet.Cells.ClearContents

    '(2)復制字段名
    For i = 1 To rs.Fields.Count
        Cells(1, i) = rs.Fields(i - 1).Name
    Next i

    '(3)復制全部數據
    Range("A2").CopyFromRecordset rs

    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing

End Sub


三、設置ADO連接ACCESS數據庫方式二
無需引用,直接創建連接
Sub 導入數據2()
    Dim cnn As Object                '數據庫連接
    Dim strcnn As String             'ACCESS連接語句
    Dim mydata As String            '數據庫的完整路徑和名稱
    Dim mytable As String           '數據表名稱
    Dim sql As String                  'sql查詢語句
    Dim rs As Object                  '臨時數據表紀錄
    Dim i As Integer                  '循環數據變量(獲取數據表字段)

    '1、連接數據庫
    Set cnn = CreateObject("ADODB.Connection")
    mydata = ThisWorkbook.Path & "\進銷存數據庫.accdb"

    Select Case Application.Version * 1    '設置連接字符串,根據版本創建連接
        Case Is <= 11
            strcnn = "Provider=Microsoft.Jet.Oledb.4.0;Jet OLEDB:Database Password='123456';Data Source=" & mydata
        Case Is >= 12
            strcnn = "Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Database Password='123456';Data Source=" & mydata
    End Select

    cnn.Open strcnn    '打開數據庫鏈接

    '2、設置sql查詢語句
    mytable = "采購數據3"
    Set rs = CreateObject("ADODB.Recordset")

    sql = "select 采購數據3.ID,采購數據3.采購日期,采購數據3.供貨類型,采購數據3.采購分類,采購數據3.供應商,采購數據3.名稱,采購數據3.單位,采購數據3.單價,采購數據3.數量,采購數據3.金額,采購數據3.入賬日期" & " from " & mytable & " order by 采購日期"
    Set rs = cnn.Execute(sql)    '執行查詢,並將結果輸出到記錄集對象

    '3、復制數據庫數據

    With ActiveSheet
        .Cells.ClearContents

        For i = 0 To rs.Fields.Count - 1    '填寫標題
            .Cells(1, i + 1) = rs.Fields(i).Name
        Next i

        .Range("A2").CopyFromRecordset rs

        '.Cells.EntireColumn.AutoFit  '自動調整列寬
        '.Cells.EntireColumn.AutoFit  '自動調整列寬

    End With


    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing

End Sub


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM