Используя приведенный ниже код, который имеет 2 условия для поиска данных, а затем объединения нескольких результатов на основе условий.
Проблема заключается в том, что отображаются все данные, а не только отфильтрованные данные, когда конкретная ячейка $K$2 не пуста, в обоих случаях все данные отображаются по коду. На данный момент неясно, где код испытывает трудности и почему он не работает должным образом.
Первое условие — показать все данные, если конкретная ячейка $K$2 пуста.
Во-вторых, если конкретная ячейка $K$2 не пуста, отобразите отфильтрованные данные на основе этого значения.
=@IF(G7 = "", "", Merged_Lookup_Concat(G7, Table1[Date and time], $K$2, Table1[Title], Table1[Time and Title]))
...
Function Merged_Lookup_Concat(SearchDate As String, _
SDate As Range, SearchValue As String, _
SValue As Range, ReturnCol As Range, Optional K2Value As String) As String
Dim i As Long
Dim result As String
Dim j As Integer
j = 0
If K2Value <> "" Then
For i = 1 To SDate.Cells.CountLarge
Debug.Print "SearchValue: " & SearchValue
Debug.Print "SValue: " & SValue.Cells(i).value
If Int(SDate.Cells(i).value) = SearchDate Then
If SValue.Cells(i).value = SearchValue Or SValue.Cells(i).value = "" Then
If j >= 5 Then
result = result & "...more..."
Exit For
End If
result = result & Left(ReturnCol.Cells(i).value, 25) & vbNewLine
j = j + 1
End If
End If
Next i
Else
For i = 1 To SDate.Cells.CountLarge
If Int(SDate.Cells(i)) = SearchDate Then
If j >= 5 Then
result = result & "...more..."
Exit For
End If
result = result & Left(ReturnCol.Cells(i), 25) & vbNewLine
j = j + 1
End If
Next i
End If
Merged_Lookup_Concat = Trim(result)
End Function


Сравнение дат изменений в условии If
Примечание. В вашем посте не указана цель Optional K2Value. Итак, два раздела в If K2Value <> "" Then [section 1] Else [section 2] одинаковы.
Function Merged_Lookup_Concat(SearchDate As String, SDate As Range, SearchValue As String, SValue As Range, ReturnCol As Range, Optional K2Value As String) As String
Dim i As Long
Dim result As String
Dim j As Integer
j = 0
If K2Value <> "" Then
For i = 1 To SDate.Cells.CountLarge
Debug.Print "SearchValue: " & SearchValue
Debug.Print "SValue: " & SValue.Cells(i).Value
If CLng(SDate.Cells(i)) = CLng(CDate(SearchDate)) Then
If Len(SearchValue) = 0 Or SValue.Cells(i) = SearchValue Then
If j >= 5 Then
result = result & "...more..."
Exit For
End If
result = result & Left(ReturnCol.Cells(i).Value, 25) & vbNewLine
j = j + 1
End If
End If
Next i
Else
For i = 1 To SDate.Cells.CountLarge
If CLng(SDate.Cells(i)) = CLng(CDate(SearchDate)) Then
If Len(SearchValue) = 0 Or SValue.Cells(i) = SearchValue Then
If j >= 5 Then
result = result & "...more..."
Exit For
End If
result = result & Left(ReturnCol.Cells(i), 25) & vbNewLine
j = j + 1
End If
End If
Next i
End If
Merged_Lookup_Concat = Trim(result)
End Function
Привет @taller, спасибо за публикацию ответа. Теперь в обоих случаях результат пуст, я думаю, это потому, что K2value что на самом деле SearchValue As String
Я не думаю, что K2value используется в вашей формуле. Merged_Lookup_Concat(G7, Table1[Date and time], $K$2, Table1[Title], Table1[Time and Title])
Я извиняюсь за поздний ответ. Я хотел уточнить, что в коде строка If K2Value <> "" then` указывает, что для выполнения условия должно присутствовать значение. В этом сценарии ячейка $K$2 определяет, должно ли присутствовать значение или ячейку следует оставить пустой, чтобы запустить код для обоих условий. Я хочу сказать, что ячейка $K$2 должна иметь такое состояние, как If $K$2 <> "" вместо K2Value .
Необязательные аргументы должны иметь значение по умолчанию:
Function Merged_Lookup_Concat(SearchDate As String, _
SDate As Range, SearchValue As String, _
SValue As Range, ReturnCol As Range, Optional K2Value As String = "") As String
Если нет, вам нужно проверить IsMissing на наличие аргумента, например:
If IsMissing(K2Value) Then
Это не сработает — IsMissing не работает для простых типов данных, только для вариантов. См. Learn.microsoft.com/en-us/office/vba/language/reference/…. Вместо этого вы можете проверить If K2Value = "" Then — это будет работать, даже если нет значения по умолчанию, поскольку пустая строка является значением по умолчанию для строк в VBA. Но, конечно, лучше всего явно указать значение по умолчанию.
UUps - надо сначала протестировать, прежде чем писать. Поэтому раньше я не делал необязательного без значения по умолчанию из .net, поэтому я помнил только IsMissing, но не вариант :-( Спасибо за исправление.
В представленном виде используемая формула не включает значение необязательного параметра K2Value. В определении функции 6 параметров, а в вызове функции только 5 параметров:
=@IF(G7="", "", Merged_Lookup_Concat(G7, Таблица1[Дата и время], $K$2, Таблица1[Название], Таблица1[Время и заголовок]))
Функция Merged_Lookup_Concat (SearchDate As String, _ SDate как диапазон, SearchValue как строка, _ SValue как диапазон, ReturnCol как диапазон, необязательно K2Value как строка) как строка
Необязательный параметр K2Value не включается в вызов функции, поэтому он всегда будет содержать значение по умолчанию — нулевую строку. Затем, поскольку параметр K2Value всегда равен «», независимо от того, что находится в ячейке K2, первая половина функции никогда не используется, а только вторая половина, которая фильтрует только дату поиска и игнорирует значение поиска.
Значение ячейки К2 передается в параметр SearchValue, поэтому именно этот параметр необходимо проверить, чтобы определить, есть ли значение в К2.
Я думаю, что строка:
If K2Value <> "" Then
просто нужно заменить на
If SearchValue <> "" Then
И нет необходимости в дополнительном параметре K2Value в определении функции.