将日期从空白到空白连续分组

时间:2019-05-02 16:34:23

标签: excel excel-formula

我正在尝试将不同的日期分为开始日期和结束日期格式,每次在数据之间出现空白时都会更改开始日期

我尝试了不同的公式,例如连接,替换,等空,但找不到答案。

进一步说明:如果我在A中有一个日期,并且一直持续到D,而没有空白,那将是我的第一个组,从A开始到D结束。类似地,如果我在A中有一个日期,然后在C中有另一个,那么我的第一组将是A本身是开始和结束,第二组将是C都是开始和结束。

此外,我共享的数据是演示数据,我有数千行和100列...而且我无法手动输入公式。在演示数据中,我使用了数据中最常见的情况。 ..

这是我的数据

This is my data

这就是我想要的

This is what I want

2 个答案:

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

enter image description here

这类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函数,就可以像输入其他任何公式一样输入公式