我正在编写一些代码来重新格式化一些数据集。最后,我的输出数据集中有一些空列,我需要通过从另一个工作表查找值来填充这些空列(有效索引匹配)。
我尝试了很多方法,有两种成功了。问题是,它们太慢了,不幸的是我仅限于使用 VBA。作为前缀,我知道这个问题可以通过简单地在最后手动将索引匹配公式写入单元格并将它们拖下来来解决,但我试图让那些需要的人的生活尽可能简单每月执行此任务(也是为了减少出错的空间)。
背景信息:
ws_ps 示例 B 列作为查找值,如果 B 列中的行不为空,则填充 E 列
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?如果有任何指点,我将不胜感激。我仍然是一个初学者。
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