Поиск на основе критериев в именованном диапазоне, затем объединение результатов - PullRequest
0 голосов
/ 27 марта 2012

у нас есть интересная формула, чтобы выяснить.

Сначала посчитаем следующее, где MYDATE должен находиться между двумя датами.REGISTER.DT и EXIT.DT являются именованными диапазонами A: A и B: B, MYDATE является именованным диапазоном, который указывает на C1.

= SUMPRODUCT (- (REGISTER.DT <= MYDATE) * (EXIT.DT> = MYDATE))

и другой пример с дополнительными критериями (иногдадо 5 критериев)

= SOMPRODUCT (- (AANM.DT> = DT.START) (AANM.DT <= DT.EIND) </em> (TYPE.TXT =I8))

Теперь к вопросу.Приведенная выше формула возвращает 2 (поэтому она находит две даты)

Теперь мы хотим найти и отобразить эти даты в объединенной строке

Я возился с функцией VBA StringConcat, которую я нашел в Интернете, но я не пропускаю нули (преобразует все в строку), но также не понимает именованные диапазоны.

У кого-нибудь есть подсказка?или поиск в матричной функции, который может работать?

большое спасибо

1 Ответ

3 голосов
/ 27 марта 2012

Вот пользовательская функция, которая будет работать на основе вашего дизайна.Введите два соответствующих массива в первых двух параметрах, затем контрольную дату в третьем.Вы получите список дат РЕГИСТРАЦИИ, которые отмечают начало диапазона (ов), содержащих эту контрольную дату:

Option Explicit

Function DateCAT(RegisterRng As Range, ExitRng As Range, MyDt As Date) As String
Dim DtARR As Variant, D As Long

If RegisterRng.Cells.Count <> ExitRng.Cells.Count Then
    DateCAT = "date ranges do not match"
    Exit Function
End If

DtARR = Union(RegisterRng, ExitRng)

For D = LBound(DtARR) To UBound(DtARR)
    If DtARR(D, 1) <= MyDt And DtARR(D, 2) >= MyDt Then
        DateCAT = DateCAT & ", " & DtARR(D, 1)
    End If
Next D

If DateCAT = "" Then
    DateCAT = "none"
Else
    DateCAT = Mid(DateCAT, 3, Len(DateCAT))
End If

End Function

= DATECAT (REGISTER.DT, EXIT.DT, MYDATE)

enter image description here

Кстати, формулы, которые я использовал для REGISTER.DT и EXIT.DT, являются динамическими.

= СМЕЩЕНИЕ (Sheet1! $ A $ 1 ,,, COUNTA (Sheet1! $ A: $ A),)

= OFFSET (Sheet1! $B $ 1 ,,, COUNTA (Лист1! $ B: $ B),)

=========================== Эта версия похожа на COUNTIFS (), сначала вы помещаете диапазон для возврата, затем перечисляете пары значений ... диапазон, затем тест для этого диапазона, затем другой необязательный диапазон и тест, всего до 5.

= DATECAT (значения, TstRng1, Test1, OptTstRng2, OptTest2, OptTstRng3, OptTest3)

Option Explicit

Function DateCAT(RegisterRng As Range, RNG1 As Range, TST1 As String, _
    Optional RNG2 As Range, Optional TST2 As String, _
    Optional RNG3 As Range, Optional TST3 As String, _
    Optional RNG4 As Range, Optional TST4 As String, _
    Optional RNG5 As Range, Optional TST5 As String) As String

Dim D As Long, Bad As Boolean, i As Long

D = RegisterRng.Cells.Count

If RNG1.Cells.Count <> D Then Bad = True
If Not RNG2 Is Nothing Then If RNG2.Cells.Count <> D Then Bad = True
If Not RNG3 Is Nothing Then If RNG3.Cells.Count <> D Then Bad = True
If Not RNG4 Is Nothing Then If RNG4.Cells.Count <> D Then Bad = True
If Not RNG5 Is Nothing Then If RNG5.Cells.Count <> D Then Bad = True

If Bad Then
    DateCAT = "data ranges do not match"
    Exit Function
End If

For i = 1 To RNG1.Cells.Count
    If WorksheetFunction.CountIf(RNG1.Cells(i), TST1) = 0 Then Bad = True

    If Not RNG2 Is Nothing Then If WorksheetFunction.CountIf(RNG2.Cells(i), TST2) = 0 Then Bad = True
    If Not RNG3 Is Nothing Then If WorksheetFunction.CountIf(RNG3.Cells(i), TST3) = 0 Then Bad = True
    If Not RNG4 Is Nothing Then If WorksheetFunction.CountIf(RNG4.Cells(i), TST4) = 0 Then Bad = True
    If Not RNG5 Is Nothing Then If WorksheetFunction.CountIf(RNG5.Cells(i), TST5) = 0 Then Bad = True

    If Not Bad Then DateCAT = DateCAT & ", " & RegisterRng.Cells(i).Value
    Bad = False
Next i

If DateCAT = "" Then
    DateCAT = "none"
Else
    DateCAT = Mid(DateCAT, 3, Len(DateCAT))
End If

End Function

Важно: при проверке именованного диапазона (одна ячейка, с 1 значением) вам нужно ввести TST1 и т. д. в качестве оператора и именованного диапазона: ">"&MYCELL

enter image description here

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