如何将excel电子表格中的2行匹配2列?

Posted

技术标签:

【中文标题】如何将excel电子表格中的2行匹配2列?【英文标题】:How to Match 2 rows in excel spreadsheet by 2 columns? 【发布时间】:2018-02-14 22:05:15 【问题描述】:

我有一个问题,我目前正在使用多个查询来实现我想要的结果,但是当在较大的电子表格上运行时,它的速度会大大降低。一些信息:

有问题的 Excel 工作簿具有 .xlsx 扩展名; Excel文件中的两张表是Matched和`Unmatched'; 连接类型可以使用ODBCOleDB; 需要匹配的所有数据都位于 Excel 的一张表上; 匹配的数据需要成对出现,所以必须等于 2; 要匹配的 2 列是 ReceiptAmount,其中两行的 Receipt 必须完全匹配 并且两行的金额必须平衡或相等0。一个 金额 值的开头会带有一个负号 (-),因此可以将这些金额相加以平衡,但它们位于不同的行上; 行数可以从几百到几千(~60,000)不等;和 如果两行匹配/平衡 Receipt Amount,则需要将它们移动到Matched 表中相同的 Excel 文件。 脚本并非不可能,欢迎使用 VBScript 和 Powershell。

例子:

正如您在 Excel 示例中看到的,我需要匹配 Receipt 值完全匹配且 Amount 值平衡的 2 行。如果两个条件都满足,那么我需要将所述行插入到Matched 表中。因此,在此示例中,Receipt 列中带有101010 的两行(第 2 行和第 3 行)的金额在 Amount 列中都保持平衡,因此它们将被移至Matched 满足这两个条件。 Receipt 中的其余两个值匹配,但它们的 Amount 值不平衡,因此它们将满足条件。

限制是可用于 ODBC 和 OleDB 连接的语句。我目前正在使用多个查询来匹配并返回上述条件的行数,如果它等于两个,那么我知道将该 Receipt 编号的所有行插入到Matched 表中;但是,就像我说的,我需要它更高效、更快地执行。

【问题讨论】:

我认为在 Excel 中尝试执行此操作会遇到很多限制,而不是真正的 SQL/BI 平台。 我知道,但不幸的是我无法改变这一点,所以我必须找到可以使用的最佳选择。 您是否尝试过使用 VBA 来解决这个问题,它会查看行、找到匹配项并移动它们? 使用 VBA,它是为这类事情量身定做的...... 我觉得您在问题描述中遗漏了一些内容。听起来您正在尝试将此电子表格与外部的东西集成,但您还没有真正指定它是什么。 【参考方案1】:

这是一个 VBA 建议 - 它希望原始数据位于名为“原始”的选项卡中,并将在收据上排序,然后执行几个公式来确定收据#的计数为零,然后创建一个名为的新选项卡'Match' 与匹配的收据行,另一个称为 'Unmatch' 与不匹配的收据。

    Sub TallySplit()
        vLR = Cells(Rows.Count, 1).End(xlUp).Row
        ActiveWorkbook.Worksheets("Original").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Original").Sort.SortFields.Add Key:=Range("A2:A" & vLR), _
            SortOn:=xlSortOnValues, Order:=xlAscending,         DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Original").Sort
            .SetRange Range("A1:D" & vLR)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Range("E2").Select
        ActiveCell.FormulaR1C1 = "=IF(R[-1]C[-4]=RC[-4],R[-1]C[-3] + RC[-3],RC[-3])"
        Range("E2").Select
        Selection.AutoFill Destination:=Range("E2:E" & vLR)
        Range("E2:E" & vLR).Select
        Range("F2").Select
        ActiveCell.FormulaR1C1 = "=IF(RC[-5]=R[1]C[-5],R[1]C,RC[-1])"
        Range("F2").Select
        Selection.AutoFill Destination:=Range("F2:F" & vLR)
        Range("F2:F" & vLR).Select
        Range("A1").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$F$" & vLR).AutoFilter Field:=6, Criteria1:="<>0", _
            Operator:=xlAnd
        Range("A1:D" & vLR).Select
        Selection.Copy
        Sheets.Add.Name = "Unmatch"
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Sheets("Original").Select
        ActiveSheet.Range("$A$1:$F$" & vLR).AutoFilter Field:=6, Criteria1:="=0", _
            Operator:=xlAnd
        Range("A1:D" & vLR).Select
        Selection.Copy
        Sheets.Add.Name = "Match"
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    End Sub

【讨论】:

以上是关于如何将excel电子表格中的2行匹配2列?的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice Calc电子表格中怎么快速输入数据?

如何在多行/列Excel电子表格表中查找值的位置

Excel高手请进:如何在电子表格中固定某一行或某一列

Python,遍历 Excel 电子表格

将 Excel 中的两列导入现有的 Access2010 表中使用转移电子表格时出错

电子表格表头固定--冻结窗口的方法不好使