Chenzhaochen00 2023-04-12 10:48 采纳率: 50%
浏览 16
已结题

VBA 如何让单个变量在不同的Sub或者Function中使用?

img

我在第一个sub里使用了数组和字典,但是程序调用其他的Function和Sub时,会失去这个变量。
不太熟悉这里面的机制

  • 写回答

1条回答 默认 最新

  • teellyy 2023-04-12 10:56
    关注

    要让一个变量在不同的Sub或者Function中使用,可以将其定义为模块级别的变量,也就是在模块(module)中定义这个变量。这样,在整个模块中,这个变量都可以被访问和使用。
    具体实现步骤如下:
    1.打开 Visual Basic 编辑器(VBE),选择要定义该变量的模块。
    2.在模块的顶部声明该变量,并指定其数据类型,如下所示:
    Dim myVar As Integer
    这里我们声明了一个名为 myVar 的整型变量。
    3.现在,无论在哪个 Sub 或 Function 中,都可以通过使用这个变量名来访问这个变量,如下所示:
    Sub subroutine1()
    ' 使用 myVar
    MsgBox myVar
    End Sub
    Function function1() As Integer
    ' 修改 myVar
    myVar = 10
    ' 返回新值
    function1 = myVar
    End Function
    注意,如果在 Sub 或 Function 中重新声明该变量,那么这个变量就会成为局部变量,只能在这个 Sub 或 Function 中使用,而无法在其他 Sub 或 Function 中使用。因此,为了确保模块级别的变量在整个模块中可用,请不要在任何 Sub 或 Function 中重复声明它。

    在 VBA 中,每个 Sub 和 Function 都拥有自己的作用域,也就是说,它们可以访问和使用在它们内部或者所属模块级别的变量。此外,当一个 Sub 或者 Function 调用另一个 Sub 或者 Function 时,被调用的 Sub 或者 Function 可以访问和使用所有在调用方(即调用它的 Sub 或者 Function)作用域上(包括该 Sub 或者 Function 中定义的变量)定义的变量。
    然而,当你在一个 Sub 中创建一个数组或者字典,并尝试在后续的 Sub 或者 Function 中使用它,可能会因为变量作用域的限制而无法访问到这些变量。这是因为数组和字典对象并不是基本类型的数据,而是对象,只有它们的引用才能共享给其他 Sub 和 Function 使用。
    为了解决这个问题,你可以将数组或者字典对象定义为 Public 变量。这样,这些变量的作用域将变成整个项目级别的,而不是仅限于某个 Sub 或者 Function,从而其他的 Sub 和 Function 就可以直接访问这些变量了。
    具体实现方法如下:
    1.在模块的顶部,声明需要在不同的 Sub 和 Function 中使用的数组或字典对象,如下所示:
    Public myArray() As Integer
    Public myDictionary As Object
    这里我们声明了一个名为 myArray 的整型数组和一个名为 myDictionary 的字典对象。
    2.在某个需要使用这些变量的 Sub 或者 Function 中,引用这些变量并进行操作,如下所示:
    Sub subroutine1()
    ReDim myArray(10) ' 初始化 myArray
    myDictionary.Add "a", 1 ' 添加键值对到 myDictionary
    Call subroutine2 ' 调用另一个 Sub
    End Sub
    Sub subroutine2()
    Dim i As Integer
    For i = LBound(myArray) To UBound(myArray)
    Debug.Print myArray(i) ' 访问 myArray 中的元素
    Next i
    Debug.Print myDictionary("a") ' 访问 myDictionary 中的值
    End Sub
    这样,你就可以在不同的 Sub 和 Function 中共享和操作这些数组或者字典对象了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 创建了问题 4月12日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装