【问题标题】:Importing data from access to excel using vba使用 vba 将数据从 access 导入到 excel
【发布时间】:2015-06-17 19:08:13
【问题描述】:

我正在尝试将位于桌面上的名为“Computer.accdb”的访问数据库中的“内存”表中的数据导入 Excel。我能够在网上找到一个代码并且它能够运行但它不能正常工作。我使用 Microsoft ActiveX 数据对象 6.1 库在 Excel 中添加了对 ADO 对象库的引用。以下是以下代码:

Sub automateAccessADO_9()
'Using ADO to Import data from an Access Database Table to an Excel worksheet (your host application).
'refer Image 9a to view the existing SalesManager Table in MS Access file "SalesReport.accdb".

'To use ADO in your VBA project, you must add a reference to the ADO Object Library in Excel (your host application) by clicking Tools-References in VBE, and then choose an appropriate version of Microsoft ActiveX Data Objects x.x Library from the list.

'--------------
'DIM STATEMENTS

Dim strMyPath As String, strDBName As String, strDB As String, strSQL As String
Dim i As Long, n As Long, lFieldCount As Long
Dim rng As Range

'instantiate an ADO object using Dim with the New keyword:
Dim adoRecSet As New ADODB.Recordset
Dim connDB As New ADODB.Connection

'--------------
'THE CONNECTION OBJECT

strDBName = "Computer.accdb"
strMyPath = ThisWorkbook.Path
strDB = strMyPath & "\" & strDBName

'Connect to a data source:
'For pre - MS Access 2007, .mdb files (viz. MS Access 97 up to MS Access 2003), use the Jet provider: "Microsoft.Jet.OLEDB.4.0". For Access 2007 (.accdb database) use the ACE Provider: "Microsoft.ACE.OLEDB.12.0". The ACE Provider can be used for both the Access .mdb & .accdb files.
connDB.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0; data source=" & strDB

'--------------
'OPEN RECORDSET, ACCESS RECORDS AND FIELDS

Dim ws As Worksheet
'set the worksheet:
Set ws = ActiveWorkbook.Sheets("Sheet1")

'Set the ADO Recordset object:
Set adoRecSet = New ADODB.Recordset

'Opening the table named SalesManager:
strTable = "memory"

'--------------
'COPY RECORDS FROM ALL FIELDS OF A RECORDSET:
'refer Image 9d to view records copied to Excel worksheet

adoRecSet.Open Source:=strTable, ActiveConnection:=connDB, CursorType:=adOpenStatic, LockType:=adLockOptimistic

Set rng = ws.Range("A1")
lFieldCount = adoRecSet.Fields.Count

For i = 0 To lFieldCount - 1
'copy column names in first row of the worksheet:
rng.Offset(0, i).Value = adoRecSet.Fields(i).Name
adoRecSet.MoveFirst

'copy record values starting from second row of the worksheet:
n = 1
Do While Not adoRecSet.EOF
rng.Offset(n, i).Value = adoRecSet.Fields(i).Value
adoRecSet.MoveNext
n = n + 1
Loop

Next i

'select column range to AutoFit column width:
Range(ws.Columns(1), ws.Columns(lFieldCount)).AutoFit
'worksheet columns are deleted because this code is only for demo:
Range(ws.Columns(1), ws.Columns(lFieldCount)).Delete
adoRecSet.Close

'close the objects
connDB.Close

'destroy the variables
Set adoRecSet = Nothing
Set connDB = Nothing

End Sub 

【问题讨论】:

  • 它不能正常工作不是一个有意义的问题描述。它以什么具体方式不起作用
  • 如果您只想将整个表“内存”复制到 Excel,使用 DoCmd.TransferSpreadsheet 有一种更简单的方法。我在您的代码中看不到为什么您不能只使用它,但我可能会遗漏一些东西。
  • 看看能不能用Excel的Range.CopyFromRecordset Method
  • 它能够运行,但我看到的只是访问表的第一个字段被复制到单元格(A1)然后它就消失了@Ken White
  • 对不起,我是新手,尤其是在 VBA 上编写宏或编码,所以我仍在学习这个@hypetech

标签: excel vba ms-access import


【解决方案1】:

如果您只想将表格转移到excel,请使用

DoCmd.TransferSpreadsheet(acExport,, "memory", "file path of excel table")

如果您想在传输数据时以某种方式更改数据,您的代码看起来最有用,但看起来您并没有这样做,因此这是运行相同例程的更简单的方法。

【讨论】:

  • 这仅在我在访问权限中使用此代码时才有效?我正在尝试在 excel 中导入访问数据库文件,但我希望能够将它们放置在某些单元格中。我上面复制的代码只是为了让我看看它是如何工作的。但是谢谢,这段代码对我也很有用。 @hypetech
  • 是的,您在访问中运行此代码。但是如果你想把数据放在某些单元格中,它就不起作用了,它只是把所有的东西都扔到了excel中。
  • 知道了,我需要能够在 excel 中导入访问文件。不过谢谢你,我肯定会将此代码用于我的其他项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2021-02-25
  • 2013-04-16
  • 2019-02-06
  • 1970-01-01
  • 2015-10-15
相关资源
最近更新 更多