出于某种原因,当在VBA中使用Select Case
语句时,我似乎在语句完成后丢失了我的变量值。
对于上下文,我试图按特定顺序捕获两个特定单元格上的双击操作。关键是隐藏函数,因此要运行该函数,用户必须首先双击单元格U35
,这应该将egg
变量设置为1
。然后,如果用户双击单元格AF35
,并且将egg
变量设置为1
,则该函数将运行。
我遇到的问题是双击单元格U35
后,egg
变量设置为null
,因此永远不会达到第二个Case
语句。
Private Sub Worksheet_Activate()
Dim egg
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Select Case egg
Case Is = 0
If Not Intersect(Target, Range("U35")) Is Nothing Then
MsgBox ("First action captured")
egg = 1
End If
Case Is = 1
If Not Intersect(Target, Range("AF35")) Is Nothing Then
MsgBox ("Second action captured")
egg = 0
End If
End Select
End Sub
你需要在宏egg
中全局声明你的变量Private Sub Worksheet_Activate()
,这样它一旦你离开本地环境就会保持它的价值。
Dim egg As Integer '<-- global declaration (on top of module)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'rest of your code
End Sub
您可以声明一个全局变量,并在工作表上激活它,并稍微修复Select Case
:
Dim egg As Long
Private Sub Worksheet_Activate()
egg = 0
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Debug.Print (egg)
Select Case egg
Case Is = 0
If Not Intersect(Target, Range("U35")) Is Nothing Then
MsgBox ("First action captured")
egg = 1
End If
Case Is = 1
If Not Intersect(Target, Range("AF35")) Is Nothing Then
MsgBox ("Second action captured")
' Do things here when they're clicked back-to-back
End If
egg = 0
End Select
End Sub
问题 “Worksheet_BeforeDoubleClick”无法识别“Worksheet_Activate”中的“egg”,因为它们是私有子。
VBA中有两种类型的子,私有和公共。有一些例外,一般来说私人子网内的信息无法从另一个子网访问。
解决方案(S) A)将变量定义为全局对象 B)定义将要使用的子内部的变量
A)将变量定义为全局对象
Public egg as Integer
Private Sub Worksheet_Activate()
egg = 0
'this is not necessary, you can set it inside BeforeDoubleClick
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
*your code*
End Sub
B)定义将要使用的子内部的变量
Private Sub Worksheet_Activate()
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim egg as Integer
egg = 0
*your code*
End Sub