不确定如何将该宏转换为使用多维数组而不是使用工作表比较

时间:2018-09-27 18:24:31

标签: arrays excel vba multidimensional-array

我有一个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数组进行比较。

1 个答案:

答案 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