【问题标题】:Access 2013 - Quickest way to read in Excel dataAccess 2013 - 读取 Excel 数据的最快方法
【发布时间】:2017-07-18 21:17:20
【问题描述】:

我的部分访问代码是从现有的 excel 文件中读取数据。我已经能够弄清楚如何做到这一点,但是需要很长时间才能处理。 excel 文件大约有 400 行,我只是从两列中抓取数据并将其放入多维数组中。

Dim excelapp As Excel.Application
Dim strBxNum As String: strBxNum = "bx" & strInd
Dim i As Integer
Dim r As Integer
Set excelapp = CreateObject("Excel.Application")
Dim WkBk As Excel.Workbook
Set WkBk = excelapp.Workbooks.Open(fileName:=strFileName)

i = 6
r = 0

Do While WkBk.Sheets(3).Range("C" & i) <> ""
  strWriteUp(r, 0) = WkBk.Sheets(3).Range("C" & i)
  strWriteUp(r, 1) = WkBk.Sheets(3).Range("P" & i)

  i = i + 1
  r = r + 1
Loop

有没有更有效的方法?

【问题讨论】:

  • 最终目标是什么?你用数组做什么? Access 可以在查询中直接读取工作簿!
  • 将 Access 中的工作表链接为链接表可能会更快。然后使用代码阅读此内容以过滤请求的数据。没有样本数据,很难更具体。
  • 最终目标是比较两个电子表格的差异。在阅读了你的两个 cmets 之后,我觉得有一个更好的方法来解决它。我是 VBA 的新手,您能否提供这些其他选项的链接?

标签: excel ms-access vba ms-access-2013


【解决方案1】:

逐个单元格的操作往往比使用数组一次性读取范围要慢得多(尤其是跨应用程序边界)。

例如

Dim excelapp As Excel.Application
Dim strBxNum As String: strBxNum = "bx" & strInd
Dim i As Long, lr As Long
Dim WkBk As Excel.Workbook, arrC, arrP

Set excelapp = CreateObject("Excel.Application")
Set WkBk = excelapp.Workbooks.Open(fileName:=strFileName)

i = 6

With WkBk.Sheets(3)
    lr = .Cells(.Rows.Count, "C").End(xlUp).Row
    arrC = .Range(.cells(i, "C"), .Cells(lr, "C") ).Value
    arrP = .Range(.cells(i, "P"), .Cells(lr, "P") ).Value
End With

这将为您提供两个基于 1 的二维数组(1 到 #rows,1 到 1),您可以按原样使用它们,也可以循环并组合成一个二维数组。

编辑将 arrP 放入 arrC:

Dim n As Long, nR as Long

nR = ubound(arrC, 1)
ReDim Preserve arrC(1 to nR, 1 to 2)
For n = 1 to nR
    arrC(n, 2) = arrP(n, 1)
next n

【讨论】:

  • 确实运行得更快。所以我试图检查以确保数据通过简单的“MsgBox arrP(2)”行进入数组,但在该行上出现“下标超出范围”错误。我做了一个 UBound 并且数组大小看起来不错,但不知道为什么我不能检查数据。
  • MsgBox arrP(2,1) - 这是一个二维数组。
  • 好的,我确实尝试过......但无法弄清楚如何“循环并组合成单个二维数组”。
猜你喜欢
  • 2012-05-17
  • 2013-08-19
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多