我希望有人可以提供帮助。我有一张超过65,000行的excel表。我附上了一张我想要实现的图片
J和N列是重要的,你可以在单元格J2中看到支付800,在单元格N2中你可以看到它是在2015年11月16日制作的。在单元格J3中,您可以看到我们收回了这笔钱-800,它被带回了1/4/2016单元格N3。
是否有方法或某些逻辑或VBA代码,我可以轻松识别这些在2015年支付并在2016年收回的款项。我可以使用该号码来说明什么回复到零显示我,或者我可以使用列D和L为黄色以标识这些量。滚动65,000行将使我盲目地尝试识别这些数量,任何帮助将不胜感激。
Sub Macro2()
Dim lastrow As Long
Dim lastColumn As Long
Application.ScreenUpdating = False
lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
lastrow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A2").Select
ActiveCell.FormulaR1C1 = "1"
Range("A3").Select
ActiveCell.FormulaR1C1 = "2"
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & lastrow)
Range("A1").Value = "Row ID"
Columns("Q:Q").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("Q1").Select
ActiveCell.FormulaR1C1 = "positive identifier"
Columns("R:R").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("R1").Select
ActiveCell.FormulaR1C1 = "Matching row ID"
Range("Q2").Select
ActiveCell.FormulaR1C1 = "=1*AND(RC[-6]>0,YEAR(RC[-1])=2015)"
Range("Q2").Select
Selection.Style = "Comma"
Selection.AutoFill Destination:=Range("Q2:Q" & lastrow)
For i = 2 To lastrow
For j = 3 To lastrow
If Cells(i, 5).Value = Cells(j, 5).Value And Cells(i, 11).Value > 0 And Cells(i, 11).Value = -1 * Cells(j, 11).Value And Year(Cells(i, 16).Value) = 2015 And Year(Cells(j, 16).Value) = 2016 Then
Cells(i, 18).Value = j - 1
End If
Next
Next
Range("R2:R" & lastrow).Select
Selection.Style = "Comma"
Application.ScreenUpdating = True
End Sub
得到了一些代码,但它的问题在于
If Cells(i, 5).Value = Cells(j, 5).Value And Cells(i, 11).Value > 0 And Cells(i, 11).Value = -1 * Cells(j, 11).Value And Year(Cells(i, 16).Value) = 2015 And Year(Cells(j, 16).Value) = 2016 Then
答案 0 :(得分:1)
以下是最终输出的样子。我使用逻辑函数,一些辅助列的组合,当然还有条件格式。有些列是隐藏的,因为我只是想模仿你的格式,而我的答案中没有使用它们。我按照客户ID排序我的数据,然后按自然界排序,但您不必这样做,我稍后会解释。
首先,公式
Q栏,来自Q2
向下
=N(AND(J2>0,YEAR(N2)=2015))
列R,来自R2
向下
=N(AND(J2<0,YEAR(N2)=2016))
第S栏
=N(SUMIFS(Q:Q,D:D,D:D,L:L,L:L)+SUMIFS(R:R,D:D,D:D,L:L,L:L)=2)
第T栏
=N(AND(SUMIFS(J:J,D:D,D:D,L:L,L:L,S:S,S:S)=0,S:S=1))
接下来,条件格式
就是这样。您应该像上面的第一张图片一样得到结果。
预防
你有65,000行数据,我不能排除上面的四个公式在某些情况下无法工作。所以这里有一些提醒:
性能
65,000可能会对SUMIFS公式的计算时间产生影响。我没有对此进行测试,您的计算机可能比想象的要好得多。无论如何,当你应用公式时它变得非常迟钝,那么我的建议是
答案 1 :(得分:1)
我注意到您可以对数据进行排序。这使您的问题更容易一些。这个答案不是提供更好的公式,而是为了减轻匹配的痛苦。
我想了一会儿,并意识到特殊情况的组合太多了。即使找到完美的配方并非不可能,但你只需要花费太多精力去寻找它。让我们继续使用“有缺陷”的公式来自动突出显示行。
水平线
请注意,我关闭了网格线。并添加了横向紫色线条,将客户分开。紫色线不是手动绘制的,而是条件格式: -
只需将此规则应用于整个工作表:
因此,不是通过65,000行,而是查看列表中有多少客户。
公式
=N(AND(J2>0,YEAR(N2)=2015))
=N(AND(J2<0,YEAR(N2)=2016))
=SUMIFS(Q:Q,D:D,D:D,L:L,L:L) + SUMIFS(R:R,D:D,D:D,L:L,L:L)
=N(AND(SUMIFS(J:J,D:D,D:D,L:L,L:L,S:S,S:S)=0,S:S>=2))
这就是我所拥有的,希望有人能提出更好的答案。无论如何,解决大数据问题很有意思。
答案 2 :(得分:0)
您可以在 INDEX 功能中嵌套 MATCH 功能。
MATCH 函数将找到符合特定条件的行号, INDEX 函数会找到与的行号匹配的单元格MATCH 函数(嵌套在其中)找到。
我希望这会有所帮助:http://www.randomwok.com/excel/how-to-use-index-match/