保持VBA中的变量值

问题描述 投票:-1回答:3

出于某种原因,当在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
excel vba excel-vba
3个回答
1
投票

你需要在宏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

0
投票

您可以声明一个全局变量,并在工作表上激活它,并稍微修复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

0
投票

问题 “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
© www.soinside.com 2019 - 2024. All rights reserved.