ZVI написал: вызов из кода листа справочника уже неправильный
вы имеете ввиду, что так должно быть? — If IsChanged Then ZVI_UpdateDic. Если да, то пропустил просто по недосмотру…спасибо!
Цитата
ZVI написал: Это уже Ваш код, но в нем от обилия "ZVI" рябит немного в глазах
ну я всегда указываю источники, когда код не мой. Это и дань уважения авторства, и всегда можно из кода найти ссылку на тему. А процедуры и функции с префиксом также, чтобы их различать Это ведь никак не влияет на вызов и работу, кажется?…
UPD: а что делает Compile VBAProject? Я нажал и ничего не произошло)) ищу на англоязычных сайтах, но пока не понял… Вроде как переходит к ошибке, если она есть и я правильно понял
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: а что делает Compile VBAProject?
Пытается скомпилировать код, чтобы потом его быстро выполнять, но вначале проверяет, нет ли ошибок. В том архиве с ошибкой при попытке скомпилировать отладчик выделяет UpdateDic и сообщает, что такой функции или процедуры не найдено: Compile Error - Sub or Function not defined
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Нашёл тут (в конце) вариант использования штатных функций листа для поиска по ключам длиннее 255 символов. Пытаюсь замутить UDF, а она кривляется прошу подсказки (на листе все 3 работают исправно)
Код
Public Function Подтянуть(Что_ищем, Где_ищем, Откуда_тянем)
Подтянуть = WorksheetFunction.index(Откуда_тянем, WorksheetFunction.SumProduct(WorksheetFunction.Match(True, Где_ищем = Что_ищем, 0)))
End Function
'=== и ещё парочка однотипных функций (думаю, что принцип "нерабочести" тот же)
Public Function СчитатьЕсли(Что_считаем, Где_считаем)
СчитатьЕсли = WorksheetFunction.SumProduct((Что_считаем = Где_считаем) * 1)
End Function
'=========================================================================================================================
Public Function СложитьЕсли(Что_ищем, Где_ищем, Откуда_суммируем)
СложитьЕсли = WorksheetFunction.SumProduct((Что_ищем = Где_ищем) * Откуда_суммируем)
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, и Вам наше с кисточкой) Ох уж эти формулы и UDF заточенные под лист... Всегда было (для меня) написать что-нибудь делающее массовые изменения) Может входные параметры не корректны? --- прогнал через F8 - Type Mismatch (в самой функции).
Anchoret, не-не — никаких ошибок во входящих. Также, как и на листе, передаю 2 или 3 (в зависимости от функции) значения/диапазона мне просто по-прежнему иногда нужно использовать ВПР, суммесли и счётесли для длинных ключей)) эти варианты очень шустрые - вот хотел UDFки для сотрудников накатать… Если подскажете другой вариант решения, то здорово. Только, чтобы я понял
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
а что не так-то — не понимаю(( попробовал назначить as Range - не помогло
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, а вариант предложенный ZVI уже не устраивает (ВПР)?) Свой эквивалент этой функции я вроде уже предлагал в этой теме) Там ничего особо сложного нет, пару раз прогнать через F8 и все будет понятно. Все самое быстрое - на массивах. На малых объемах можно задействовать коллекции и словари.
Anchoret, вариант от ZVI я использую, но для других нужд (и он суперкруто справляется, тем более, я его прекрасно понимаю). С вашими кодами разобраться, как следует, пока не могу. По СУММПРОИЗВ в VBA что не так скажете?))) просто странно очень - простая же формула… Единственное, что мне приходит в голову - это то, что функции листа и их VBA-аналоги всё-таки по-разному обрабатывают информацию и в данном случае это критично
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: функции листа и их VBA-аналоги всё-таки по-разному обрабатывают информацию
При применении функций листа в VBA возникает ограничение на кол-во ячеек/элементов массива этими функциями обрабатываемых. Возможно отсюда и ошибки. Например на большинство функций работающих с массивами в VBA (Max,Min,Average) есть ограничение на 65535 обрабатываемых значений/элементов. И это с Excel 2007, возможно на предыдущих версиях это ограничение более сурово.
Anchoret, ячеек 350 в каждом диапазоне)) xl2016 win7 x64 - что-то другое…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, а почему должна работать конструкция SumProduct((Что_считаем = Где_считаем) * 1)? Это всеж не лист и в Что_считаем = Где_считаем - переменная сравнивается с масивом, что странно, а не по отдельности в цикле, чтоб было странно. нт в данном случае аналога массивного ввода и это равенство не создает массива результатов.
Я могу ошибаться но моя логика говорит именно так.
вот и я так подумал, что принципы разные. Наверное, прямой аналог на цикле по элементам массива будет намного медленнее(( спасибо!))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄