Сегодня столкнулся с головоломкой, обходное решение для себя нашел вовсе исключив переменную, но вопрос не дает покоя весь день.
Почему PUBLIC переменная которая указана на листе, не передается при вызове процедуры из модуля и как это правильно нужно реализовать чтоб все же передавалась? Если сделать паблик на двух разных модуля то паблик работает, но вот с листа в паблик обнуляется.
Файл с коротким примером во вложении.
Заранее благодарен за помощь.
Добрый день, коллеги.
Сегодня столкнулся с головоломкой, обходное решение для себя нашел вовсе исключив переменную, но вопрос не дает покоя весь день.
Почему PUBLIC переменная которая указана на листе, не передается при вызове процедуры из модуля и как это правильно нужно реализовать чтоб все же передавалась? Если сделать паблик на двух разных модуля то паблик работает, но вот с листа в паблик обнуляется.
Здравствуйте. Перенесите объявление этой переменной в стандартный модуль и вызывайте её или присваивайте ей значения в любой процедуре. Публичная переменная должна быть объявлена один раз в начале стандартного модуля.
Здравствуйте. Перенесите объявление этой переменной в стандартный модуль и вызывайте её или присваивайте ей значения в любой процедуре. Публичная переменная должна быть объявлена один раз в начале стандартного модуля.gling
ЯД-41001506838083
Сообщение отредактировал gling - Четверг, 25.08.2022, 23:16
Та с модулем то понятное дело что работает... но не вариант. У меня в реальной задаче, я пытался отследить change на option button, которая должна находится именно на листе, а не в модуле. А то действие что происходит после отслеживания изменения находится в модуле. Я ж говорю, обходной для себя путь вовсе без паблика я то нашел, но это уже не относится к топику, но покоя не дает то почему обьявленная переменная на листе не передается в модуль и как это можно реализовать чтоб все же заработало.
Та с модулем то понятное дело что работает... но не вариант. У меня в реальной задаче, я пытался отследить change на option button, которая должна находится именно на листе, а не в модуле. А то действие что происходит после отслеживания изменения находится в модуле. Я ж говорю, обходной для себя путь вовсе без паблика я то нашел, но это уже не относится к топику, но покоя не дает то почему обьявленная переменная на листе не передается в модуль и как это можно реализовать чтоб все же заработало.DJ_Marker_MC
Потому, что это так. В чем проблема объявить переменную в стандартном модуле? В модуле листа она будет видна А можно и непосредственно в процедуре [vba]
Код
Sub Main() Dim МояПеременная Dim MyRange As Range Set MyRange = Range("A1") МояПеременная = MyRange.Offset(0, 3) Call Macro1(МояПеременная) End Sub
Sub Macro1(МояПеременная) MsgBox МояПеременная End Sub
Потому, что это так. В чем проблема объявить переменную в стандартном модуле? В модуле листа она будет видна А можно и непосредственно в процедуре [vba]
Код
Sub Main() Dim МояПеременная Dim MyRange As Range Set MyRange = Range("A1") МояПеременная = MyRange.Offset(0, 3) Call Macro1(МояПеременная) End Sub
Sub Macro1(МояПеременная) MsgBox МояПеременная End Sub
Private Sub OptionButton2_Change() Dim МояПеременная МояПеременная = 1 End Sub
Что-то я не догнал, но вот этот-то фрагмент как минимум вот так должен быть записан, т.е. на уровень модуля переменную надо вынести: [vba]
Код
Dim МояПеременная
Private Sub OptionButton2_Change() 'Dim МояПеременная МояПеременная = 1 End Sub
[/vba] если Вы рассчитываете ее использовать между функциями.
[p.s.]А для примера сообщения №1 всё работает, если модулю2 придать такой вид:[/p.s.] [vba]
Код
Sub Macro1() MsgBox Лист1.МояПеременная End Sub
[/vba] Лист - это же объект класса Worksheet. Соответственно, все Public-переменные, объявленные в модуле листа - это его свойства, доступные извне (наберите в коде Лист1 с точкой и увидите в списке в самом низу свойство МояПеременная). Но само же свойство без указания идентификатора объекта (класса) невозможно использовать во внешней среде, поэтому и Лист1.МояПеременная.
Private Sub OptionButton2_Change() Dim МояПеременная МояПеременная = 1 End Sub
Что-то я не догнал, но вот этот-то фрагмент как минимум вот так должен быть записан, т.е. на уровень модуля переменную надо вынести: [vba]
Код
Dim МояПеременная
Private Sub OptionButton2_Change() 'Dim МояПеременная МояПеременная = 1 End Sub
[/vba] если Вы рассчитываете ее использовать между функциями.
[p.s.]А для примера сообщения №1 всё работает, если модулю2 придать такой вид:[/p.s.] [vba]
Код
Sub Macro1() MsgBox Лист1.МояПеременная End Sub
[/vba] Лист - это же объект класса Worksheet. Соответственно, все Public-переменные, объявленные в модуле листа - это его свойства, доступные извне (наберите в коде Лист1 с точкой и увидите в списке в самом низу свойство МояПеременная). Но само же свойство без указания идентификатора объекта (класса) невозможно использовать во внешней среде, поэтому и Лист1.МояПеременная.Gustav
Gustav, бинго Моя ошибка была выходит только в том, что я не указывал "лист1." в модуле, а просто писал "Моя Переменная". теперь же, если задать Public на листе, а в модуле прописать Лист1.МояПеременная - то все работает как должно. Всем спасибо за помощь. Тема закрыта.
Gustav, бинго Моя ошибка была выходит только в том, что я не указывал "лист1." в модуле, а просто писал "Моя Переменная". теперь же, если задать Public на листе, а в модуле прописать Лист1.МояПеременная - то все работает как должно. Всем спасибо за помощь. Тема закрыта.DJ_Marker_MC