Как сделать переменную VBA доступной и изменяемой всеми подпрограммами? - PullRequest
0 голосов
/ 08 ноября 2019

Я создал код VBA, чтобы открыть программу под названием Putty, которая полезна для удаления серверов Unix.

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

Решение, которое я нашел, состояло в том, чтобы открывать поле ввода, чтобы запрашивать пароль пользователя каждый раз, когда рабочая книга открыта. Таким образом, пароль сохраняется в переменной до тех пор, пока рабочая книга не закроется, и пользователю не нужно будет вводить свой пароль только один раз для всех сеансов Putty.

Но я сталкиваюсь с проблемой области действия, потому что подпрограмма для открытияЗамазка после двойного щелчка не может изменить значение пароля, установленного после открытия книги.

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 password
End Sub

Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
    Shell "putty.exe "username"@" & ActiveCell, 1
    MsgBox password ' this code return a empity msgbox
    cancel = True
End Sub

Может ли кто-нибудь помочь мне с этим?

1 Ответ

2 голосов
/ 08 ноября 2019

Добавьте 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 является необязательным, ... но рекомендуется. Также обратите внимание, что глобальные переменные не идеальны, поскольку они могут быть записаны кем угодно и где угодно: лучше всего ограничить область видимости и видимость переменных до минимума и вместо этого предпочесть передачу параметров (конечно, сигнатуры обработчиков событийнельзя изменить, чтобы сделать это, поэтому переменные области видимости модуля и глобальные переменные являются практически единственным способом для обработчиков событий получить доступ к данным, которые были назначены в другом месте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...