Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 13:37   #1
smbd
 
Регистрация: 13.03.2011
Сообщений: 3
По умолчанию Глобальная переменная = 0 в Worksheet_SelectionChange

Excel 2003. в Модуле1 объявлена глобальная переменная
Public qqq As Byte
и в дальнейшем ей присвоено значение(например 7).

В модуле Листа1 следующий код:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
MsgBox (qqq)
End Sub

При переводе курсора на другую ячейку появляется сообщение "7", т.е.
всё работает. Но как только я вставляю на лист activeX-кнопку

Set cb = Worksheets(1).OLEObjects.Add(ClassT ype:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=500, Top:=400, Width:=110, Height:=40),

при выборе другой ячейки появляется сообщение "0". Где теряется значение глобальной переменной qqq? Помогите плиз )
smbd вне форума Ответить с цитированием
Старый 13.03.2011, 14:15   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Где теряется значение глобальной переменной qqq?
При некоторых событиях (типа вашего OLEObjects.Add) Excel может заново инициализировать все глобальные переменные ("обнуляя" их, если выражаться проще)
Подробностей не знаю - просто читал об это где-то на форумах.

Короче, считайте это глюком (или особенностью) Excel.
Как побороть - придумайте сами.
Или откажитесь от добавления кнопок, или избавляйтесь от глобальных переменных (они редко нужны, я их в коде почти никогда не использую)
EducatedFool вне форума Ответить с цитированием
Старый 13.03.2011, 14:22   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а когда (и где) qqq получает значение 7?
вы добавили код в проект. переменные обнулились.
обьявите
Public Const qqq as byte = 7
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 14.03.2011, 14:24   #4
smbd
 
Регистрация: 13.03.2011
Сообщений: 3
По умолчанию

Значение qqq присваивается в модуле формы(при запуске, в самом начале) в зависимости от того, что выбрал пользователь. Что интересно, до первого ручного изменения положения курсора qqq везде = 7, но стоит раз вручную нажать на любую ячейку на листе, и qqq = 0. Судя по всему это действительно глюк Excel, будем избавляться от глобальных переменных, спасибо !
smbd вне форума Ответить с цитированием
Старый 14.03.2011, 14:31   #5
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Я когда-то так и не добился, почему Игорь (EducatedFool) не любит глобальных переменных
Сейчас вижу одну из причин. Есть еще?
vikttur вне форума Ответить с цитированием
Старый 14.03.2011, 14:46   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Виктор,не угадал.
Обнуляются все переменные,массивы,Static и ...........
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 14.03.2011, 14:54   #7
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Обнуляются все переменные,массивы,Static и ...
Как при сбое или ошибке в коде...
Значит, не угадал
vikttur вне форума Ответить с цитированием
Старый 14.03.2011, 14:54   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от vikttur Посмотреть сообщение
Сейчас вижу одну из причин. Есть еще?
Больше, наверное, нет. Всё остальное - ИМХО, дело вкуса.

Я не использую глобальные переменные, поскольку обычно пишу сложные макросы, состоящие из десятков функций.
Если бы я вместо функций применял процедуры, храня промежуточные результаты в глобальных переменных, - часто бы путался в коде.

Да и в основном я собираю программу как конструктор - из отдельных блоков-функций (свой сайт я создал как раз для хранения этих функций - как в записной книжке).
Сейчас я просто закидываю кучу функций в отдельный модуль, и вызываю функции по необходимости, получая от них результат их работы.
А если бы это были процедуры, записывающие результаты в глобальные переменные, - мне бы ещё пришлось добавлять кучу строк кода (с этими переменными), и в ходе работы над проектом помнить, в какой переменной что хранится.
Да ещё и область видимости переменных учитывать...
EducatedFool вне форума Ответить с цитированием
Старый 14.03.2011, 15:03   #9
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Понял, спасибо.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Я не использую глобальные переменные, поскольку обычно пишу сложные макросы, состоящие из десятков функций.
Мне это ближайшее время не грозит
vikttur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальная переменная mutabor JavaScript, Ajax 2 31.12.2010 12:23
C++ [Глобальная переменная] Lemo Помощь студентам 2 26.10.2009 17:49
Глобальная переменная для одной формы bcb 2k9 xLoMMx Общие вопросы C/C++ 2 16.09.2009 22:20
Глобальная переменная в проектном файле. Nikolaeva Общие вопросы Delphi 8 23.04.2009 12:31