是否有 Excel 函数或脚本来查找两个不同 sheet 中匹配的字段并将其替换为第二个 sheet 中包含的另一个数据?

Is there an Excel function or a script to find and replace fields that match in two different sheets by another data contained in the second sheet?

今天是我第一次使用 Open Office,我需要一些帮助才能开始使用。 我的老板给了我两个 Excel 个文件,其中包含我必须完成的数据。

如果 sheet 中的代码与 'A' 中包含的代码匹配,我需要向包含商店代码的第一个 sheet 添加一列。

这不是我的工作,但由于每个人都离开了暑假,他让我去做。

我的问题是两个 sheet 都超过 12 000 行,而且我知道只有 700 到 800 篇文章可以匹配。自从我第一次使用 Excel/OpenOffice(我知道我知道...)以来,我想知道是否有一种方法可以使这项工作自动化,可以使用 OpenOffice,也可以使用脚本来完成。我发现了很多类似的 post,但其中 none 正是我所需要的。

欢迎任何帮助。 谢谢!

我会首先尝试让它 运行 忽略内存问题,并且只在遇到该问题时才修复该问题。 12,000 似乎很多,但您可能会惊讶于您可以 python 投入并获得 "just work"。我在编程中遇到excel之类的时候几乎只用csv文件...

import csv

#    B.csv:
#    store#  part#
#      xx     xx
#      xx     xx
#      xx     xx
#    ...

partNums = {}
with open('B.csv') as bfile:
    breader = csv.DictReader(bfile)
    for row in breader:
        partNums[row['part#']] = row['store#']

#    A.csv
#    part#  tag1  tag2  tag3 ...
#    xx     xx    xx    xx   ...
#    xx     xx    xx    xx   ...
#    xx     xx    xx    xx   ...
#    ...


with open('outfile.csv', 'wb') as outfile:
    with open('A.csv', 'rb') as afile:
        areader = csv.reader(afile)
        outwriter = csv.writer(outfile)
        headers = areader.next()
        headers.append('StoreCode')
        outwriter.writerow(headers)
        for row in areader:
            if row[0] in partNums:  #assuming first row is part#
                row.append(partNums[row[0]])
            else:  #value if no store number exists
                row.append('')
            outwriter.writerow(row)

您也可以尝试使用 VLOOKUP() 公式。它可能在 Calc 中使用 .xls 文件,但为了安全起见,我会先将它们都保存为 .ods。您可以将公式写在 File1 中空列的顶部,例如:

=VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A:$B000;2;0)

本教程解释了 VLOOKUP 的语法示例:VLOOKUP questions and answers

确保在列字母和行号前面包含 $ 符号 - 这会告诉电子表格在您 copy/paste 公式时不调整这些字母和数字。当 copy/pasted 时,第一个参数(此处为 A1)将被调整为 A2、A3 等,因此公式将匹配每一行上的适当商店代码。

第一个单元格开始工作后,使用 VLOOKUP 公式复制该单元格。然后单击名称框(它位于公式栏的左侧)并输入要将该公式粘贴到的范围,例如 H2:H12000 并按回车键。您键入的范围应突出显示。现在粘贴你的公式。

应显示所有匹配代码,不匹配的代码将显示 #N/A。如果你想要空白而不是 #N/A 你可以做类似

=IF(ISERROR(VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A:$B000;2;0);"";VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A:$B000;2;0))

基本上就是说 "if this formula returns an error; then show a blank; otherwise show the result of this formula"