【问题标题】:Excel 2010 VBA - global variables aren't set properlyExcel 2010 VBA - 未正确设置全局变量
【发布时间】:2013-11-29 17:35:48
【问题描述】:

更新: 我知道我可以在 VBA 编辑器中重命名工作表,但我的第一直觉是使用代码。我查了一下,在几个地方看到了解决方案,现在它不起作用我仍然想知道为什么。 答案可能意味着我会学到一些对以后用 VBA 编程很重要的东西。


我以为我在这里找到了答案:https://stackoverflow.com/a/1179730/1370938,但事实证明这对我不起作用,我不知道为什么。我是 VBA 新手,所以我可能会遗漏一些东西,但我在多个站点中找到了这个解决方案,我想知道我是否错过了一个没有明确说明的简单步骤。

我想设置全局工作表变量,我可以为我的所有函数和表单数据操作调用这些变量,并使代码看起来更轻松。 (当你从一张纸跳到另一张纸时,所有那些Worksheets("name"). 真的让代码变胖了)。

按照链接中的答案,我在我的三个模块之一中写了这个:

'Global variables
Public shT As Worksheet
Public shA As Worksheet
Public shC As Worksheet
Public shM As Worksheet
Public shP As Worksheet

'Setting global variables
Sub Workbook_Open()

   Set shT = ActiveWorkbook.Worksheets("Tasks")
   Set shA = ActiveWorkbook.Worksheets("Activity")
   Set shC = ActiveWorkbook.Worksheets("Closed")
   Set shM = ActiveWorkbook.Worksheets("Modifications")
   Set shP = ActiveWorkbook.Worksheets("Persistent")

End Sub

但是当在另一个模块中运行此代码时,在尝试访问范围等时变量设置为“空”,并且我得到运行时错误“424”Object Required,它指向行.Rows(3).EntireRow.Insert

这里是代码

Sub addModLogEntry(sTask As String, sOwner As String, dDate As Date, sType As String)
    Dim iRow As Integer
    With shM
        .Rows(3).EntireRow.Insert

        .Range("A" & 3).value = sTask
        .Range("B" & 3).value = sOwner
        .Range("C" & 3).value = dDate
        .Range("D" & 3).value = sType

        If Day(dDate) Mod 2 = 0 Then
             shM.Range("A" & 3 & ":D" & 3).Interior.Color = RGB(230, 230, 230)
        End If

    End With

End Sub

在调试模式下,如果我观察shM 的值,它会返回Empty。 我尝试在Workbook_Open() 的第一行放置一个断点,但是当我关闭文档以测试打开它时,断点没有保存。

我尝试将这段代码放入 thisWorkbook 的代码中,这里断点有效,workbook_open() 被执行,但如果我在它之后执行任何东西,变量仍然不好。

【问题讨论】:

    标签: excel excel-2010 vba


    【解决方案1】:

    调暗标准模块中的变量,而不是打开事件代码上方的ThisWorkbook 模块中的变量。

    编辑#1

    ThisWorkbook 模块中:

    Private Sub Workbook_Open()
        Set shT = ActiveWorkbook.Worksheets("Tasks")
       Set shA = ActiveWorkbook.Worksheets("Activity")
       Set shC = ActiveWorkbook.Worksheets("Closed")
       Set shM = ActiveWorkbook.Worksheets("Modifications")
       Set shP = ActiveWorkbook.Worksheets("Persistent")
    End Sub
    

    在标准模块中:

    Public shT As Worksheet
    Public shA As Worksheet
    Public shC As Worksheet
    Public shM As Worksheet
    Public shP As Worksheet
    
    Sub durAL()
        MsgBox shT.Range("A1").Value
    End Sub
    

    运行 durAL 将证明全局变量可供常用。

    【讨论】:

    • 如果您的意思是在模块中声明变量并将事件保留在工作簿代码中,那么这很有效。我不认为他们必须在一个单独的空间。谢谢!
    • 如果我打开文档并在它正常工作后执行代码。但是当我收到错误时,进入调试模式,并在我进行修改后停止代码重新运行,变量不再被识别。有什么想法吗?
    • 您好,当您在编辑器中停止代码时,所有全局变量都会终止。在 WorkBook_Open 事件再次触发之前,它们不会被重新初始化。
    • 另外,您明白 Workbook_Open 子必须位于名为“ThisWorkbook”的对象中吧?
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多