我有一个For Each
循环可以完成我想要的操作,但是需要22分钟才能完成。我已经将类似的循环转换为数组比较,以加快处理速度,但是在使用多维数组方面并没有成功。
我有1个电子表格需要更新,第二个电子表格包含我需要在几列中找到的所有项目。
这是我用来更新电子表格中数据的代码。
lr_counter = inv_wb.Worksheets(6).Cells(Rows.Count, "A").End(xlUp).Row
Set rng1 = inv_wb.Worksheets(6).Range("A2:A" & lr_counter)
lr_counter = vl_wb.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row
Set rng2 = vl_wb.Worksheets(1).Range("A2:A" & lr_counter)
For Each cell In rng1
For Each cellx In rng2
If Not IsEmpty(cell.Value) And Trim(cell.Value) = Trim(cellx.Value) Then
cell.Offset(0, 1) = cellx.Offset(0, 1).Value
cell.Offset(0, 2) = cellx.Offset(0, 2).Value
cell.Offset(0, 3) = cellx.Offset(0, 3).Value
cell.Offset(0, 6) = cellx.Offset(0, 4).Value
cell.Offset(0, 7) = "Updated"
Exit For
End If
Next cellx
Next cell
目标是将其转换为可用的数组,以便在内存中而不是直接在工作表上进行比较。
我不完全了解多维数组的工作原理,并且在设置该函数时遇到了困难。
如何将数据加载到多维数组中?我想我可以自己进行比较,但不确定如何将其加载到数组中。
我想我将需要加载所有需要数据的列,并从查找电子表格中加载所有列,然后将找到的所有值返回到每一行。问题是我不确定如何将值应用于数组中行中的列。
说我有看起来像这样的工作表1:
Header 1 | Header 2 | Header 3 | Header 4 | Header 5
333 | | | |
222 | | | |
111 | | | |
444 | | | |
我有另一个电子表格,其中包含我要查找的所有更新数据。
Header 1 | Header 2 | Header 3 | Header 4
111 | 1/2/2018 | AAA | Active
222 | 1/4/2018 | BBB | Active
333 | 1/1/2018 | CCC | NA
444 | 1/12/2018| DDD | NA
我需要对照第二张工作表中的相同标题1检查标题1,然后将该行的所有值返回到第一张工作表。然后将工作表2中的最后一个标题(标题4)移到第一张工作表中的标题5。
应该在工作表1上返回类似的内容
Header 1 | Header 2 | Header 3 | Header 4 | Header 5
333 | 1/1/2018 | CCC | | NA
222 | 1/4/2018 | BBB | | Active
111 | 1/2/2018 | AAA | | Active
444 | 1/12/2018| DDD | | NA
我已经可以通过一些for循环比较电子表格上的值来做到这一点,但这很慢。 22分钟太长。我知道如何比较2个普通数组,但不知道如何与2D数组进行比较。
答案 0 :(得分:0)
我仍然想了解如何在2D数组中处理这些数据,因为我确定将来会需要它们,但是我确实设法创建了一些Vlookup的(如Marcucciboy2和{{ 3}}指出)将处理时间缩短到大约30秒。
如果有人感兴趣,这是我设法提供的代码,可将我的处理时间从22分钟缩短到30秒:
With inv_wb.Worksheets(6)
lr_counter = .Cells(Rows.Count, "A").End(xlUp).Row
Set rng1 = .Range("A2:A" & lr_counter)
lr_counter = vl_ws.Cells(Rows.Count, "A").End(xlUp).Row
Set rng2 = vl_ws.Range("A2:E" & lr_counter)
For Each cell In rng1
cellx = cell.Value
If Not Application.IfError(Application.VLookup(cellx, rng2, 1, False), "none") = "none" Then
cell.Offset(0, 1) = UCase(Application.VLookup(cellx, rng2, 2, False))
cell.Offset(0, 2) = Application.Text(Application.VLookup(cellx, rng2, 3, False), "MM/DD/YYYY")
cell.Offset(0, 3) = Application.VLookup(cellx, rng2, 4, False)
cell.Offset(0, 6) = Application.VLookup(cellx, rng2, 5, False)
cell.Offset(0, 7) = "Updated"
Else
cell.Offset(0, 7) = "No Update"
End If
Next cell
End With