我正在尝试将不同的日期分为开始日期和结束日期格式,每次在数据之间出现空白时都会更改开始日期
我尝试了不同的公式,例如连接,替换,等空,但找不到答案。
进一步说明:如果我在A中有一个日期,并且一直持续到D,而没有空白,那将是我的第一个组,从A开始到D结束。类似地,如果我在A中有一个日期,然后在C中有另一个,那么我的第一组将是A本身是开始和结束,第二组将是C都是开始和结束。
此外,我共享的数据是演示数据,我有数千行和100列...而且我无法手动输入公式。在演示数据中,我使用了数据中最常见的情况。 ..
这是我的数据
这就是我想要的
答案 0 :(得分:1)
我不确定是否有更简单的方法,但是您可以在首次开始日期使用类似的方法,这样基本上可以找到第一个非空白值(这是一个数组公式,即使用 Ctrl + Shift + 输入):
=INDEX(A2:F2,MIN(MATCH(0,--ISBLANK(A2:F2),0),5))
第一个结束日期(这也是一个数组公式),基本上可以找到开始日期之后的第一个空白值,然后返回一个单元格:
=OFFSET(A2,0,IFERROR(MATCH(G2,A2:F2,0)-1+MATCH(1,--ISBLANK(INDEX(A2:F2,1,MATCH(G2,A2:F2,0)):F2),0)-2,5))
第二个开始日期,基本上是最后一个结束日期之后的2个单元格,但是如果您在非空白单元格之间可以有多个空白单元格,则可以使用与第一个公式更相似的开始日期:
=OFFSET(A2,0,MIN(MATCH(H2,A2:F2,0)+1,5))
第二个结束日期(与上一个结束日期数组公式相同,但已对此开始日期进行了调整):
=OFFSET(A2,0,IFERROR(MATCH(I2,A2:F2,0)-1+MATCH(1,--ISBLANK(INDEX(A2:F2,1,MATCH(I2,A2:F2,0)):F2),0)-2,5))
冲洗并重复第三个开始和结束日期:
=OFFSET(A2,0,MIN(IFERROR(MATCH(J2,A2:F2,0)+1,5),5))
=OFFSET(A2,0,IFERROR(MATCH(K2,A2:F2,0)-1+MATCH(1,--ISBLANK(INDEX(A2:F2,1,MATCH(K2,A2:F2,0)):F2),0)-2,5))
这类0
留在外面,但是您可以使用IF( XXX = 0, "", XXX)
,其中XXX
是整个公式,它使它更漂亮,但长度却是它的两倍以上。公式。
答案 1 :(得分:0)
您可以使用几个VBA功能(如下) 如下使用:
For 1st Start Date use the formula
=GetStartDate(A2:E2,1)
For 2nd Start Date use the formula
=GetStartDate(A2:E2,2)
类似地,对于第3、4、5等,在公式中使用,3,4,5
也用于结束日期
For 1st End Date use the formula
=GetEndDate(A2:E2,1)
For 2nd End Date use the formula
=GetEndDate(A2:E2,2)
VBA功能如下
Public Function GetStartDate(SrcRng As Range, dIndex As Long) As Variant
' Parameters ...
' .. SrcRng - Range of Dates to Check
' .. dIndex ... 1 = Match to 1st Start Date, 2 = Match to 2nd Start Date, etc
Dim xCel As Range, dCtr As Long, LastVal As String, StillChekin As Boolean
GetStartDate = ""
dCtr = 1
LastVal = ""
StillChekin = True
For Each xCel In SrcRng.Cells
If StillChekin Then
If xCel.Value = "" Then
If LastVal <> "" Then
dCtr = dCtr + 1
End If
Else
If dCtr = dIndex Then
GetStartDate = xCel.Value
StillChekin = False
End If
End If
LastVal = Trim(CStr(xCel.Value))
End If
Next xCel
End Function
Public Function GetEndDate(SrcRng As Range, dIndex As Long) As Variant
' Parameters ...
' .. SrcRng - Range of Dates to Check
' .. dIndex ... 1 = Match to 1st End Date, 2 = Match to 2nd End Date, etc
Dim xCel As Range, dCtr As Long, LastVal As Variant, StillChekin As Boolean
GetEndDate = ""
dCtr = 1
LastVal = ""
StillChekin = True
For Each xCel In SrcRng.Cells
If StillChekin Then
If xCel.Value = "" Then
If LastVal <> "" Then
If dCtr = dIndex Then
GetEndDate = CDate(LastVal)
End If
dCtr = dCtr + 1
If dCtr > dIndex Then
StillChekin = False
End If
End If
Else
If dCtr = dIndex Then
If LastVal <> "" Then
GetEndDate = CDate(LastVal)
'StillChekin = False
End If
End If
End If
LastVal = Trim(CStr(xCel.Value))
End If
Next xCel
If StillChekin Then
If dCtr = dIndex Then
If LastVal <> "" Then
GetEndDate = CDate(LastVal)
End If
End If
End If
End Function
您的评论问题的附录
首先,您需要将上面的VBA代码复制并粘贴到Excel工作簿中的新VBA代码模块中
在您这样做之前,公式将不起作用
所以,按照您的“这就是我想要的”图片 ..看起来列G是您想要第一个开始日期的地方 ..和H栏是您想要第一个结束日期的地方
一旦有了2个新的VBA函数,就可以像输入其他任何公式一样输入公式