【问题标题】:getting data from Access using vba using data from excel使用来自 excel 的数据使用 vba 从 Access 获取数据
【发布时间】:2017-09-21 21:36:43
【问题描述】:

我正在尝试使用 excel 列从 Access 中提取数据。

我尝试了以下代码,但是当 excel 中的行数超过 5k 行时,它不会花费太多时间。有谁知道引用 excel 数据以获得结果的更好方法:

Sub ddd()
Const dbloc As String = "C:\Users\mysystem\Downloads\Database11.accdb"
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim xlbook As Workbook
Dim xlsheet As Worksheet 
Dim a As Long
Dim SQL As String


Set xlbook = ActiveWorkbook
Set xlsheet = xlbook.Worksheets(1)
xlsheet.Range("B2:Z100000").ClearContents

Set db = OpenDatabase(dbloc)

SQL = "SELECT Material, MPN  "
SQL = SQL & "FROM Sheet2 "

SQL = SQL & "WHERE Material IN ("
Dim r As Range
For Each r In Range("A2:A19098")
   SQL = SQL & r.Text & ","
Next r
SQL = Left(SQL, Len(SQL) - 1) 'Drop last comma
SQL = SQL & ")"

' i want to change this for loop because my range might vary from 80-100k 
  rows and this method is not working. i got a suggestion here that i can 
  use a table for this. But i am new to macros and access and not sure of 
  the syntax. Can anyone please help with the syntax. Assuming tablename for 
  the excel data is column1 and ranges from a2:a100000


Set rs = db.OpenRecordset(SQL)
', dbOpenSnapshot)
If rs.RecordCount = 0 Then
MsgBox "No data retrieved from database", vbInformation + vbOKOnly, "No 
Data"
    GoTo SubExit
Else
    rs.MoveLast
    recCount = rs.RecordCount
    rs.MoveFirst
End If
 xlsheet.Range("C2").CopyFromRecordset rs

End Sub

任何帮助我都会非常感激。谢谢!!

【问题讨论】:

  • using a column 是什么意思? ....我想你想说... but it is taking too much time ... ...请更新你的问题
  • 我在 Access 中实现了类似的操作——根据过滤后的键值记录集更新表中的数据。当每个查询使用 100 个键的块时,我获得的最佳性能。您使用具有 19000 个键的块,这可能会很慢。检查访问表是否在关键字段中有索引。在您的情况下,SQL 文本也可能超过 64K。
  • 嗨@jsotola,在这里使用列意味着,我正在检查我的excel wb 中的列中的条目以从访问数据库中检索结果。你是对的,......但它花费了太多时间......你知道更好的方法来解决这个问题吗?我是访问和宏的新手,所以请帮助语法以及谢谢!
  • 如果您的代码可以正常运行,但运行速度太慢,请在此处提交以供审核 .... codereview.stackexchange.com
  • 您知道引用 excel 列的更好方法吗?以表格为例

标签: excel ms-access vba


【解决方案1】:

如果您正在寻找引用 Excel 列的替代方法,可以使用以下方法:

SQL = "SELECT Material, MPN  "
SQL = SQL & "FROM Sheet2 "

SQL = SQL & "WHERE Material IN ("
SQL = SQL & "SELECT * FROM [A1:A19098] IN '"
SQL = SQL & ActiveWorkbook.FullName & "'"
SQL = SQL & " 'Excel 12.0 Macro;')"

这允许 DAO 数据库引擎通过 OleDb 直接查询您的 Excel 文件,而不是将每一行作为文本传递,这样应该会更有效。

在执行此操作之前应保存 Excel 文件(最好从不同的文件触发它,但从同一个文件触发时对我有用)。

请注意,我故意多包含 1 行,因为在使用时第一行包含列名。

我假设您使用的是 .xlsm 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2020-07-14
    • 2013-11-27
    相关资源
    最近更新 更多