【发布时间】:2019-12-01 12:39:15
【问题描述】:
我在模块1的顶部全局声明了projname。它在userform中分配,并在createWB sub中成功访问。但是,当我也在模块 1 中的 addWindow 子中访问它时,它变为空(“”)。我不确定为什么会发生这种情况,因为我认为由于变量是全局声明的,我应该能够在任何子中访问它。
模块 1
Option Explicit
Public outputWorkbook As Workbook
Public globalcounter As Integer
Public projname As String
Public projnum As String
createWB()
Dim uf2 As New UserForm2
uf2.Show
Set outputWorkbook = Workbooks.Add(xlWBATWorksheet)
outputWorkbook.SaveAs Filename:=Environ("userprofile") & "\Desktop\" &
Replace(projname, " ", "") & ".xlsx"
outputWorkbook.Activate
Range("B3") = projname
Range("B4") = projnum
End Sub
addWindow()
Workbooks(Replace(projname, " ", "") + ".xlsx").Activate
End Sub
用户表单代码
Public Sub CommandButton1_Click()
projname = Me.TextBox1.Text
projnum = Me.TextBox2.Text
Me.Hide
End Sub
单元格B3 和B4 被分配了正确的值,但addWindow() 行导致下标超出范围错误。当我用Debug.Print 测试它时,我看到 projname = ""。我也简单地尝试了outputWorkbook.Activate,它也不起作用。
【问题讨论】:
-
听起来 projname 的范围是模块 1 而不是全局的——你能出示你的声明吗?
-
我刚加了!
-
.SaveAs方法能否重置全局变量? -
我认为最重要的是你如何/在哪里打电话给
addWindow()。如果您在整个过程之外调用它,那么projName将是""。例如,如果您在运行creatWB时包含调用者,您的projName将被存储并且您将能够访问它。 -
是的,问题存在是因为您似乎将它们称为独立进程。如果您将
Call addWindow包含在您的createWb()中,您将看到您不会收到该错误,因为该信息是基于createWB()例程存储的。否则它只是将默认状态返回为“”