从excel表中获取每一天的最后一行

时间:2017-07-28 12:26:46

标签: excel

如果有多个条目,我需要在excel中找到每天的最后一条记录

  

*******意图是获得EOD余额每个日期的行数********

就像我在excel中有这样的数据

date             CR_DR amount EOD balance
----------------------
7/9/2017 19:09  CR       10       10
7/10/2017 18:37 CR       25       35
7/10/2017 21:06 DR       10       25
7/11/2017 19:21 CR       15       40  
7/15/2017 14:17 DR       20       20
7/17/2017 17:12 CR       100     120
7/18/2017 7:44  DR       30       90
7/18/2017 14:08 DR       50       40
7/18/2017 16:52 CR       120     160

我需要获取数据(获取每天的最后一行)

7/9/2017 19:09  CR       10       10
7/10/2017 21:06 DR       10       25
7/11/2017 19:21 CR       15       40  
7/15/2017 14:17 DR       20       20
7/17/2017 17:12 CR       100     120
7/18/2017 16:52 CR       120     160

adding output of formula applied

data post updated comments

3 个答案:

答案 0 :(得分:1)

解决方案1 ​​

Cell F2

中输入以下公式
=IFERROR(MAX(IF(INT($A$2:$A$10)=INT(INDEX($A$2:$A$10, MATCH(0, FREQUENCY(IF(EXACT(INT($A$2:$A$10), TRANSPOSE(INT($F$1:F1))), MATCH(ROW($A$2:$A$10), ROW($A$2:$A$10)), ""), MATCH(ROW($A$2:$A$10), ROW($A$2:$A$10))), 0))),$A$2:$A$10,0)),"")

这是一个数组公式,所以按 Ctrl + Shift + Enter 提交它。根据需要拖动/复制。

然后在Cell G2输入

=VLOOKUP($F2,$A$2:$D$10,COLUMN(C1)-COLUMN($A$1),FALSE)

将此公式拖到({右)直到Cell I2并根据需要向下拖动。

参见图片以供参考。

enter image description here

解决方案2

这里我们将使用辅助列,而不是使用丑陋的长公式。

Cell F2中输入以下公式

=MAX(IF(INT($A$2:$A$10)=INT(A2),$A$2:$A$10,0))

这是一个数组公式,所以按 Ctrl + Shift + Enter 提交它。根据需要拖动/复制。

然后在Cell G2输入

=IFERROR(INDEX($F$2:$F$10,MATCH(0,INDEX(COUNTIF($G$1:G1,$F$2:$F$10),0,0),0)),"")

根据需要拖动/复制。

最后,在Cell H2输入

=VLOOKUP($G2,$A$2:$D$10,COLUMN(C1)-COLUMN($A$1),FALSE)

将此公式拖到({右)直到Cell J2并根据需要向下拖动。

参见图片以供参考。

enter image description here

编辑: 根据评论。

而不是

=VLOOKUP($G2,$A$2:$D$10,COLUMN(C1)-COLUMN($A$1),FALSE)

Cell H2

中使用以下公式
=INDEX(B$2:B$10,MAX(IF($A$2:$A$10=$G2,ROW($A$2:$A$10)-ROW(INDEX($A$2:$A$10,1,1))+1)))

这是一个数组公式,所以按 Ctrl + Shift + Enter 提交它。将此公式拖动到({右)直到Cell J2并根据需要向下拖动。根据需要拖动/复制。

屏幕截图:

enter image description here

答案 1 :(得分:0)

好的,这很粗糙,我确定有适当的"这样做的方法,但它适用于你想做的事情。我使用A列到D列的数据。在F列中,我使用公式=左(A3,5)并将其复制下来。您必须根据自己的情况进行修改。希望这会有所帮助或让你朝着正确的方向前进。祝你好运

Sub FindLast()
'FIND LAST LISTED DATE AND COPY
Dim myCount, myCount2, myRange, myRow, x, y, r
r = 3

myCount = Sheets("Sheet1").UsedRange.Rows.Count - 2

    MsgBox "Rows used are   " & myCount

For x = 3 To myCount Step 1

    y = Range("F" & x).Value
    MsgBox "Value of x is  " & x
    MsgBox "Value of y is  " & y

        myCount2 = WorksheetFunction.CountIf(Range("F3:F" & myCount + 2), y)
        MsgBox "myCount2 value is  " & myCount2

Max_date = Application.WorksheetFunction.Max(Range("A" & x & ":" & "A" & x + myCount2 - 1))
myRow = Range("A" & x + myCount2 - 1).Row

    MsgBox "myRow number is:  " & myRow
    MsgBox CDate(Max_date)

    Sheets("Sheet1").Range("I" & r).Value = Max_date
    Sheets("Sheet1").Range("J" & r).Value = Range("B" & myRow).Value
    Sheets("Sheet1").Range("K" & r).Value = Range("C" & myRow).Value
    Sheets("Sheet1").Range("L" & r).Value = Range("D" & myRow).Value

    r = r + 1

    If myCount2 <> 1 Then
            x = x + (myCount2 - 1)
        Else
            x = x
        End If

Next x


End Sub

您会注意到有很多消息框。我用这些来测试参数并确保它们像我想要的那样出来。当你对它的工作方式感到满意时,只需将它们评论出来。

此外,对于您发布的示例,输出设置为I3到L8。如果您的真实工作表在这些区域中有任何数据,请务必编辑这些内容。我的建议是先测试一下,以便熟悉发生的事情。我没有把任何&#34; failafes&#34;或&#34;退出&#34;因为我没时间了。这个网站上有很多例子来帮助解决这个问题。

此致

答案 2 :(得分:0)

它需要输入A列中的日期(我没有足够的动力来弄清楚如何拉出独特的那些),但是如果你感觉很笨,你可以使用一些数组公式。 : - )

Column A    Column B        C    D  E
7/9/2017    7/9/2017 19:09  CR  10  10
7/10/2017   7/10/2017 21:06 DR  10  25
7/11/2017   7/11/2017 19:21 CR  15  40
7/15/2017   7/15/2017 14:17 DR  20  20
7/17/2017   7/17/2017 17:12 CR  100 120
7/18/2017   7/18/2017 16:52 CR  120 160         

在A栏输入日期。然后在B栏输入:

=IFERROR(INDEX(Date,SMALL(IF(ROUNDDOWN(Date,0)=$A1,ROW(Date)-1),COUNTIFS(Date,">="&$A1,Date,"<"&$A1+1))),"")

使用CTRL-SHIFT-ENTER关闭单元格,以便公式栏中的公式看起来像

{=IFERROR(INDEX(Date,SMALL(IF(ROUNDDOWN(Date,0)=$A1,ROW(Date)-1),COUNTIFS(Date,">="&$A1,Date,"<"&$A1+1))),"")}

注意:自己输入花括号不起作用。 ;-)你必须用CTRL-SHIFT-ENTER关闭单元格。

公式中的Date是命名范围 - 我不喜欢一直输入$A$2:$A$10。如果您不想使用命名范围,请将Date替换为$A$2:$A$10或您的适用范围。

C栏:

=IFERROR(INDEX(CR_DR,SMALL(IF(ROUNDDOWN(Date,0)=$A1,ROW(Date)-1),COUNTIFS(Date,">="&$A1,Date,"<"&$A1+1))),"")

同样的事情 - 用CTRL-SHIFT-ENTER关闭单元格。为CR_DR再次命名范围,与上面的Date规则相同。复制/粘贴其他列,更改INDEX正在搜索所需列的范围。

说明:ROUNDDOWN删除源数据中日期的时间,以便它可以将其与A列中的日期匹配。如果日期匹配,则其行(-1,因为A2的行号是2,但它是$A$2:$a$10)中的第一项被放入SMALL函数的数组中。这将选择由COUNTIFS函数定义的数组中的第n个最小项,该项计算在A列中的日期与A列中日期之后的日期之间的日期数(从而实际为您提供最大项目) 。然后INDEX使用该范围并查找SMALL传递给它的行号。如果错误,则单元格为空白。

如果您不想手动输入特定日期,请自动填写所有日期,并且在没有任何日期的情况下它将只是空白:

7/9/2017    7/9/2017 19:09  CR  10  10
7/10/2017   7/10/2017 21:06 DR  10  25
7/11/2017   7/11/2017 19:21 CR  15  40
7/12/2017               
7/13/2017               
7/14/2017               
7/15/2017   7/15/2017 14:17 DR  20  20
7/16/2017               
7/17/2017   7/17/2017 17:12 CR  100 120
7/18/2017   7/18/2017 16:52 CR  120 160