Страницы: 1
RSS
Не получается создать глобальную переменную
 
Доброго времени суток.  
Начал освоение VB. Нужно по работе. В дебри пока не лезу, но уже на самой поверхности упёрся в проблемку, которая упорно не желает решаться.  
Ситуация такова: на сетевом диске находится книга, к которой имеют доступ несколько пользователей. Планирую оборудовать эту книгу полезными макросами. На данном этапе требуется следующее. При открытии книги (Excel 2003) тем или иным пользователем в первую очередь проверяется его имя. В зависимости от имени, переменной (например User) присваиваются  значения от 0 до 10. Все прочие макросы книги должны будут использовать эту переменную (в основном для того чтобы ограничивать свободу действий каждого пользователя сообразно его служебным функциям). Как я понимаю, необходимо создать глобальную переменную. В объекте ЭтаКнига пишу код:  
 
Workbook_open()  
Public Usr As Integer  
 
If Environ("username") = "Ivanov_II" Then  
User = 0  
End If  
If Environ("username") = "Petrov_PP" Then  
User = 1  
End If  
........  
If Environ("username") = "Sidorov" Then  
User = 10  
 
End If  
End Sub  
 
При открытии книги получаю сообщение "Compile Error: Invalid attribute in Sub or Function"  
с выделением в коде слова Public.  
Каюсь, не штудировал матчасть от корки до корки, однако удивлён, почему Excel не позволяет сделать такую, казалось бы, простую вещь. Прошу помочь советом.
 
Уберите строку Public Usr As Integer  
из функции Workbook_open()  
 
после чего создайте (добавьте) СТАНДАРТНЫЙ модуль,  
и в него поместите эту строку (самой верхней строкой)
 
Пишу в стандартный модуль:  
 
Public User As Integer  
-----------------------  
Sub Workbook_Open()  
If Environ("username") = "Ivanov_II" Then  
User = 0  
End If  
If Environ("username") = "Petrov_PP" Then  
User = 1  
End If  
........  
If Environ("username") = "Sidorov" Then  
User = 10  
End If  
MsgBox User  
End Sub  
 
При открытии книги не появляется MsgBox (добавил для контроля), а значит, не выполняется весь модуль.
 
В стандартный модуль ТОЛЬКО одну строку: Public User As Integer
 
Или переименовать Workbook_Open в AutoOpen
Я сам - дурнее всякого примера! ...
 
В стандартном модуле пишите  
 
Public User As Integer  
 
В модуле книги размещайте Sub Workbook_Open().  
 
Другой вариант - в стандартном модуле Sub auto_open() - процедура с таким именем будет срабатывать при открытии книги.  
 
И все эти Ифы можно заменить одной строкой:  
 
User = Application.Match(Environ("username"), Array("Ivanov_II", "Petrov_PP", ..., "Sidorov"), 0) - 1
 
Большое спасибо, получилось. Но всё же непонятно, почему в модуле получается объявить переменную, а в ЭтойКниге нет? И раз существуют такие нюансы, хотелось бы уяснить на будущее, что следует (или не следует) писать в модули, что в Листы, а что в ЭтуКнигу. Если в двух словах не объяснить, буду рад ссылке на источник информации.
 
Ну если очень хочется, то можно :)  
Если Вы объявили User в модуле ЭтаКнига, в других модулях придется писать  
 
ЭтаКнига.User  
 
Имена, объявленные в обычных модулях, можно использовать везде без указания модуля (конечно, если имена в разных модулях не совпадают).  
Поэтому в обычных модулях удобно размещать процедуры и функции, которые могут использоваться на разных листах.  
 
Модули книги и листов предназначены для размещения процедур обработки событий этих объектов и объектов, расположенных на листах (элементов управления, диаграмм и пр.).
 
Большое спасибо
Страницы: 1
Читают тему
Наверх