我遇到一个奇怪的问题,我认为它与Excel行为有关,而不是与我的代码有关。
我有一个名为“ numEtape”的全局变量,它是一个整数。我的代码包含几个步骤,其中用户必须在工作表上键入数据,然后按下将数据保存在数组中并递增“ numEtape”的按钮,然后再进行下一步。
代码(简化)如下所示:
Dim numEtape As Integer
Sub AjoutEssai()
numEtape = 2
UFPreAjoutInfos.Show 'Unrelated Userform that asks user for more informations, but doesn't modify "numEtape" or call any other macro
Call InterfaceFiller
End Sub
Sub InterfaceFiller()
Dim rangedubtn As Range
Dim btnPrecedent As Button
Select Case numEtape
Case 2
'Change value of some cells
Case 3
'Change value of some cells
Case 4
'Change value of some cells
Case Is >= 5
'Change value of some cells
Case Else
Debug.Print "Error"
End Select
Set rangedubtn = Sheets("Interface").Range("M3")
Set btnPrecedent = Sheets("Interface").Buttons.Add(rangedubtn.Left, rangedubtn.Top,rangedubtn.Width, rangedubtn.Height)
With btnPrecedent
.OnAction = "mSuivant"
.Caption = "Suivant"
.Name = "btnSuivant"
End With
End Sub
Sub mSuivant()
numEtape = numEtape + 1
Call InterfaceFiller
End Sub
我认为代码本身并不重要,因为我首先调用AjoutEssai()可以使numEtape始终大于2,所以我可以从中期待什么。但是,当用户在步骤中打开和关闭其他excel / Office文件(其中没有任何VBA代码/宏),Excel似乎会清空numEtape,从而Select Case
转到Case Else
。
excel什么时候从内存中删除全局变量,并且有什么方法可以防止这种现象发生?
Public numEtape As Long
一个可行的选择是使用public
like这样的词public numEtape As Long
。这样,只要打开Excel工作簿,变量就将保存其值。在旧版本的VBA中,单词是Global
(Dim,Global,Public和Private作为Modular Field Access Modifiers有什么区别?)
Dim numEtape As Long
要Dim
在Sub
或外部使用Function
,代码结束后将清空该变量。仅使用此代码段:
Dim numEtape As Long
Sub MainTest()
numEtape = 23
End Sub
一旦运行它并命中End Sub
该变量,也将清空。运行后检查MainTest()
:
Sub PrintingVariable()
Debug.Print numEtape
End Sub
如果要保存值,有两种基本的工作方式:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句