我需要暂时存储每个工作表的宏设置。我考虑过扩展活动工作表的属性以存储那里的设置。目标是读取ActiveSheet.Setting1等属性。我尝试在一个类中包装ActiveSheet对象:
“cCustomSheet”类模块:
Public WithEvents WS As Worksheet
Public Setting1 As String
“Module1”模块:
Dim ActiveWS As cCustomSheet
Sub test1()
Set ActiveWS = New cCustomSheet
Set ActiveWS.WS = ActiveSheet
End Sub
Sub test2()
MsgBox ActiveWS.WS.Name
End Sub
此代码无错误地运行,但如果用户激活另一个工作表,ActiveWS
应更新为新的活动工作表,而不是。如果我从行Set
中删除Set ActiveWS.WS = ActiveSheet
关键字,则会收到以下错误:
错误编号91:对象变量或未设置块变量
我该怎么做,这甚至可能吗?
我还考虑过使用ActiveSheet.CustomProperties,但这看起来相当笨拙,因为你无法通过名称检索设置(没有遍历所有项目),你必须依赖索引号。
提前致谢。
更新:我应该补充一点,我的宏将存储为Excel加载项,因此我无法访问用户工作簿的代码。我无法利用Worksheet_Activate()事件来跟踪活动工作表。此外,当重新打开工作簿时,设置最好会丢失或重置为默认值,这就是我无法将它们保存在用户文件中的原因(例如,在隐藏的工作表中)。
答案 0 :(得分:4)
为了让你至少在某个方面:
在Module1中只有一行:
Public ActiveWS As cCustomSheet
请注意,它现在已声明为公开。
在ThisWorkbook模块中尝试以下代码:
Private Sub Workbook_Open()
Set ActiveWS = New cCustomSheet
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Set ActiveWS.WS = ActiveSheet
With ActiveWS
Debug.Print .WS.Name
.Setting1 = "something important about this sheet"
End With
End Sub
需要注意的是,一旦激活下一张,你将丢失一张纸的Setting1中的任何内容,但如果你只想在工作表处于活动状态时访问这些属性,则应该这样做。如果没有,您可以将所有工作表添加到集合或字典中,只要集合或字典存在,这将保持所有工作表的属性可访问。那么......让我们在这里了解一下你的目标,我会尽力帮助你思考最好的选择。
编辑:在对您的问题的更一般的回答中,我倾向于在工作表名称中存储设置,如果需要,可以完全隐藏用户。这可能是一个很好的方法,特别是如果您需要在工作簿打开的时间之间保持设置。
答案 1 :(得分:0)
我有一个项目,我需要发送带有设置的工作表,但宏是在我的主工作表中,而不是分发的工作表。
我发现将设置存储在命名范围内效果非常好。您可以存储任何字符串,数字或公式,如果需要,您甚至可以使用工作表中的值。
答案 2 :(得分:0)
由于您的宏位于Excel Addin中,您可以将信息存储在该插件的工作表中,这些信息是不可见的。如果您想确保没有人错误地隐藏它,您甚至可以将该表“非常隐藏”。 例如,您可以将插件的“参数”的Sheet1命名并存储在每一行上,工作簿名称列在A列中,参数列在B列中。
顺便说一下,如果代码中的错误导致所有变量都被重置,这可以确保数据不会丢失。
或者,如果您需要在关闭并重新打开Excel后可以使用该设置(这似乎不是这种情况),您可以在工作簿中创建一个非常隐藏的工作表并将数据存储在那里,但这需要更改该工作簿
答案 3 :(得分:0)
感谢大家的建议。他们帮我找到了存储每个工作表设置的方法。我已使用ActiveWorkbook.CustomDocumentProperties
为活动工作簿分配随机ID。每个工作表由工作簿的ID和工作表的代号(在工作簿中是唯一的)的串联标识。活动工作表的设置将添加到集合中,其中工作表的ID用作索引,以便可以轻松检索它们。
这不是100%安全,因为两个工作簿可以假设获得相同的ID,因为它是一个随机数。工作簿的ID也保存到Excel文件中。工作簿关闭后变得无用,但“污染”文件的自定义属性列表。
我还需要存储包含要应用宏的值的列的地址。这是由用户设置的。我没有存储范围的绝对地址,而是使用列的第一个单元格的.ID属性。这样,如果用户移动单元格,则ID粘贴到值。缺点是我必须遍历选择的第一行的每个单元格以检查单元格是否保持.ID值,这是非常不优雅的。重新打开工作簿后,.ID属性消失了,这对我来说很好,因为我不希望设置是持久的。