在 20k 行 sheet 中导入 400 行并在导入前进行操作

Import 400 rows in 20k row sheet and manipulate before import

我有 2 个 sheet,只有 2 列:

一个 sheet (master) 包含这两列的 20k 行,我有另一个 sheet (toImport) 包含大约两列的 400 行。

因为它是用于发送到 apache 的重定向文件,而且我这样做是因为我们的网络环境发生了很大的结构变化,所以在将这 400 行导入 20k 行之前 sheet 我想评估一些场景:

换句话说,如果我有,在主文件中

a -> b

并在 toImport 文件中

b -> c

我希望能够在主文件中执行以下操作

a -> c

b -> c

最好的方法是什么? VBA 我想,还是枢轴 table?有人可以给我一些关于如何解决这个问题的想法。知道 20k 行循环 400 次可能会很长,它们一定是解决此问题的快速方法,但我不知道。

感谢您的帮助。

我会在 VBA 变体数组中获取两组数据,然后循环进行测试,然后将数组放回原处。那可能足够快了。如果它不够快,那么您可以对数据进行排序并使用二进制搜索。

关键技巧是使用一条语句将整个范围放入一个数组中:

Dim vMaster as variant
vMaster=Worksheets("Master").Range("a1:B20400")

更新数组后,您可以通过反转赋值将其写回。

假设你的旧 URL 和新 URL 在两张表的 A 和 B 列中,你可以执行以下过程:

  1. 分别按 A 列对 mastertoImport 进行排序。

  2. 将以下公式添加到master的C列:

    = IF(ISNA(VLOOKUP(A1, toImport!A:A, 1, FALSE)), IF(ISNA(VLOOKUP(B1, toImport!A:A, 1, FALSE)), B1, VLOOKUP(B1, toImport!A:B, 2, FALSE)), VLOOKUP(A1, toImport!A:B, 2, FALSE))

    对于 master 中的旧 URL 或新 URL 匹配旧 [=69] 的行,这将为您提供来自 toImport 的新 URL =] in toImport 和 New URL from master for rows that don't.

  3. 复制(或剪切)master 的 C 列并将值粘贴到 B 列。

    现在,您已经处理了 toImport 上所有更新 master 上现有 URL 的所有更新。

  4. 将以下内容添加到 toImport 的 C 和 D 列:

    = IF(ISNA(VLOOKUP(A1, master!A:A, 1, FALSE)), A1, "")
    = IF(ISNA(VLOOKUP(A1, master!A:A, 1, FALSE)), B1, "")

    仅当 toImport 对旧值 URL 有新值时,才会为您提供非空值。

  5. 过滤 toImport C 列不为空的行。

  6. 复制 toImport 的 C 列和 D 列中的非空白单元格块,并将值粘贴到 master 的 A 列和 B 列的底部。

您可以通过录制手动执行上述步骤的宏来自动执行此过程。使这个宏在一般情况下工作应该不需要太多。