Добавьте Option Explicit
в начало модуля:
Option Explicit
Public password As String 'I tried to make the password variable acessful for all subs
Public Sub Workbook_Open()
senha = InputBox("Type your password:")
MsgBox senha
End Sub
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Shell "putty.exe "username"@" & ActiveCell, 1
MsgBox senha ' this code return a empity msgbox
cancel = True
End Sub
Это включит проверку во время компиляции и заставит вас объявлять все ваши переменные - приведенный выше код не будет компилироваться, потому что senha
нигде не объявлено. Используйте оператор Dim
для объявления локальных:
Option Explicit
Public password As String 'I tried to make the password variable acessful for all subs
Public Sub Workbook_Open()
Dim senha As String
senha = InputBox("Type your password:")
MsgBox senha
End Sub
Option Explicit
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Shell "putty.exe "username"@" & ActiveCell, 1
MsgBox senha ' <~ still won't compile. can you see why?
cancel = True
End Sub
Здесь MsgBox senha
не будет компилироваться в обработчике BeforeDoubleClick
, поскольку переменная выходит за рамки :он живет и умирает в области действия обработчика Open
.
Итак, вам нужно назначить password
, когда вы его запросите:
Option Explicit
Public password As String
Public Sub Workbook_Open()
password = InputBox("Type your password:")
MsgBox password
End Sub
Option Explicit
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Shell "putty.exe "username"@" & ActiveCell.Value, 1
MsgBox password
cancel = True
End Sub
Обратите внимание, что больше не нужно объявлять senha
локальную переменную ... но это все равно не сработает. Почему? Потому что password
- это Public
, да - но это переменная экземпляра , которая принадлежит объекту ThisWorkbook
: это не global . Если вы хотите получить к нему доступ, вам нужно сделать это через объект ThisWorkbook
:
Option Explicit
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Shell "putty.exe "username"@" & ActiveCell.Value, 1
MsgBox ThisWorkbook.password
cancel = True
End Sub
И это будет работать, как и ожидалось.
Если вам нужна настоящая глобальная переменная, вынеобходимо объявить его в стандартном модуле (не в модуле класса, не в модуле рабочей книги или рабочей таблицы и не в модуле формы):
Option Explicit
Public password As String
Если это Module1
,тогда любой другой код в вашем проекте может получить к нему доступ следующим образом:
Option Explicit
Public Sub Workbook_Open()
Module1.password = InputBox("Type your password:")
MsgBox Module1.password
End Sub
Option Explicit
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Shell "putty.exe "username"@" & ActiveCell.Value, 1
MsgBox Module1.password
cancel = True
End Sub
Обратите внимание, что квалификатор Module1
является необязательным, ... но рекомендуется. Также обратите внимание, что глобальные переменные не идеальны, поскольку они могут быть записаны кем угодно и где угодно: лучше всего ограничить область видимости и видимость переменных до минимума и вместо этого предпочесть передачу параметров (конечно, сигнатуры обработчиков событийнельзя изменить, чтобы сделать это, поэтому переменные области видимости модуля и глобальные переменные являются практически единственным способом для обработчиков событий получить доступ к данным, которые были назначены в другом месте).