Столкнулся с вопросом, на попытки разобраться с которым потратил уже не одну неделю, без преувеличений. Используется Способ №2 для горизонтальных баз из статьи https://www.planetaexcel.ru/techniques/1/38/, с методом СМЕЩ (OFFSET) и ПОИСКПОЗ (MATCH)
Но как быть, если при формировании списка надо учитывать не только Регион, но и другие столбцы находящиеся в таблице? Например "тип отправления" и нахождения даты между заданными для данного конкретного сотрудника? Другими словами, сделать множественный ПОИСКПОЗ.
Jake, Первое, что приходит в голову - это создать вспомогательный столбец, где "склеить" все интересные параметры в каждой строке. А потом искать соответствие уже по нему... ======================================== Интереса ради рекомендую Вам ознакомится со следующими статьями на сайте Суммирование по множеству условий функцией БДСУММ (DSUM) Как не забивать гвозди микроскопом с функцией СУММПРОИЗВ Возможно какие-нибудь идеи оттуда покажутся Вам небезынтересными
Если кроме Региона учитывать "конверт" и дату, то никакого, т.к. для сотрудника с "конверт" дата не входит между указанных сроков. При смене даты в таблице на любую между 15.06.2020 и 15.06.2021, должен подбираться Сотрудник 3-1 т.к. остальным параметрам удовлетворяет
Jake, поэкспериментируйте с функцией ТЕКСТ ===========UPDATE========== Хотя формально для вспомогательного столбца важна не читабельность представления дат, а однозначность соответствия данных
Jake, а что ? просто обычный выбор по условию данных (многоразовый ВПР)...можно макросом еще что бы он очищал данные и в список попадали данные уже сразу при изменении ячеек (B1 B2 B3) в файле 2 примера
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("B1, B2, B3")) Is Nothing Then
Dim arr, arr2, i As Long, lr As Long, sh As Worksheet, sh2 As Worksheet
Set sh = Worksheets("Ëèñò1"): Set sh2 = Worksheets("Äàííûå")
R = sh.Range("B1"): O = sh.Range("B2"): D = sh.Range("B3")
lr = sh2.Cells(Rows.Count, 1).End(xlUp).Row
arr = sh2.Range("A2:F" & lr)
ReDim arr2(1 To 1)
For i = LBound(arr) To UBound(arr)
If arr(i, 1) = R Then
If arr(i, 6) = O Then
If arr(i, 4) <= D And arr(i, 5) >= D Then
arr2(UBound(arr2)) = arr(i, 3)
ReDim Preserve arr2(1 To UBound(arr2) + 1)
End If
End If
End If
Next i
On Error Resume Next
sh2.Range("H:H").Clear
sh2.Range("H1").Resize(UBound(arr2), 1) = Application.WorksheetFunction.Transpose(arr2)
sh.Range("C5").ClearContents
End If
End Sub
Jake, я Вам макрос выше в файле прикрепил и проверьте его работу, про выбор первый из возможных не сложно так как просто сделать ссылку в коцне моего заменить
Mershik, В присланном вами файле все работает отлично.. но макрос совершенно отказывается заполнять конец таблицы в листе Данные в рабочем файле! Перенес корректно, имена листов те же, номера ячеек и ссылок на столбцы исправил, переменные передаются верно (проверил в MsgBox), дошло уже до того - что полностью переделал в вашем примере архитектуру "как у рабочего", и переключая между макросами - разницы в примере и рабочем никакого - они идентичны, но заполнения все равно нет!