在Excel中使用VBA-当多页对象发生更改事件(更改页面)时,不保留静态变量

vcirk6k6  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(102)

我在Excel用户表单中丢失静态变量时遇到了麻烦。
我一直在为excel编写一个例程。我是一个(非常)新手编码器。
我正在尝试将单元格范围填充到数组中。我已经能够毫无问题地完成此操作。
然而,当我试图将数组存储为一个 * static * 变量时,该变量并没有像我希望的那样被保留很长时间。
我认为当在多页中选择另一页时,静态变量被清除,问题就发生了。
代码是这样的:

Sub UserForm_Initialize ()

static myArray () as variant

dim myRange as range

set myRange = [namedrange]

myArray=myRange

msgbox myArray(0,0) 'this works fine

call OtherSub

end sub
sub OtherSub ()

msgbox myArray(0,0) 'this returns a blank

end sub

代码的第一个子代码显示数组元素很好。数组元素在第二个子代码中为空。
我试过:

  • 将数组声明为公共变量,但这会返回一个错误(我认为用户表单中的变量默认为私有,不能更改)。
  • 使用非常小的变量(简单字符串)
  • 在打开用户窗体之前在模块中编写代码(不保留变量)。

我知道我可以只向单元格区域写入数据,但这会违背目的。我希望避免从工作表中读取大型数组的多个示例。

slsn1g29

slsn1g291#

这可能解释得更清楚一些。将MyArray移到过程之外会将其作用域设置为模块级别,使其可用于该模块中的其他子对象。通常,您希望将变量的作用域保持在所需的最低级别。另一种选择是将变量作为参数传递给其他过程。

Option Explicit

Dim MyArray() As Variant            ' Private Module Level Scope
Public ExampleVariable As String    ' Public Module Level Scope (Not required, just showing an example.)

Sub UserForm_Initialize()
   
    Dim myRange As Range            ' Procedure Level Scope
    Set myRange = [namedrange]
    
    MyArray = myRange
    MsgBox MyArray(0, 0) 'this works fine

    Call OtherSub
End Sub

Sub OtherSub()
    MsgBox MyArray(0, 0) 'this returns a blank
End Sub

相关问题