如何在VBA中循环400万数组时减少时间成本?

2024-04-27

我需要使用 VBA 执行“vlookup”功能。我需要从包含 460 万条记录的 Access 数据库中查找数据。

Private Sub connectDB()
 Dim sqlstr As String
 Dim mydata As String
 Dim t, d, conn, rst, mydata
 Dim arr, arr1
 t = Timer
 Set d = CreateObject("scripting.dictionary")
 Set conn = CreateObject("ADODB.Connection")
 Set rst = CreateObject("ADODB.Recordset")
 mydata = "mydatabase"
 strconn = "Provider = Microsoft.ACE.OLEDB.16.0; Data Source = " & mydata
 sqlstr = "select Tracking, MAWB from total"
 rst.Open sqlstr, strconn, 3, 2
 arr1 = Array("Tracking", "MAWB")
 arr = rst.GetRows(-1, 1, arr1)
STOP
#Above cost 1mins
 For i = 0 To UBound(arr, 2)
    d(arr(0, i)) = arr(1, i)
Next
STOP
#Put data into dictionary always costs me 20 mins

上述过程总是花费我大约 20 分钟。其中大部分都花在将数据放入字典上

无论如何减少时间成本?


您可以通过实现自己的方法来显着减少查找时间哈希表/字典 https://en.wikipedia.org/wiki/Hash_table.

下面是一个在 5 秒内索引 400 万数组的示例:

Private Declare PtrSafe Function RtlComputeCrc32 Lib "ntdll.dll" ( _
  ByVal start As Long, ByVal data As LongPtr, ByVal size As Long) As Long

Sub Example()
  Dim data(), slots() As Long, i As Long

  ' generate some records '

  ReDim data(0 To 1, 0 To 4000000)
  For i = 0 To UBound(data, 2)
    data(0, i) = CStr(i)
  Next

  ' index all the keys from column 1 '

  MapKeys slots, data, column:=0

  ' lookup a key in column 1 '

  i = IndexOfKey(slots, data, column:=0, key:="4876")

  If i >= 0 Then
    Debug.Print "Found at index " & i
  Else
    Debug.Print "Missing"
  End If

End Sub


Public Sub MapKeys(slots() As Long, data(), column As Long)
  Dim bucketsCount&, key$, r&, i&, s&, h&      
  bucketsCount = UBound(data, 2) * 0.9   ' n * load factor '
  ReDim slots(0 To UBound(data, 2) + bucketsCount)

  For r = 0 To UBound(data, 2) ' each record '
    key = data(column, r)
    h = RtlComputeCrc32(0, StrPtr(key), LenB(key)) And &H7FFFFFF  ' get hash '
    s = UBound(slots) - (h Mod bucketsCount)                      ' get slot '
    Do
      i = slots(s) - 1& ' get index (base 0) '

      If i >= 0& Then  ' if index for hash '
        If data(column, i) = data(column, r) Then Exit Do  ' if key present, handle next record '
      Else
        slots(s) = r + 1&  ' add index (base 1) '
        Exit Do
      End If

      s = i  ' collision, index points to the next slot '
    Loop
  Next
End Sub

Public Function IndexOfKey(slots() As Long, data(), column As Long, key As String) As Long
  Dim h&, s&, i&
  h = RtlComputeCrc32(0, StrPtr(key), LenB(key)) And &H7FFFFFF    ' get hash  '
  s = UBound(slots) - (h Mod (UBound(slots) - UBound(data, 2)))   ' get slot  '
  i = slots(s) - 1&                                               ' get index (base 0) '

  Do While i >= 0&
    If data(column, i) = key Then Exit Do  ' break if same key '
    i = slots(i) - 1&                      ' collision, index points to the next slot '
  Loop

  IndexOfKey = i
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在VBA中循环400万数组时减少时间成本? 的相关文章

  • 有没有办法以编程方式检查 Excel 文件是否已打开

    我想检查特定的 Excel 文件是否已打开 否则 当我在 C 程序中重新打开同一文件时 它将以只读格式打开 有什么方法可以查出文件是否已经打开 如果该文件被另一个程序打开 则此代码可以帮助您找出该文件 但您将无法打开它 protected
  • C# 将表导出到 Excel

    如何使用以下方法将此数据表导出到 Excel Microsoft Office Interop Excel 我有这个代码 女巫抓取主表中的所有数据 并希望将其导出到 Excel 以获得更好的视图 不想使用数据网格 我认为有很多关于这个主题的
  • Excel VBA:通过快捷键运行打开文档后宏挂起,但从 VB 编辑器运行完美

    我遇到了一个奇怪的问题 我决定分配一个键盘快捷键Ctrl Shift P我的 VBA 例程之一 该例程假设打开一个现有的 Excel 工作簿 复制一些信息并 SaveAs另一个名字 当我在 Visual Basic 编辑器中点击 播放 时
  • 使用 Apache POI 将结果集转换为 Excel (*.xlsx) 表

    我正在尝试写结果集到 Excel xlsx 表使用 Apache Poi Office Excel 中的无效表对象错误 但是 即使它写入 Excel 文件时没有任何错误 但当我尝试在 Office Excel 2013 中打开它时 它会显示
  • 在 Microsoft Access 中编写查询,字段描述错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何通过VBA刷新所有单元格

    有没有办法触发 从VBA Excel要求它重新评估所有Excel单元格 谢谢 The 计算 http msdn microsoft com en us library aa223802 28office 11 29 aspx方法可以重新计算
  • 如何在 C# 中将 excel ListObject 添加到给定工作表?

    我目前正在 C 中开发一个 Excel 插件 其中包含多种方法 表值函数 可供 Excel 用户和程序员 VBA 使用 如何编写一个方法 将新的 ListObject Excel 表 添加到给定的 Excel 工作表 并将给定的 DataT
  • Excel Active-X 按钮无法单击

    我有一个在 Excel 中应该可以点击的按钮 当我尝试单击它时 什么也没有发生 我注意到 如果我单击并按住右下角的鼠标 则会出现第二个按钮 这种情况过去发生过 当我移动鼠标单击该按钮时 我可以单击 一切都会正常 但这一次 当我移动鼠标时 按
  • VBA 窗体最多可以容纳多少个控件?

    我目前正在构建一个 Excel 2003 应用程序 该应用程序需要非常复杂的表单 并且担心控件数量的限制 目前它有 154 个控件 使用Me Controls Count 这应该是准确的 对吧 但可能只完成了大约三分之一 工作流程确实适合单
  • 带有 For 循环的多维数组 VBA

    尝试检查第一列中的值 即多维数组中的列 如果它匹配 则对另一列中与该行匹配的值进行排序 我认为我做错了 但这是我第一次搞乱多维数组 我是否需要在每个 for 循环中使用 UBound 和 LBound 来告诉它要查看哪一列 除了当前问题的答
  • VBA 下标超出工作簿名称范围

    我从网上拉了一些代码来打开文件夹中的最新文件 这似乎工作得很好 然而 在代码的后面 我添加了一行附加行来设置最近打开的同一文件 尝试此操作时 工作簿 subscipt 超出范围 我认为这与语法有关 可能需要在工作簿名称中添加额外的引号 有什
  • 通过vba在每个空间范围之间添加求和公式

    我试图进行自动化 但我被困在这里 我需要在空间范围之间动态添加总和公式 我完全迷失了使用 VBA 添加公式的能力 任何人都可以帮助我 先感谢您 我假设您想要的是 如果单元格中有空白 您希望将所有其他元素相加并将结果放置在该空白中 可能有很多
  • 运行时错误:范围自动筛选上的“1004”

    我想用 VBA 做什么 使用数组过滤表并删除行 我的数组有 4 个元素 在循环中更改为有 5 个不同的集合 正在过滤的列有 5 个元素 我只想得到 1 这是一个循环 它将创建 5 个报告 每个报告根据第 29 列过滤不同的元素 如果在调试模
  • 连接两列之间的排列

    我需要有关 Excel 作业的帮助 Name City John London Maxx NY Ashley DC Paris 解决这个问题的方法必须是 John london John NY John DC John Paris Maxx
  • 在 Word 2010 中复制形状而不使用 .Select?

    是否可以在 Word 2010 中复制形状而无需借助 Select 根据开发中心 http msdn microsoft com en us library office ff835500 aspx the Anchor属性返回形状的锚定范
  • 更改使用 ClosedXML 显示的工作表

    我正在使用 ClosedXML 动态创建包含多个工作表的 Excel 工作簿 生成内容后 我正在努力将所选工作表更改回工作簿中的第一个工作表 并且在文档中找不到有关如何更改显示的工作表的任何内容 我努力了 wb Worksheet 1 Se
  • VBA:删除数组项后减少循环迭代?

    在 Excel 的 VBA 中 For i 0 To UBound artMaster For j i To UBound artMaster If i lt gt j And artMaster i VDN artMaster j VDN
  • 在函数上使用子例程的目的

    我已经使用 Access 一段时间了 尽管我了解 Function 相对于 Sub 的明显好处是它可以返回值 但我不确定为什么我应该使用 Sub 而不是一个函数 毕竟 除非我弄错了 函数可以做所有 Subs 可以做的事情吗 注意 我完全知道
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 双击事件 - 多个范围

    我正在寻找为双击事件在多个范围内进行编码的最佳方法 Private Sub Worksheet BeforeDoubleClick ByVal Target As Range Cancel As Boolean If Not Interse

随机推荐