1

我从未在 VBA 中使用过全局变量,但我知道全局变量是在函数/子声明之外实例化的?

我在模块顶部声明了一个全局(公共)变量,然后由同一模块内的子例程赋予其值 0。

Option Explicit
Public NumNodes As Integer

Sub Inst_Glob_Vars()
NumNodes = 0
End Sub

每当打开工作簿时都会调用此子例程(在“ThisWorkbook”对象中调用 sub),它还将实例化全局变量并设置 0 值。

Option Explicit

Private Sub Workbook_Open()
Call Inst_Glob_Vars
End Sub

我在 excel 表中有一个按钮,单击该按钮将增加此全局变量。此按钮的定义在 Sheet1 对象中。

Private Sub CommandButton2_Click()
'NumNodes = NumNodes + 1
Debug.Print "NumNodes = " & NumNodes 'Debug
End Sub

我是否需要在使用该变量的每个模块/对象中声明全局/公共变量?每次单击按钮时,变量都不会增加,而是在调试时给出 Null/Blank 值。我肯定没有正确声明我的全局变量,但不确定我在哪里犯了错误。

更新:这是更新的命令按钮子。如果我注释掉第二个子调用(Node_Button_Duplication),一切正常。有可能是那个引起问题的潜艇......

Private Sub CommandButton2_Click()
Call Channel_Selection_Duplication
Call Node_Button_Duplication
NumNodes = NumNodes + 1
Debug.Print "NumNodes = " & NumNodes 'Debug
End Sub

Channel_Selection_Duplication 和 Node_Button_Duplication 都定义在同一个单独的模块中:

Option Explicit

Public Sub Channel_Selection_Duplication()
'
' Description: Macro which duplicates the 'Channel Usage Selection' columns at a specific cell reference

    Range("Q8:S8").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Merge
    Range("Q8:S8").Select
    ActiveCell.FormulaR1C1 = "Channel Usage Selection"
    Range("Q8:S52").Select
    Range("Q52").Activate
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    Range("Q8:S8").Select
    Selection.Interior.ColorIndex = 36

'NumNodes = NumNodes + 1
'Debug.Print NumNodes
End Sub

Public Sub Node_Button_Duplication()

    ActiveSheet.Shapes("CommandButton1").Select
    Selection.Copy
    Range("Q5").Select
    ActiveSheet.Paste
    Selection.ShapeRange.IncrementTop -14.25
End Sub
4

1 回答 1

3

将其粘贴到模块中

Option Explicit

Public myVar As Long

将此粘贴到 sheet1 中的命令按钮单击事件中

Option Explicit

Private Sub CommandButton1_Click()
    myVar = myVar + 1
    MsgBox myVar
End Sub

现在试试看。

此外,您不需要在Workbook_Open事件中将值设置为 0 :) 当您打开工作簿时,默认情况下它采用值 0。

跟进

我感觉在电子表格中复制和粘贴控制元素会以某种方式重置变量。我目前正在尝试寻找解决方案... – user1373525 6 分钟前

是的 :) 添加按钮会重新编译 VBA 代码,因此全局变量会被重置。使用临时表来保存变量。您还可以使用注册表来存储该信息 :) – Siddharth Rout 刚刚

仅当您单击按钮两次时才会观察到此行为,而在一次执行时不会观察到此行为。例如

Private Sub CommandButton2_Click()
    NumNodes = NumNodes + 1
    MsgBox NumNodes, vbInformation, "1"

    Node_Button_Duplication

    NumNodes = NumNodes + 1
    MsgBox NumNodes, vbInformation, "2"

    Node_Button_Duplication

    NumNodes = NumNodes + 1
    MsgBox NumNodes, vbInformation, "3"
End Sub

在这种情况下,它总是会增加值。但是,下次单击该按钮时,您会注意到该变量已被重置。

于 2012-05-15T16:01:41.843 回答