【问题标题】:Having a public variable available in userform / sheet objects在用户表单/工作表对象中有一个可用的公共变量
【发布时间】:2021-10-31 00:15:32
【问题描述】:

我花了最后一个小时阅读有关各种风格的 excel vba 中的变量范围的页面,但找不到解决我的范围问题的明确文档参考......即使我确信它是如此经典。哦,好吧,这就去。

我有一个只包含一张工作表和一个用户窗体的工作簿。我有一张学生名单,列在我工作表的第 1 列。我想:

  • 将此列表加载到某个名为 students_list 的全局 Collection 变量中(我使用 ThisWorkbook 对象中的 Workbook-Open() 过程来执行此操作)
  • 使用students_list 的内容在我的用户表单中初始化一个列表框
  • 当点击我的用户窗体上的按钮时,从 students_list 中删除元素

我只需要一个可以从我的用户窗体过程中看到的变量,以及从 ThisWorkbook 对象中看到的变量。

我尝试在工作表的代码、用户表单、ThisWorkbook、专用于全局变量的单独模块中将其声明为公共的、全局的……我似乎找不到正确的方法来拥有@987654325 @ 变量随处可见。

我错过了什么?我为这个应该如此基本但让我失望的问题道歉:-/

【问题讨论】:

  • 您可以使用电子表格的Range 来存储列表,并且可以通过您的 VBA 代码的所有不同元素访问——基本上来自任何工作表和任何模块。如果您不希望这个暂存区域可见,请在 BB 列中开始它和/或将字体颜色设置为白色,这样用户就不会注意到它。
  • 如果您在模块中将students_list 声明为Public,则该变量应该已可用于项目中的所有过程。见stackoverflow.com/a/3815797/6535336。 (唯一的例外是,如果您在其他地方声明了另一个具有相同名称的变量 - 那么第二个变量将在第二个声明的范围内被引用。)
  • 没有显示暂存区的 pb,实际上这就是我将值加载到我的 students_list 集合中的方式......但我担心这不是问题。
  • @YowE3K: 是的,就像你说的,应该是 :) 我已经尝试用最少的代码进行测试:* 在 ThisWorkbook 代码中,只有一行:Public foo As Integer * in sheet1的代码:Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) foo = 4 MsgBox "foo set to 4" End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) MsgBox "foo = " & foo End Sub
  • 好的,对于评论布局很抱歉,在 cmets 中似乎无法使列表或换行符正常工作。无论如何,我只是想补充一点,我没有收到预期的消息“foo = 4”。现在请对我大喊大叫,指出我明显的错误。

标签: excel excel-2013 vba


【解决方案1】:

Public 变量的声明放在一个模块中(如果您还没有,请使用菜单中的插入/模块创建一个)。然后范围将扩展到您的整个项目。

所以在一个模块中(例如 Module1)有:

Public foo As Integer

并且在工作表(例如 Sheet1)中的代码有:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    foo = 4
    MsgBox "foo set to 4"
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox "foo = " & foo
End Sub

如果要将声明放在ThisWorkbook 的代码中,则需要将其引用为Thisworkbook.foo,因为尽管它可以从代码的任何部分访问,但它是特定于ThisWorkbook 的变量对象。

所以,在 ThisWorkbook 的代码中有:

Public foo As Integer

并且在工作表(例如 Sheet1)中的代码有:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ThisWorkbook.foo = 4
    MsgBox "foo set to 4"
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox "foo = " & ThisWorkbook.foo
End Sub

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多