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

时间:2015-03-03 16:14:18

标签: excel vba excel-vba optimization pivot-table

我有2张,只有2列:

  • 旧网址
  • 新网址

一张(主)包含这两列的20k行,我有另一张(toImport),其中包含大约400行相同的两列。

由于重定向文件被发送到apache,我这样做是因为我们的Web环境发生了很大的结构变化,在导入20k行表中的那400行之前,我想评估一些场景:

  • 如果toImport文件中的旧对和新对已经在主文件中:不执行任何操作
  • 如果toImport文件中的旧URL位于主文件的新URL列中,请执行以下操作:
  • 将来自toImport文件的新URL值放在master的新URL值中(以便不创建级联重定向)
  • 还要从主文件中导入旧的/新对,以及在主文件中的原样(为了让用户在知道最后一个活动的URL时访问新页面)。

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

a - > B'/ P>

并在toImport文件中

b - > ç

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

a - > ç

b - > ç

最好的方法是什么?我想是VBA,还是数据透视表?有人能给我一些关于如何解决这个问题的想法。知道20k行循环400次可能很长,他们必须快速工作,但我不知道。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

假设旧网址和新网址位于两张表的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))

    对于toImport中旧网址或新网址与master中的旧网址和toImport中的新网址匹配的行,这将为您提供master的新网址对于没有的行。

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

    现在,您已处理toImport上更新master上现有网址的所有内容的更新。

  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具有旧网址的新值时,才会为您提供非空白值。

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

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

  7. 您可以通过录制上述步骤的手动执行宏来自动执行此过程。一般来说,这个宏工作不应该花费太多。

答案 1 :(得分:0)

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

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

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

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