Страницы: 1
RSS
UDF: ВПР, который согласно приоритету тянул бы нужное значение. 
 
Всем привет.

Пытаюсь написать
Для этого воспользовался макросом с excel-planet.
Код
Function VLOOKUP2(Table As Variant, SearchColumnNum As Long, SearchValue As Variant, _
                  N As Long, ResultColumnNum As Long)
    Dim i As Long, iCount As Long
    Select Case TypeName(Table)
    Case "Range"
        For i = 1 To Table.Rows.Count
            If Table.Cells(i, SearchColumnNum) = SearchValue Then
                iCount = iCount + 1
            End If
            If iCount = N Then
                VLOOKUP2 = Table.Cells(i, ResultColumnNum)
                Exit For
            End If
        Next i
    Case "Variant()"
        For i = 1 To UBound(Table)
            If Table(i, SearchColumnNum) = SearchValue Then iCount = iCount + 1
            If iCount = N Then
                VLOOKUP2 = Table(i, ResultColumnNum)
                Exit For
            End If
        Next i
    End Select
End Function
этот макрос тянет n значение из таблицы.
Но проблема как раз в том чтобы определить это n.

Есть три типа контракта: ОСНОВНОЙ(НОНФУД И ПРИКАССА), ПУШ И ОТГРУЗКА. Приоритет следующий:
Если есть ПУШ, то тянем ПУШ КОНТРАКТ, если нет ПУШ КОНТРАКТА-тянем ОСНОВНОЙ КОНТРАКТ, если нет ОСНОВНОГО и ПУШа, то тянем ОТГРУЗКУ.

Если есть какие-нибудь другие идеи как можно решить эту задачу, то прошу подсказать. СРАЗУ ГОВОРЮ, ЧТО СОРТИРОВКА И ПРОЧИЕ СПОСОБЫ С ДОБАВЛЕНИЕМ СТОЛБЦОВ И ИЗМЕНЕНИЕМ ПОРЯДКА МАССИВОВ НЕ ГОДЯТСЯ!

СПАСИБО!
 
Цитата
Nikita1994 написал:
СОРТИРОВКА И ПРОЧИЕ СПОСОБЫ С ДОБАВЛЕНИЕМ СТОЛБЦОВ И ИЗМЕНЕНИЕМ ПОРЯДКА МАССИВОВ НЕ ГОДЯТСЯ

Можно узнать почему?
 
Цитата
Dima S написал:
Можно узнать почему?
Вот это-то как раз не вызывает вопросов: всякие разные корпоративные заморочки могут быть гораздо смешнее, чем у Никиты.

А вот вопросы по сути:
1. В формуле у меня отображается #ССЫЛКА!. Конечно, можно предположить, что там может быть скорее всего. Но лучше бы пример был полностью корректным.
2. Если контракт ОСНОВНОЙ, то какой из типов - НОНФУД И ПРИКАСА (как у DIA2345812) - является приоритетным? Или опять же - главным будет первый попавшийся?

Ну а идеи очевидные: переделать Function VLOOKUP2 под конкретный файл. Работать он будет, но только с этим файлом при сохранении текущей структуры расположения данных.
Изменено: tolikt - 31.12.2018 08:18:13
 
С Наступающим!
Цитата
Nikita1994 написал:
Если есть ПУШ, то тянем ПУШ КОНТРАКТ, если нет ПУШ КОНТРАКТА
- значит нужно сперва просмотртеть весь диапазон на наличие этих "пушей" по конкретному коду.
Можно использовать словарь с коллекцией - каждому ключу код+тип можно собрать коллекцию номеров строк, и далее из этого выбрать что нужно. А что нужно - таки не написали :)
 
Цитата
Dima S написал:
Dima S
это небольшой пример из той ситуации, которая у меня возникла на работе. А вообще такой ВПР мне необходим для очень большого файла, в котором куча столбцов и от порядка следования элементов в этих столбцах зависят другие макросы и файлы. А также сам принцип работы этого файла. Поэтому менять что-либо в этом файле я не хочу. Не знаю с какими последствиями столкнусь.
Цитата
tolikt написал:
Dima S
1) Извиняюсь. Мой косяк. В принципе можно в ячейке B2 в форме вместо "ссылка" вбить цифру 2 и получить нужный ответ.
2) все верно, в этом случае нужно тянуть первый попавшийся контракт. Таких контрактов может быть очень много. я привел в пример всего 2 для удобства и экономии времени.
Вот не знаю как переделать VLOOKUP2. Уверен что есть способы работы с массивами, которые позволяют в самом ВПР фильтровать массив по нужному критерию:
например, если в ячейке C2 вбить следующую формулу:
Код
=ВПР(A2;ЕСЛИ(($J$4:$J$10="ПУШ")*($H$4:$H$10=A2);$H$4:$I$10;ЕСЛИ(($H$4:$H$10=A2)*($J$4:$J$10="Отгрузка");$H$4:$I$10));2;0)

то он будет тянуть нужный контракт ПУШ. Если удалить этот контракт, то есть удалить строку 7 из excel файла, который я скинул, то он будет тянуть контракт Отгрузка. Такая идея подходит мне. Но приоритизация ПУШ, ОТГРУЗКА и ОСНОВНОЙ КОНТРАКТ не совсем правильная. Я не знаю, как задать в формуле с помощью массивов, чтобы он в случае отсутствия ПУШ контракта тянул ОСНОВНОЙ контракт (этот контракт имеет массу вариаций:НОНФУД ПРИКАССА и т.д.). и только после того как нет основного контракта необходимо, чтобы тянулся контракт ОТГРУЗКА.

Цитата
Hugo написал:
Dima S
Слишком мудрено...Макросы вообще не подходят, так как должно все обновляться вместе с нажатием клавиши F9. В принципе прошу не предлагать идеи с макросами, т.к. они не подходят. Если есть какие-нить идеи как это можно замутить с помощью уже имеющихся функций, то прошу пожалуйста подсказать.
 
Nikita1994, хотите обратиться по имени? - не нужно жать на кнопку "Цитировать": ведь есть специальная кнопка - "Имя".
 
Цитата
Nikita1994 написал: Макросы вообще не подходят
А то, чем Вы сейчас пользуетесь, по Вашему что?  VLOOKUP2 это UDF - частный случай макроса :)  ;)
Цитата
Nikita1994 написал: должно все обновляться вместе с нажатием клавиши F9
А при грамотной организации запуска макроса (привязка выполнения к какому нибудь событию, например) вообще ни на что нажимать не придется ;)  
Согласие есть продукт при полном непротивлении сторон
 
Я ни разу не сказал слово "макрос" :)
Словари с коллекциями вполне себе работают и в UDF.
Ну а если
Цитата
Nikita1994 написал:
вообще такой ВПР мне необходим для очень большого файла, в котором куча столбцов
то лучше избегать формул/UDF вообще. А если уж использовать UDF - то лучше одну массивную.
Но т.к. задача оказалась проще (не нужно искать некое по порядку совпадение, а всегда первое), то словари с коллекциями не нужны.
 
может, другой формулой массива тянут
Код
=ЕСЛИОШИБКА(ИНДЕКС($I$4:$I$10;ПОИСКПОЗ(A2&"ПУШ";$H$4:$H$10&$J$4:$J$10;0));ЕСЛИ(ИНДЕКС($I$1:$I$10;МИН(ЕСЛИ(("Отгрузка"<>$J$4:$J$10)*($H$4:$H$10=A2);СТРОКА($I$4:$I$10))))=0;ЕСЛИОШИБКА(ИНДЕКС($I$4:$I$10;ПОИСКПОЗ(A2&"Отгрузка";$H$4:$H$10&$J$4:$J$10;0));"")))
если подойдет, то предложите другое название темы.
С Наступающим
Изменено: artyrH - 31.12.2018 16:10:47
 
artyrH,подошло вроде. Спасибо. Но для второго кода товара выдает ошибку.

я решил это немного по другому:
Код
=ЕСЛИОШИБКА(ЕСЛИОШИБКА(ВПР(A2;ЕСЛИ((I:I="ПУШ")*(G:G=A2);G:H);2;0);ВПР(A2;ЕСЛИ((I:I<>"Отгрузка")*(G:G=A2);G:H);2;0));ВПР(A2;ЕСЛИ((I:I="Отгрузка")*(G:G=A2);G:H);2;0))
Страницы: 1
Наверх