如何使VBA变量可由所有子系统访问和修改



我创建了一个VBA代码,打开了一个名为Putty的程序,它对访问和删除Unix服务器很有用。

但我认为我的问题是VBA问题,我看到的所有自动化的替代方案都是用VBA将用户的密码存储在一个应用程序单元格中,我想隐藏这个信息以避免将来出现问题。

我找到的解决方案是,每次打开工作簿时都打开一个输入框,要求输入用户密码。因此,密码存储在一个变量中,直到工作簿关闭,用户只需要为所有Putty会话键入一次密码。

但我面临着一个范围问题,因为双击后打开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

有人能帮我吗?

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语句声明locals:

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局部变量。。。但这仍然不起作用。为什么?因为passwordPublic,是的,但它是属于ThisWorkbook对象的实例变量:它不是全局。如果你想访问它,你需要通过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限定符是可选的。。。但推荐使用。还要注意的是,全局变量并不理想,因为任何地方都可以写入全局变量:最佳实践是将变量的范围和可见性限制在最低限度,并且更喜欢传递参数(当然,不能修改事件处理程序的签名来实现这一点,因此模块范围变量和全局变量几乎是事件处理程序访问其他地方分配的数据的唯一方式(。

最新更新