【问题标题】:Why VBA global variables loses values when closing UserForm?为什么关闭用户窗体时 VBA 全局变量会丢失值?
【发布时间】:2014-09-20 04:45:22
【问题描述】:

我在 Worksheet 后面有一个宏代码。当在工作表上单击按钮时,新的用户表单被初始化并显示给用户。如果用户使用红色 X 关闭窗口,或者使用“隐藏”函数/方法关闭表单,则 Worksheet 后面的所有全局变量都会丢失它们的值。是否可以保留这些值?

背后的工作表代码:

Private MeasurementCollection As Collection
Dim CurrentMeasurement As measurement
Dim NewMeasurement As measurement

Private Sub Worksheet_Activate()
    Initialize
End Sub

Public Sub Initialize()
    Set NewMeasurement = New measurement
    Dim DropDownDataQueries As Collection
    Set DropDownDataQueries = DBQueries.GetAllUpdateQueries
    For i = 1 To DropDownDataQueries.Count
        Dim Values As Collection
        Set Values = DataBase.GetData(DropDownDataQueries(i))

        With Me.OLEObjects("Combo" & i).Object
            For Each value In Values
                .AddItem value
            Next value
        End With
    Next i
End Sub

Private Sub UpdateDB_Click()
    UpdateGeneralData
    If (CurrentMeasurement Is Nothing) Then
        MsgBox ("Message text")
    Else
        Dim form As UpdateComentForm
        Set form = New UpdateComentForm
        form.Show
    End If
End Sub

Private Sub Combo1_Change()
    If Application.EnableEvents = True Then
        If (Combo1.value <> "") Then
            NewMeasurement.DN = Combo1.value
        Else
            NewMeasurement.DN = 0
        End If
    End If
End Sub

用户窗体代码

Private Sub UpdateDBData_Click()
    If (Komentar.value <> "") Then
        Me.Hide
    Else
        MsgBox ("Prosimo napišite vzrok za spremembe podatkov v belo polje!")
    End If
End Sub

Private Sub UserForm_Terminate()
    Me.Hide
End Sub

【问题讨论】:

  • 您能提供您目前拥有的代码以及您尝试过的代码吗?
  • 不,我不会在任何地方调用 End 语句。我试图在 Terminate 事件中隐藏用户表单,但仍然是同样的问题...
  • 重置的变量是什么?你如何测试它?
  • NewMeasurement 变量已重置。它是类模块的对象。在用户窗体关闭后,当我想为该对象内的变量赋值时,出现错误。错误状态:对象变量或未设置块变量。
  • 你在哪一行得到错误? (我猜与被重置的全局变量无关)

标签: vba variables excel userform


【解决方案1】:

实验表明,在退出涉及调用= New Form 的过程时,模块级变量会被清除,前提是表单设计器窗口已在 IDE 中的某个位置打开。

关闭您可能在 VBA IDE 中打开的所有用户表单设计器窗口,然后重试。

【讨论】:

  • 呵呵,问题解决了。非常感谢您的帮助。我自己无法解决这个问题。
【解决方案2】:

NewMeasurement 已声明但从未分配。

您可以执行Dim NewMeasurement As New measurement 之类的操作来创建对象的实例。

【讨论】:

  • 它在 Initialize 子例程中分配,该子例程从 Worksheet_Activate 事件内部调用。对不起,我有很多代码,所以我没有发布所有内容,因为它不会指出主要问题。在原帖中添加了缺失的代码!
  • Initialize 是从 Worksheet_Activate 调用的。如果在执行Worksheet_Activate 之后编辑表单,则全局变量将丢失。您确定在打开表单之前执行Initialize,在任何编辑之后?
  • 一切正常。激活表单后,我执行数据库查询并将 CurrentMeasurement 变量中的值填充到工作表中。然后,如果其中一个单元格发生更改,我将新值放入 NewMeasurement(历史跟踪)中。然后我按下 UpdateDB 按钮,该按钮触发事件并打开用户窗体。当用户表单关闭时,NewMeausrement 和 CurrentMeasurement 变量会丢失。
  • 在打开表单之前,您是否可以在启动UpdateDB 时检查是否定义了NewMeausrement?我有一种感觉,他们在表单打开之前就迷路了。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2013-01-09
  • 1970-01-01
  • 2012-01-14
  • 2013-10-10
相关资源
最近更新 更多