【问题标题】:Find values in One Column based on Other Columns根据其他列查找一列中的值
【发布时间】:2016-07-26 08:12:09
【问题描述】:

我希望有人可以提供帮助。我有一个超过 65,000 行的 Excel 表。我附上了我正在努力实现的目标的图片

J 列和 N 列是重要的列,您可以在单元格 J2 中看到支付了 800 的款项,在单元格 N2 中您可以看到它是在 2015 年 11 月 16 日支付的。在 J3 单元格中,您可以看到我们收回了 -800 的钱,并在 2016 年 1 月 4 日的 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

出现的错误是 非常感谢任何帮助

【问题讨论】:

  • vba 确实可以胜任。你会考虑使用 excel-formula 吗?
  • @Rosetta:是的,我当然会考虑使用公式。你有一个可能有用的吗?
  • 好的...您可以对数据进行排序吗? 65000行,排序可以提高性能速度。

标签: excel vba


【解决方案1】:

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

我想了想,发现异常情况的组合太多了。即使找到完美的配方并非不可能,但您会浪费太多精力来寻找它。让我们继续使用“有缺陷”的公式来自动突出显示行。

水平线

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

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

因此,现在不是通过 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)
  • 电话:=N(AND(SUMIFS(J:J,D:D,D:D,L:L,L:L,S:S,S:S)=0,S:S>=2))

这就是我所拥有的,希望有人能提出更好的答案。无论如何,解决大数据问题很有趣。

【讨论】:

  • :Rosetta:-) 谢谢。这种目前的方式是迄今为止最好的。识别更多场景。非常感谢你的帮助。那个难以捉摸的场景仍然会出现,但有了你给我的东西,我的处境要好得多。非常感谢你的帮助。抱歉,我们在都柏林度过了一个银行假日周末,回复晚了。如果有什么办法可以在这里给你道具或积分,都柏林再次表示敬意,请告诉我
  • @PhilipConnell 不客气 :) 你的支持已经太多了。谢谢!
【解决方案2】:

这是最终输出的样子。我使用了逻辑函数、一些辅助列,当然还有条件格式的组合。有些列是隐藏的,因为我只是想模仿你的格式,而我的答案中没有使用它们。我按客户 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))

接下来,条件格式

  1. 选择要使用条件格式突出显示的列。

  1. 创建新的条件格式规则

  1. 如下图所示制定规则,然后按确定。

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

注意事项

您有 65,000 行数据,我不能排除上述四个公式在某些情况下会失效。所以这里有一些注意事项:

  1. 如果客户为相同的“自然”支付了两次并索赔一次,则公式失败,行将不会突出显示。如果这经常发生在您的数据中,对不起,您必须扩展逻辑来考虑这一点。也许使用不同的颜色来有条件地突出它们?
  2. (嗯...让我想想,如果有更多我会添加。请评论。)

性能

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

  1. 按客户 ID 和性质对数据进行排序

  1. 并缩小 S 列和 T 列中 SUMIFS 的计算范围。

例如对于列 S,单元格 S4 公式变为

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

即有效缩小计算范围以加快性能。

客户 ID 为 18801591 的自然问题

【讨论】:

  • @罗塞塔。这真太了不起了。我的朋友,你确实有一些技巧。您的预测是正确的“如果客户支付了两次并为相同的“自然”索赔一次,那么公式将失败”我附上了一张失败的案例图片。有一个简单的解决方法吗?再次感谢您的帮助非常感谢都柏林 :-)
  • @PhilipConnell,对不起,伙计,这对我来说太复杂了:(见我的第二个答案。
  • 请不要为您提供了非常好的帮助而感到抱歉。你有一些真正的技能。再次感谢您的所有帮助。最后一种方法是迄今为止捕捉更多场景的最佳方法。都柏林非常尊重。
【解决方案3】:

您可以在 INDEX 函数中嵌套 MATCH 函数。

MATCH 函数将查找与某个条件匹配的行号,INDEX 函数查找与 匹配的行号的单元格MATCH 函数(嵌套在其中) 找到。

我希望这会有所帮助:http://www.randomwok.com/excel/how-to-use-index-match/

【讨论】:

  • 抱歉,我认为 INDEX MATCH 不起作用,它似乎依赖于我知道我在寻找什么数字或项目。在我的工作簿中,我不知道我在寻找什么号码。
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 2016-02-20
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多