Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Public переменная не передается с листа в модуль - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Public переменная не передается с листа в модуль (Макросы/Sub)
Public переменная не передается с листа в модуль
DJ_Marker_MC Дата: Четверг, 25.08.2022, 20:14 | Сообщение № 1
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Добрый день, коллеги.

Сегодня столкнулся с головоломкой, обходное решение для себя нашел вовсе исключив переменную, но вопрос не дает покоя весь день.

Почему PUBLIC переменная которая указана на листе, не передается при вызове процедуры из модуля и как это правильно нужно реализовать чтоб все же передавалась?
Если сделать паблик на двух разных модуля то паблик работает, но вот с листа в паблик обнуляется.

Файл с коротким примером во вложении.

Заранее благодарен за помощь.
К сообщению приложен файл: _-1-.xlsm (14.0 Kb)
 
Ответить
СообщениеДобрый день, коллеги.

Сегодня столкнулся с головоломкой, обходное решение для себя нашел вовсе исключив переменную, но вопрос не дает покоя весь день.

Почему PUBLIC переменная которая указана на листе, не передается при вызове процедуры из модуля и как это правильно нужно реализовать чтоб все же передавалась?
Если сделать паблик на двух разных модуля то паблик работает, но вот с листа в паблик обнуляется.

Файл с коротким примером во вложении.

Заранее благодарен за помощь.

Автор - DJ_Marker_MC
Дата добавления - 25.08.2022 в 20:14
gling Дата: Четверг, 25.08.2022, 22:44 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2519
Репутация: 674 ±
Замечаний: 0% ±

2010
Здравствуйте.
Перенесите объявление этой переменной в стандартный модуль и вызывайте её или присваивайте ей значения в любой процедуре. Публичная переменная должна быть объявлена один раз в начале стандартного модуля.


ЯД-41001506838083

Сообщение отредактировал gling - Четверг, 25.08.2022, 23:16
 
Ответить
СообщениеЗдравствуйте.
Перенесите объявление этой переменной в стандартный модуль и вызывайте её или присваивайте ей значения в любой процедуре. Публичная переменная должна быть объявлена один раз в начале стандартного модуля.

Автор - gling
Дата добавления - 25.08.2022 в 22:44
DJ_Marker_MC Дата: Пятница, 26.08.2022, 09:36 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Та с модулем то понятное дело что работает... но не вариант. У меня в реальной задаче, я пытался отследить change на option button, которая должна находится именно на листе, а не в модуле. А то действие что происходит после отслеживания изменения находится в модуле. Я ж говорю, обходной для себя путь вовсе без паблика я то нашел, но это уже не относится к топику, но покоя не дает то почему обьявленная переменная на листе не передается в модуль и как это можно реализовать чтоб все же заработало.
 
Ответить
СообщениеТа с модулем то понятное дело что работает... но не вариант. У меня в реальной задаче, я пытался отследить change на option button, которая должна находится именно на листе, а не в модуле. А то действие что происходит после отслеживания изменения находится в модуле. Я ж говорю, обходной для себя путь вовсе без паблика я то нашел, но это уже не относится к топику, но покоя не дает то почему обьявленная переменная на листе не передается в модуль и как это можно реализовать чтоб все же заработало.

Автор - DJ_Marker_MC
Дата добавления - 26.08.2022 в 09:36
RAN Дата: Пятница, 26.08.2022, 11:53 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
не дает то почему

Потому, что это так.
В чем проблема объявить переменную в стандартном модуле? В модуле листа она будет видна
А можно и непосредственно в процедуре %)
[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]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Пятница, 26.08.2022, 11:54
 
Ответить
Сообщение
не дает то почему

Потому, что это так.
В чем проблема объявить переменную в стандартном модуле? В модуле листа она будет видна
А можно и непосредственно в процедуре %)
[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]

Автор - RAN
Дата добавления - 26.08.2022 в 11:53
DJ_Marker_MC Дата: Пятница, 26.08.2022, 12:52 | Сообщение № 5
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
RAN, да, таким образом работает, а вот таким не хочет:

Лист:
[vba]
Код
Private Sub OptionButton2_Change()
Dim МояПеременная
    МояПеременная = 1
End Sub

Private Sub OptionButton1_Click()
    If МояПеременная = 1 Then
        Call Macro1(МояПеременная)
    End If
End Sub

Private Sub OptionButton2_Click()
Call Macro1(МояПеременная)
End Sub
[/vba]

МОДУЛЬ
[vba]
Код
Sub Macro1(МояПеременная)
    MsgBox МояПеременная
End Sub
[/vba]
К сообщению приложен файл: __2.xlsm (23.1 Kb)
 
Ответить
СообщениеRAN, да, таким образом работает, а вот таким не хочет:

Лист:
[vba]
Код
Private Sub OptionButton2_Change()
Dim МояПеременная
    МояПеременная = 1
End Sub

Private Sub OptionButton1_Click()
    If МояПеременная = 1 Then
        Call Macro1(МояПеременная)
    End If
End Sub

Private Sub OptionButton2_Click()
Call Macro1(МояПеременная)
End Sub
[/vba]

МОДУЛЬ
[vba]
Код
Sub Macro1(МояПеременная)
    MsgBox МояПеременная
End Sub
[/vba]

Автор - DJ_Marker_MC
Дата добавления - 26.08.2022 в 12:52
Gustav Дата: Пятница, 26.08.2022, 13:14 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2696
Репутация: 1123 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.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.МояПеременная.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 26.08.2022, 14:07
 
Ответить
Сообщение
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
Дата добавления - 26.08.2022 в 13:14
DJ_Marker_MC Дата: Пятница, 26.08.2022, 14:19 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, бинго hands Моя ошибка была выходит только в том, что я не указывал "лист1." в модуле, а просто писал "Моя Переменная".
теперь же, если задать Public на листе, а в модуле прописать Лист1.МояПеременная - то все работает как должно.
Всем спасибо за помощь. Тема закрыта.
 
Ответить
СообщениеGustav, бинго hands Моя ошибка была выходит только в том, что я не указывал "лист1." в модуле, а просто писал "Моя Переменная".
теперь же, если задать Public на листе, а в модуле прописать Лист1.МояПеременная - то все работает как должно.
Всем спасибо за помощь. Тема закрыта.

Автор - DJ_Marker_MC
Дата добавления - 26.08.2022 в 14:19
RAN Дата: Пятница, 26.08.2022, 16:09 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
DJ_Marker_MC, а так?

[vba]
Код
Private Sub OptionButton2_Change()
    МояПеременная = 1
End Sub

Private Sub OptionButton1_Click()
    If МояПеременная = 1 Then
        Call Macro1
    End If
End Sub

Private Sub OptionButton2_Click()
Call Macro1
End Sub
[/vba]

[vba]
Код
Public МояПеременная
Sub Macro1()
    MsgBox МояПеременная
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеDJ_Marker_MC, а так?

[vba]
Код
Private Sub OptionButton2_Change()
    МояПеременная = 1
End Sub

Private Sub OptionButton1_Click()
    If МояПеременная = 1 Then
        Call Macro1
    End If
End Sub

Private Sub OptionButton2_Click()
Call Macro1
End Sub
[/vba]

[vba]
Код
Public МояПеременная
Sub Macro1()
    MsgBox МояПеременная
End Sub
[/vba]

Автор - RAN
Дата добавления - 26.08.2022 в 16:09
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Public переменная не передается с листа в модуль (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!