我有一个问题,我目前正在使用多个查询来实现我想要的结果,但是当在更大的电子表格上运行时,它会大幅减慢。一些信息:
.xlsx
扩展名; Matched
和“不匹配”; 0
。一个金额值在其开头会有一个负号(-
),因此可以将金额加在一起以平衡,但它们位于不同的行中; Matched
表在同一个Excel文件中。示例:
正如您在Excel示例中所看到的,我需要匹配收据值完全匹配的两行,并且金额值保持平衡。如果两个条件都满足,那么我需要将所述行插入Matched
表。因此,在此示例中,收据列中的101010
行(第2行和第3行)的金额均在金额列中保持平衡,因此它们将是在满足两个条件时移至Matched
。 收据中的其余两个值匹配,但其金额值不平衡,因此条件 不符合它们。
限制是ODBC和OleDB连接可用的语句。我目前正在使用多个查询来匹配并返回上述条件的行数,如果它等于2,那么我知道将收据号码的所有行插入到Matched
表中;但是,就像我说的那样,我需要它更高效,并且表现得更快。
答案 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