更新: 我知道我可以在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(),但如果我执行了任何后面的变量仍然没有用。
答案 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将演示全局变量可供常用。