Группировка дат подряд от пустых до пустых - PullRequest
0 голосов
/ 02 мая 2019

Я работаю над тем, чтобы сгруппировать разные даты в формат даты начала и окончания, меняя дату начала каждый раз, когда между данными есть пробел

Я пробовал разные формулы, такие как конкатенация, замена, isblank, но не смог найти ответ.

Чтобы объяснить далее: если у меня есть дата в A и я продолжу до D без пробелов, это будет моя первая группа, начинающаяся с A и заканчивающаяся D. Аналогично, если у меня есть дата в A, а затем еще одна в C, так моя первая группа будет сама A началом и концом, а вторая группа будет C началом и концом.

Кроме того, данные, которыми я поделился, являются демонстрационными данными, у меня есть тысячи строк и 100 столбцов ... и я не могу вручную ввести формулу. В демонстрационных данных я использовал самые распространенные вхождения, которые есть в данных. ..

Это мои данные

This is my data

Это то, что я хочу

This is what I want

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Я не совсем уверен, есть ли что-то попроще, но вы могли бы использовать что-то подобное для первой даты начала, которая в основном находит первое непустое значение (это формула массива, т.е. используйте Ctrl + Сдвиг + Введите ):

=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 s, но вы можете использовать IF( XXX = 0, "", XXX), где XXX - это целая формула, она делает ее более красивой, но вдвое длиннее формулы.

0 голосов
/ 02 мая 2019

Вы можете использовать несколько функций 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.код выше в новый модуль кода VBA в вашей книге Excel

Пока вы не сделаете это, формулы не будут работать

Итак, переходя к вашей картинке "Это то, что я хочу" .. ПохожеВ столбце G указывается первая дата начала. В столбце H указывается первая дата окончания

Получив две новые функции VBA, вы можете вводить формулы, как и любые другие

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...