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

时间:2018-02-14 22:05:15

标签: sql excel odbc oledb

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

  • 相关的Excel工作簿具有.xlsx扩展名;
  • Excel文件中的两个工作表是Matched和“不匹配”;
  • 连接类型可以使用 ODBC OleDB ;
  • 需要匹配的所有数据都位于Excel中的一个工作表上;
  • 匹配数据需要成对,所以必须等于2;
  • 要匹配的2列是收据金额,其中两行上的收据必须完全匹配 行的金额值必须平衡或等于 0。一个金额值在其开头会有一个负号(-),因此可以将金额加在一起以平衡,但它们位于不同的行中;
  • 行数可以从几百到几千(~60,000);和
  • 如果两行匹配/余额收据 金额,则需要将它们移至Matched表在同一个Excel文件中。
  • 脚本不是不可能的,欢迎使用VBScript和Powershell。

示例:

Example Excel Image

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

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

1 个答案:

答案 0 :(得分:0)

以下是VBA建议 - 它希望原始数据位于名为“原始”的标签中。并且会对收据进行排序,然后执行几个公式来确定收据#' s计数到零,然后创建一个名为“匹配”的新标签。匹配的收据行和另一个叫做“不匹配”的行无与伦比的收据。

    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