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

如果有多个条目,我需要在excel中find每天的最后一条logging

*******的意图是获得EOD余额行date********

就像我有这样的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 

添加公式的输出

数据发布更新评论

解决scheme1

Cell F2input下面的公式

 =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 G2input

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

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

看图像以供参考。

在这里输入图像说明

解决scheme2

而不是使用一个丑陋的看长的公式,在这里我们将使用一个帮手列。

Cell F2input下面的公式

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

这是一个数组公式,通过按Ctrl + Shift + Enter来提交。 根据需要拖放/复制。

然后在Cell G2input

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

根据需要拖放/复制。

最后在Cell H2input

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

将该公式拖到(向右)直到Cell J2并按需要向下拖动。

看图像以供参考。

在这里输入图像说明

编辑:根据评论。

代替

 =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并按需要向下拖动。 根据需要拖放/复制。

屏幕截图:

在这里输入图像说明

好吧,这很粗糙,我确定有这样的“正确的”方法,但它适用于你想要做的事情。 我使用列A到D作为数据。 在FI列中使用公式= Left(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 

你会注意到有很多消息框。 我用这些来testing参数,并确保他们出来就像我想要的。 如果您对自己的工作方式感到满意,只需评论一下。

另外,对于您发布的示例,输出设置为I3至L8。 如果您的真实纸张在这些区域中有任何数据,请确保编辑这些数据。 我的build议是先testing以熟悉发生的事情。 我没有把任何“失败者”或“退出”放进去,因为我时间不够了。 在这个网站上有很多的例子来帮助。

问候

它需要inputA列中的date(我不觉得有足够的动机来弄清楚如何拉出独特的东西),但是如果你感到气馁,可以使用一些数组公式。 🙂

 Column A Column BCDE 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中inputdate。然后在B列中input:

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

用CTRL-SHIFT-ENTERclosures单元格,使公式栏中的公式看起来像

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

注意:自己无法input大括号。 ;-)你必须用CTRL-SHIFT-ENTERclosures单元格!

在公式中的Date是一个命名的范围 – 我不喜欢打字$A$2:$A$10所有的时间。 如果您不想进行命名范围,请用$A$2:$A$10replaceDate或您的适用范围。

C列:

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

同样的事情 – 用CTRL-SHIFT-ENTERclosures单元格。 对CR_DR再次命名范围,与上述Date相同的规则。 复制/粘贴其他列,根据需要更改INDEX正在search的范围。

说明: ROUNDDOWN从源数据中删除date中的时间,以便它与列A中的date匹配。如果date匹配,则它的行(-1,因为A2的行数是2,但是是第一个项目在$A$2:$a$10 )被放入一个数组为SMALL函数。 这将从COUNTIFS函数定义的数组中select第n个最小的项目,它计算A列中的date与A列中的date之后的date之间有多lessdate(因此实际上给了您最大的项目)。 INDEX然后使用范围并查找SMALL传递给它的行号。 如果出错,单元格为空。

如果您不想手动input特定的date,则自动填写所有date,并且在没有任何内容的date时它将仅为空白。

 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