在 20k 行 sheet 中导入 400 行并在导入前进行操作
Import 400 rows in 20k row sheet and manipulate before import
我有 2 个 sheet,只有 2 列:
- 旧URL
- 新建URL
一个 sheet (master) 包含这两列的 20k 行,我有另一个 sheet (toImport) 包含大约两列的 400 行。
因为它是用于发送到 apache 的重定向文件,而且我这样做是因为我们的网络环境发生了很大的结构变化,所以在将这 400 行导入 20k 行之前 sheet 我想评估一些场景:
- 如果 toImport 文件中的新旧对已经在主文件中:什么也不做
- 如果 toImport 文件中的旧 URL 在主文件中的新 URL 列中,请执行以下操作:
- 将 toImport 文件中的新 URL 值放入 master 的新 URL 值中(以免创建级联重定向)
- 同时从 toImport 导入 old/new 对,原样在主文件中(以便用户在知道最后一个活动 URL 的情况下访问新页面)。
换句话说,如果我有,在主文件中
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 列中,你可以执行以下过程:
分别按 A 列对 master
和 toImport
进行排序。
将以下公式添加到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.
复制(或剪切)master
的 C 列并将值粘贴到 B 列。
现在,您已经处理了 toImport
上所有更新 master
上现有 URL 的所有更新。
将以下内容添加到 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 有新值时,才会为您提供非空值。
过滤 toImport
C 列不为空的行。
复制 toImport
的 C 列和 D 列中的非空白单元格块,并将值粘贴到 master
的 A 列和 B 列的底部。
您可以通过录制手动执行上述步骤的宏来自动执行此过程。使这个宏在一般情况下工作应该不需要太多。
我有 2 个 sheet,只有 2 列:
- 旧URL
- 新建URL
一个 sheet (master) 包含这两列的 20k 行,我有另一个 sheet (toImport) 包含大约两列的 400 行。
因为它是用于发送到 apache 的重定向文件,而且我这样做是因为我们的网络环境发生了很大的结构变化,所以在将这 400 行导入 20k 行之前 sheet 我想评估一些场景:
- 如果 toImport 文件中的新旧对已经在主文件中:什么也不做
- 如果 toImport 文件中的旧 URL 在主文件中的新 URL 列中,请执行以下操作:
- 将 toImport 文件中的新 URL 值放入 master 的新 URL 值中(以免创建级联重定向)
- 同时从 toImport 导入 old/new 对,原样在主文件中(以便用户在知道最后一个活动 URL 的情况下访问新页面)。
换句话说,如果我有,在主文件中
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 列中,你可以执行以下过程:
分别按 A 列对
master
和toImport
进行排序。将以下公式添加到
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 =] intoImport
和 New URL frommaster
for rows that don't.复制(或剪切)
master
的 C 列并将值粘贴到 B 列。现在,您已经处理了
toImport
上所有更新master
上现有 URL 的所有更新。将以下内容添加到
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 有新值时,才会为您提供非空值。过滤
toImport
C 列不为空的行。复制
toImport
的 C 列和 D 列中的非空白单元格块,并将值粘贴到master
的 A 列和 B 列的底部。
您可以通过录制手动执行上述步骤的宏来自动执行此过程。使这个宏在一般情况下工作应该不需要太多。