Добрый день, Мной была написана пользовательская функция VBA: v_Hd (cм. прилагаемый файл, модуль Module1) в качестве аргументов функции в том числе были заданы параметры D, t.
При попытке использовать эту функцию на листе Excel (см. Лист 1, ячейка E3 в прилагаемом файле), этим аргументам не присваиваются значения из ячеек, которые в качестве ссылки использованы в формуле. Это видно в отладчике Всем аргументам (D, t) присваивается 0. В чем ошибка? Заранее благодарю!
Добрый день, Мной была написана пользовательская функция VBA: v_Hd (cм. прилагаемый файл, модуль Module1) в качестве аргументов функции в том числе были заданы параметры D, t.
При попытке использовать эту функцию на листе Excel (см. Лист 1, ячейка E3 в прилагаемом файле), этим аргументам не присваиваются значения из ячеек, которые в качестве ссылки использованы в формуле. Это видно в отладчике Всем аргументам (D, t) присваивается 0. В чем ошибка? Заранее благодарю!neonar
Для того, чтобы увидеть в отладчике, какие значения имеют аргументы нужно заставить функцию сработать и в какой то момент сделать прерывание. Вся ваша функция состоит из одного оператора присваивания значения функции, вот перед ней поставьте оператор Stop. Чтобы функция сработала нужно изменить значение какого то аргумента, или просто нажать клавишу F9. Вот тогда и смотрите в отладчике, какие значения имеют аргументы.
Для того, чтобы увидеть в отладчике, какие значения имеют аргументы нужно заставить функцию сработать и в какой то момент сделать прерывание. Вся ваша функция состоит из одного оператора присваивания значения функции, вот перед ней поставьте оператор Stop. Чтобы функция сработала нужно изменить значение какого то аргумента, или просто нажать клавишу F9. Вот тогда и смотрите в отладчике, какие значения имеют аргументы.i691198
Я итак сделал прерывание функции это видно на скриншоте, там же видно что значение аргумента D=0, а не 250. Я умею пользоваться отладчиков, вопрос был в другом. Функция состоит из одного оператора для упрощения, чтобы не загружать участников форума. Реальная функция выглядит более сложно. Это никак не влияет на суть вопроса.
Я итак сделал прерывание функции это видно на скриншоте, там же видно что значение аргумента D=0, а не 250. Я умею пользоваться отладчиков, вопрос был в другом. Функция состоит из одного оператора для упрощения, чтобы не загружать участников форума. Реальная функция выглядит более сложно. Это никак не влияет на суть вопроса.neonar
Странно, у меня другой результат. У меня excel 2021. А у вас какой? Просто была такая же проблема у меня, помогло закрытие-открытие файла. А сейчас такое не помогает.
Странно, у меня другой результат. У меня excel 2021. А у вас какой? Просто была такая же проблема у меня, помогло закрытие-открытие файла. А сейчас такое не помогает.neonar
У меня 2016, но это никак не должно влиять на результат. Могу только предположить, что у вас эта функция используется не только в этой ячейке и где то эти параметры равны 0.
У меня 2016, но это никак не должно влиять на результат. Могу только предположить, что у вас эта функция используется не только в этой ячейке и где то эти параметры равны 0.i691198
Я скачал этот же свой файл из 1 поста, что и вы и на нем тестировал. В этом файле только одна функция я его сделал для того чтобы выложить на форум
Я скачал этот же свой файл из 1 поста, что и вы и на нем тестировал. В этом файле только одна функция я его сделал для того чтобы выложить на форумneonar
Сообщение отредактировал neonar - Суббота, 28.10.2023, 09:42
neonar, Вы не написали к сожалению функцию. Ваша функция не рассчитывает значения а присваивает константу 2.
На будущее не присваивайте переменным имена на кириллице, тем более с такими длинными похожими именами. Вторая функция будет выдавать всегда пустое значение.
Удачи.
neonar, Вы не написали к сожалению функцию. Ваша функция не рассчитывает значения а присваивает константу 2.
На будущее не присваивайте переменным имена на кириллице, тем более с такими длинными похожими именами. Вторая функция будет выдавать всегда пустое значение.
VovaK, функция v_Hd нормальная, просто она не использует аргументы для возвращаемого значения. Но значения аргументам должны присваиваться в любом случае. Если я напишу функцию реальную, то результат будет такой же D=0, t=0.
Функция УдалитьСимволы работает корректно к ней нет у меня вопросов никаких. Писал много функций на кириллице, никогда из-за этого не было проблем и сейчас нет. Это ваше субъективное мнение.
VovaK, функция v_Hd нормальная, просто она не использует аргументы для возвращаемого значения. Но значения аргументам должны присваиваться в любом случае. Если я напишу функцию реальную, то результат будет такой же D=0, t=0.
Функция УдалитьСимволы работает корректно к ней нет у меня вопросов никаких. Писал много функций на кириллице, никогда из-за этого не было проблем и сейчас нет. Это ваше субъективное мнение.neonar
Сообщение отредактировал neonar - Суббота, 28.10.2023, 21:56
Функция работает нормально. Что в неё приходит, то она и выводит в отладчик. И на первом "шаге" в нее действительно приходят нули в параметры D и t, так как соответствующие ячейки K3 и L3 в этот момент имеют пустые значения! Прикольно, да?
А имеют они их таковыми из-за того, что в них пересчитываются формулы с функциями ВПР, к тому же завязанные друг на друга (ячейка L3 зависит от K3), да еще и содержащие в своем составе волатильные (летучие) функции ДВССЫЛ, которые вообще пересчитываются при каждом "чихе" в таблице (текст формул см. ниже в P.S.).
И вот по внутренним алгоритмам пересчета ячеек - это, пожалуйста, в Силиконовую долину, к вреднюгам из Майкрософта. Только они смогут провести вас по этим закоулкам промежуточных вычислений, пока Excel пересчитывает формулы и пока в левом нижнем углу окна не загорелся индикатор "ГОТОВО". Хотя они, в общем-то, и не обязаны ничего объяснять про промежутки, пока процесс пересчета не завершен. Понятно, что 100 формул, грубо говоря, так или иначе пересчитываются последовательно друг за другом, хотя нам кажется, что всё пересчиталось мгновенно и одновременно. Всегда можно поставить точку прерывания где-то посредине процесса так, что первые 50 формул уже пересчитались, а оставшиеся 50 - еще нет. Конечно, в этот момент "незаконченности" могут быть какие-то врЕменные шероховатости и нестыковки между первой и второй половиной.
Примерно это вы и имеете в ситуации с вашей функцией. Но приходит второй шаг (а может быть и третий) - в общем, некий заключительный шаг приходит и всё становится согласованно: и входящие параметры, и результат функции. И какая вам разница, сколько было этих промежуточных шагов-пересчетов, если ячейка в конце концов показывает правильное значение? И у меня, кстати, смутное подозрение, что в данном конкретном случае количество этих шагов напрямую зависит от количества функций ДВССЫЛ (можете поэкспериментировать, добавив ещё параметрами ссылки на ячейки, содержащие ДВССЫЛ).
Вот мой вид функции, демонстрирующий начальную пустоту ячеек K3 и L3, значения которых идут как нули во входные параметры D и t: [vba]
Код
Public Function v_Hd(Dy As Integer, D As Single, t As Single, i As Single, Qp As Single, material As String, flag As Integer)
v_Hd = 2 Debug.Print "K3=", [K3].Value, "L3=", [L3].Value Debug.Print Dy, D, t, i, Qp Debug.Print material, flag
P.S. А формулы в рассмотренных выше ячейках K3 и L3 соответственно такие:
Код
=ВПР($J3;ДВССЫЛ(Q3);2;)
Код
=ВПР($K3;ДВССЫЛ(Q3);3;)
Функция работает нормально. Что в неё приходит, то она и выводит в отладчик. И на первом "шаге" в нее действительно приходят нули в параметры D и t, так как соответствующие ячейки K3 и L3 в этот момент имеют пустые значения! Прикольно, да?
А имеют они их таковыми из-за того, что в них пересчитываются формулы с функциями ВПР, к тому же завязанные друг на друга (ячейка L3 зависит от K3), да еще и содержащие в своем составе волатильные (летучие) функции ДВССЫЛ, которые вообще пересчитываются при каждом "чихе" в таблице (текст формул см. ниже в P.S.).
И вот по внутренним алгоритмам пересчета ячеек - это, пожалуйста, в Силиконовую долину, к вреднюгам из Майкрософта. Только они смогут провести вас по этим закоулкам промежуточных вычислений, пока Excel пересчитывает формулы и пока в левом нижнем углу окна не загорелся индикатор "ГОТОВО". Хотя они, в общем-то, и не обязаны ничего объяснять про промежутки, пока процесс пересчета не завершен. Понятно, что 100 формул, грубо говоря, так или иначе пересчитываются последовательно друг за другом, хотя нам кажется, что всё пересчиталось мгновенно и одновременно. Всегда можно поставить точку прерывания где-то посредине процесса так, что первые 50 формул уже пересчитались, а оставшиеся 50 - еще нет. Конечно, в этот момент "незаконченности" могут быть какие-то врЕменные шероховатости и нестыковки между первой и второй половиной.
Примерно это вы и имеете в ситуации с вашей функцией. Но приходит второй шаг (а может быть и третий) - в общем, некий заключительный шаг приходит и всё становится согласованно: и входящие параметры, и результат функции. И какая вам разница, сколько было этих промежуточных шагов-пересчетов, если ячейка в конце концов показывает правильное значение? И у меня, кстати, смутное подозрение, что в данном конкретном случае количество этих шагов напрямую зависит от количества функций ДВССЫЛ (можете поэкспериментировать, добавив ещё параметрами ссылки на ячейки, содержащие ДВССЫЛ).
Вот мой вид функции, демонстрирующий начальную пустоту ячеек K3 и L3, значения которых идут как нули во входные параметры D и t: [vba]
Код
Public Function v_Hd(Dy As Integer, D As Single, t As Single, i As Single, Qp As Single, material As String, flag As Integer)
v_Hd = 2 Debug.Print "K3=", [K3].Value, "L3=", [L3].Value Debug.Print Dy, D, t, i, Qp Debug.Print material, flag