在每个工作表的基础上存储设置的最佳方式是什么?

我需要临时存储我的macros的每个工作表的设置。 我想扩大活动工作表的属性来存储设置。 目标是读取一个属性,如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 ActiveWS.WS = ActiveSheet行删除Set关键字,我得到以下错误:

错误n°91:对象variables或未设置块variables

我该怎么做,甚至可能呢?

我也考虑过使用ActiveSheet.CustomProperties,但是这样做似乎很笨拙,因为你不能通过它的名字检索一个设置(没有循环遍历所有的项目),你必须依靠索引号。

提前致谢。

更新 :我应该添加我的macros将被存储为Excel加载项,因此我将无法访问用户的工作簿的代码。 我无法利用Worksheet_Activate()事件跟踪活动工作表。 另外,在重新打开工作簿时,设置最好会丢失或重置为默认值,这就是为什么我无法将它们保存在用户文件(例如隐藏表格)中的原因。

为了让你至less有一部分:

在Module1中只有一行:

 Public ActiveWS As cCustomSheet 

注意它现在被宣布为Public。

在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 

需要注意的是,一旦启动下一个表格,您将失去设置1中的任何内容,但是如果您只是在表单处于活动状态时访问属性,则应该这样做。 如果不是,则可以将所有工作表添加到“集合”或“词典”中,只要“集合”或“词典”存在,这些工作表就会保留所有这些属性。 所以…让我们更多地了解一下你的目标,我会尽力帮助你思考最好的select。

编辑:在更一般的回答你的问题,我倾向于将设置存储在工作表名称,如果需要可以完全隐藏的用户。 这可能是一个很好的方法,特别是如果您需要在打开工作簿的时间之间保持设置。

我有一个项目需要发送设置表,但macros是在我的主表,而不是分布表。

我发现存储在一个命名的范围内的设置工作得很好。 您可以存储任何string,数字或公式,甚至可以根据需要使用表格中的值。

由于您的macros在Excel Addin中,您可以将信息存储在该插件的表单中,这些表单不可见。 如果你想确保没有人错误地隐藏它,你甚至可以使该表格“非常隐藏”。 例如,您可以命名插件“Sheet1”的Sheet1,并在每行上存储A列中的工作簿名称和B列中的参数。

顺便说一下,如果代码中的错误导致所有的variables被重置,这将确保数据不会丢失。

或者,如果在closures并重新打开Excel之后需要该设置可用(似乎并非如此),则可以在工作簿中创build一个非常隐藏的工作表并在其中存储数据,但这需要更改该工作簿。

感谢大家的build议。 他们帮助我find了存储每个工作表的设置的方法。 我已经使用ActiveWorkbook.CustomDocumentProperties分配一个随机的ID到活动工作簿。 每个工作表由工作簿的ID和工作表的代号(在工作簿中是唯一的)连接来标识。 活动工作表的设置将添加到工作表ID用作索引的集合中,以便轻松检索。

这不是100%安全的,因为两个工作簿可以假设得到相同的ID,因为它是一个随机数。 工作簿的ID也保存到Excel文件。 工作簿closures后变得没用,但“污染”了文件的自定义属性列表。

我还需要存储保存值的列的地址来应用我的macros。 这是由用户设置的。 不是存储范围的绝对地址,而是使用列的第一个单元格的.ID属性。 这样,如果用户移动单元格,则ID将粘贴到值。 缺点是我必须循环select第一行的每个单元格,以检查一个单元格是否包含一个.ID值,这是非常不雅观的。 重新打开工作簿后,.ID属性消失了,这对我来说很好,因为我不希望这些设置是持久的。