在基于其他列

时间:2016-07-26 08:12:09

标签: excel excel-vba vba

我希望有人可以提供帮助。我有一张超过65,000行的excel表。我附上了一张我想要实现的图片

J和N列是重要的,你可以在单元格J2中看到支付800,在单元格N2中你可以看到它是在2015年11月16日制作的。在单元格J3中,您可以看到我们收回了这笔钱-800,它被带回了1/4/2016单元格N3。

是否有方法或某些逻辑或VBA代码,我可以轻松识别这些在2015年支付并在2016年收回的款项。我可以使用该号码来说明什么回复到零显示我,或者我可以使用列D和L为黄色以标识这些量。滚动65,000行将使我盲目地尝试识别这些数量,任何帮助将不胜感激。 enter image description here

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

出现的错误是enter image description here 非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

以下是最终输出的样子。我使用逻辑函数,一些辅助列的组合,当然还有条件格式。有些列是隐藏的,因为我只是想模仿你的格式,而我的答案中没有使用它们。我按照客户ID排序我的数据,然后按自然界排序,但您不必这样做,我稍后会解释。

enter image description here

  

首先,公式

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))
  

接下来,条件格式

  1. 使用条件格式选择要突出显示的列。
  2. enter image description here

    1. 创建新的条件格式设置规则
    2. enter image description here

      1. 制定如下所示的规则,然后按OK。
      2. enter image description here

        就是这样。您应该像上面的第一张图片一样得到结果。

          

        预防

        你有65,000行数据,我不能排除上面的四个公式在某些情况下无法工作。所以这里有一些提醒:

        1. 如果客户支付两次并为同一“自然”索取一次,则公式将失败,并且行不会突出显示。如果您的数据经常出现这种情况,抱歉,您必须扩展逻辑以考虑这一点。也许使用不同的颜色有条件地突出它们?
        2. (嗯......让我想一想,如果有更多我会补充。请发表评论。)
        3.   

          性能

          65,000可能会对SUMIFS公式的计算时间产生影响。我没有对此进行测试,您的计算机可能比想象的要好得多。无论如何,当你应用公式时它变得非常迟钝,那么我的建议是

          1. 按客户ID和自然
          2. 对数据进行排序

            enter image description here

            1. 并减少S和T列中SUMIFS的计算范围。
            2. 例如对于列S,单元格S4公式变为

              =N(SUMIFS(Q2:Q6,D2:D6,D4,L2:L6,L4)+SUMIFS(R2:R6,D2:D6,D4,L2:L6,L4)=2)
              

              这是为了有效地减少计算范围以加快性能。

              enter image description here

              客户ID 18801591的自然问题 enter image description here

答案 1 :(得分:1)

我注意到您可以对数据进行排序。这使您的问题更容易一些。这个答案不是提供更好的公式,而是为了减轻匹配的痛苦。

我想了一会儿,并意识到特殊情况的组合太多了。即使找到完美的配方并非不可能,但你只需要花费太多精力去寻找它。让我们继续使用“有缺陷”的公式来自动突出显示行。

enter image description here

  

水平线

请注意,我关闭了网格线。并添加了横向紫色线条,将客户分开。紫色线不是手动绘制的,而是条件格式: -

enter image description here

只需将此规则应用于整个工作表:

enter image description here

因此,不是通过65,000行,而是查看列表中有多少客户。

  

公式

  • 问:=N(AND(J2>0,YEAR(N2)=2015))
  • R:=N(AND(J2<0,YEAR(N2)=2016))
  • S:=SUMIFS(Q:Q,D:D,D:D,L:L,L:L) + SUMIFS(R:R,D:D,D:D,L:L,L:L)
  • T:=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/