如何将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';
连接类型可以使用ODBC或OleDB;
需要匹配的所有数据都位于 Excel 的一张表上;
匹配的数据需要成对出现,所以必须等于 2;
要匹配的 2 列是 Receipt 和 Amount,其中两行的 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电子表格中怎么快速输入数据?