VBA 加速大型数据集的索引匹配

问题描述 投票:0回答:1

我正在编写一些代码来重新格式化一些数据集。最后,我的输出数据集中有一些空列,我需要通过从另一个工作表查找值来填充这些空列(有效索引匹配)。

我尝试了很多方法,有两种成功了。问题是,它们太慢了,不幸的是我仅限于使用 VBA。作为前缀,我知道这个问题可以通过简单地在最后手动将索引匹配公式写入单元格并将它们拖下来来解决,但我试图让那些需要的人的生活尽可能简单每月执行此任务(也是为了减少出错的空间)。

背景信息:

  • 输出表 (ws_ps) 有约 150,000 行,B 列中的每个值都需要循环以填充其他列。

ws_ps 示例 B 列作为查找值,如果 B 列中的行不为空,则填充 E 列

  • 查找表 (ws_priips) 有约 50,000 行

ws_priips 示例 G 列对应于 ws_ps B 列中的查找值,要查找的值来自 E 列

方法 1:循环遍历每一行并使用 WorksheetFunction - 12 分钟运行时间

    On Error Resume Next
    last_row_ps = ws_ps.UsedRange.Rows.Count
    For ps_row = 2 To last_row_ps
        ws_ps.Cells(ps_row, 5).Value = WorksheetFunction.IfError(WorksheetFunction.Index(ws_priips.Range("A:G"), _
        WorksheetFunction.Match(ws_ps.Cells(ps_row, 2), ws_priips.Range("G:G"), 0), 5), "")
    Next ps_row
    On Error GoTo -1

方法 2:将工作表加载到数组中,如果满足条件则写入工作表 - 15 分钟运行时间

    last_row_ps = ws_ps.UsedRange.Rows.Count
    last_row_priips = ws_priips.UsedRange.Rows.Count
    ps_array = ws_ps.Range("A1:X" & last_row_ps).Value
    priips_array = ws_priips.Range("A1:AZ" & last_row_priips).Value
    
    For ps_row = 2 To UBound(ps_array, 1)
        For priips_row = 2 To UBound(priips_array, 1)
            If ps_array(ps_row, 2) <> "" Then
                If ps_array(ps_row, 2) = priips_array(priips_row, 7) Then
                    ws_ps.Cells(ps_row, 5).Value = priips_array(priips_row, 5)
                    GoTo SkipLoop
                End If
            Else
                GoTo SkipLoop
            End If
        Next priips_row
SkipLoop:
    Next ps_row

我运气不好吗?到目前为止,我只为 1 列实现了这些解决方案,但我需要将其应用到大约 10 列。有没有什么方法可以大大加快速度,而无需将函数键入工作表或使用 python?如果有任何指点,我将不胜感激。我仍然是一个初学者。

excel vba database optimization index-match
1个回答
0
投票

Power Query 是一个选项吗? 未经测试,因此您可能需要调整一两件事:

let
    // Load 'ws_ps' and 'ws_priips' queries
    ps_query = Excel.CurrentWorkbook(){[Name="ws_ps"]}[Content],
    priips_query = Excel.CurrentWorkbook(){[Name="ws_priips"]}[Content],

    // Merge 'ps_query' with 'priips_query' using Column B and Column G
    merged_table = Table.NestedJoin(ps_query, "Column B", priips_query, "Column G", "priips_data", JoinKind.LeftOuter),

    // Expand the 5th column (E) from the merged data
    expanded_table = Table.ExpandTableColumn(merged_table, "priips_data", {"Column E"}),

    // Replace null values with an empty string
    result_table = Table.ReplaceValue(expanded_table, null, "", Replacer.ReplaceValue, {"Column E"})
in
    result_table
© www.soinside.com 2019 - 2024. All rights reserved.