【发布时间】: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