Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Зацикленное обращение к функции

Автор Dmitry_Cheplya, 17.07.2024, 10:56:35

« назад - далее »

Dmitry_Cheplya

Приветствую, форумчане!
Столкнулся с необъяснимым мне явлением. Есть событийная процедура VBA Excel (_Change), которая обращается к функции на другом листе с аргументом-значением ячейки (все по классике). Но при обращении к функции такой строкой:

.Cells(q, 12).Value = ThisWorkbook.Worksheets("Расчет ЗП").Preobraz(.Cells(Target.Row, 8).Value, ThisWorkbook.Name) & "*" & .Cells(Target.Row, 9).Value

возникает ошибка "Run-time error '1004' Application-defined or object-defined error".
Если обращение к функции заменить произвольной строкой (от знака "=" до первого "&"), то программа вставляет выражение в ячейку. Так и должно быть.
Если значение ячейки в качестве аргумента функции заменить произвольной строкой, то программа переходит в процедуру, отрабатывает ее (функция подменяет в строке буквы на цифры, превращая строку в математическое выражение - в другом месте программы эта функция уже показала, что работает правильно) и возвращается на эту же строку и опять уходит в отработку функции. И так по кругу. Значение никакое не вносит в ячейку.

Если что, то в начале событийной процедуры стоит "гашение" реакции на события строкой Application.EnableEvents = False.

Если кто поможет разгадать ребус, буду признателен.

Дмитрий Щербаков(The_Prist)

Напишите, что именно надо сделать и на каком листе, чтобы данный эффект проявился.
Потому что у меня лично ошибка возникает на совсем другой строке:
.Cells(q, 16).Value = .Cells(q, 11).Value + .Cells(q, 12).Value + .Cells(q, 13).Value + .Cells(q, 14).Valueпотому что в столбце L(ячейка .Cells(q, 12).Value - строка 6) записан текст: "upor*1", который не может быть преобразован в число и его нельзя прибавить к другим значениям.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Dmitry_Cheplya

Я про это и писал - в таком случае будет работать нормально (ошибки появляющиеся ниже по коду - результат тестирования на экспериментальных данных).
Надо снять комментарий со строк 24 и 25, а 32 и 33 закомментить - это будет требуемый код программы

Дмитрий Щербаков(The_Prist)

#3
Ничего не понятно, про что именно Вы писали :)
В приложенном файле четко видно: Вы создаете аргумент для дальнейшей обработки текстовый, но пытаетесь с ним произвести математические действия, используя знак "+". Зачем Вы это делаете - известно только Вам.
Я раскомментировал эти строки и? Все отрабатывает без зацикливания и останавливается все так же на озвученной строке. Изменил код так, что нет ошибки(оставив только корректные строки) - нет зацикливания. Но проблема в том, что выхожу на код тупо изменяя значение первой попавшейся ячейки на листе "Расчёт премии".
Отсюда повторю изначальную просьбу(последний раз): что и где надо сделать, чтобы увидеть проблему? Мне что надо изменить на листе? На каком листе? В какой ячейке? Почему Вы заставляете желающих Вам помочь рыскать в поисках нужных действий?

P.S. Поймите правильно: возможно, это зависит не только от кода, но и от версии Excel и других факторов и у других может вообще не проявится. В таком случае правильный порядок действий хотя бы сможет это подтвердить, если ни у кого больше ситуация не воспроизведется.

P.P.S.
Цитата: Dmitry_Cheplya от 17.07.2024, 11:29:23Надо снять комментарий со строк 24 и 25, а 32 и 33 закомментить - это будет требуемый код программы
просто интересно - а зачем тогда изначально выкладывать не тот код? :) Чтобы помогающим квест показался интереснее?  ;-D
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Dmitry_Cheplya

Согласен - много лишнего. Лишнее из кода убрал
На листе "Расчёт премии" надо изменить ячейку любую в диапазоне (23,9):(28,9)  оно же  (I23:I28) и по измененному значению запустится программа с выходом на Case с обращением к функции

Дмитрий Щербаков(The_Prist)

#5
вот теперь получилось. Надо было сделать главное - изменить значение ячейки столбца I так, чтобы было менее 100%(поставил 90). В этом случае значение ячейки .Cells(Target.Row, 9).Value было 0,9, что недопустимо внутри формулы - нужно заменить запятую на точку. И лучше записывать это через Formula, а не через Value - Вы же формулу записываете:
.Cells(q, 12).Formula = ThisWorkbook.Worksheets("Расчет ЗП").Preobraz(.Cells(Target.Row, 8).Value, ThisWorkbook.Name) & "*" & Trim(Str(.Cells(Target.Row, 9).Value))я использовал функцию Str, которая сама приводит переданное число в нужную локализацию. Trim необходим, чтобы убрать лишние пробелы, которые добавляет в начало числа Str.

Ну и далее в следующих строках необходимо проделать тоже самое или вынести это в отдельную функцию.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Dmitry_Cheplya

Спасибо большое! Все получилось. Получилось бы и раньше, задай я нормально вопрос... ;-D

Яндекс.Метрика Рейтинг@Mail.ru