Excel 2010 VBA - 未正确设置全局变量

时间:2013-11-29 17:35:49

标签: excel-vba excel-2010 vba excel

更新: 我知道我可以在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

但是当在另一个模块中运行此代码时,在尝试访问范围等时,变量设置为“Empty”,并且我得到运行时错误'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(),但如果我执行了任何后面的变量仍然没有用。

1 个答案:

答案 0 :(得分:2)

Dim 标准模块中的变量,而不是Open事件代码上方的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将演示全局变量可供常用。