Excel VBA类模块构建图表关键信息数据库的实现咨询
VBA类模块实现图表关键信息管理方案
你的思路完全没问题
类模块本来就是用来封装特定对象的属性和行为的,用它来管理每个图表的固定系列数这类关键参数,比存单元格或者用数组靠谱多了——封装性强,后续改配置不用到处找调用的地方,可读性也高。
具体实现步骤(纠正你把对象列表放类模块的错误)
1. 先做图表参数类
插入一个类模块,改名成clsChartSpec(别用中文,避免莫名其妙的问题),然后写属性代码:
Private pChartName As String Private pNumOfStndSrs As Integer ' 图表名称的读写属性 Public Property Get ChartName() As String ChartName = pChartName End Property Public Property Let ChartName(ByVal value As String) pChartName = value End Property ' 固定系列数的读写属性 Public Property Get NumOfStndSrs() As Integer NumOfStndSrs = pNumOfStndSrs End Property Public Property Let NumOfStndSrs(ByVal value As Integer) pNumOfStndSrs = value End Property
2. 用集合管理所有图表配置
别把图表列表塞类模块里,应该在标准模块里搞个集合来存所有clsChartSpec的实例,这样能直接按图表名检索:
' 定义全局集合,方便跨过程调用 Public colChartSpecs As Collection ' 初始化配置的过程,建议在Workbook_Open里调用 Sub InitChartSpecs() Set colChartSpecs = New Collection Dim chrtSpec As clsChartSpec ' 添加Chart_11的配置 Set chrtSpec = New clsChartSpec chrtSpec.ChartName = "Chart_11" chrtSpec.NumOfStndSrs = 3 colChartSpecs.Add chrtSpec, Key:=chrtSpec.ChartName ' 用图表名作Key,方便直接取值 ' 添加Chart_12的配置 Set chrtSpec = New clsChartSpec chrtSpec.ChartName = "Chart_12" chrtSpec.NumOfStndSrs = 5 colChartSpecs.Add chrtSpec, Key:=chrtSpec.ChartName End Sub
3. 写调用的子过程
按照你想要的方式,接收图表名数组,从集合里取配置再操作:
Sub ProcessCharts(ByVal chartNames As Variant) Dim chartName As Variant Dim targetSpec As clsChartSpec ' 防止集合未初始化 If colChartSpecs Is Nothing Then InitChartSpecs For Each chartName In chartNames ' 直接用图表名作Key获取对应配置 Set targetSpec = colChartSpecs(chartName) ' 这里写你的业务逻辑,比如开关系列、修改外观 Debug.Print "处理图表:" & chartName & ",固定系列数:" & targetSpec.NumOfStndSrs Next chartName End Sub ' 调用示例 Sub Test() ProcessCharts Array("Chart_11", "Chart_12") End Sub
关于类模块当数据库的疑问
你之前用类模块存单元格地址,这种用法完全合理。类模块的核心价值之一就是把配置信息封装起来,把分散的配置集中到一处,修改时只动类或者初始化代码,不用挨个改调用的子过程,这正好贴合类模块降低耦合、提升可维护性的设计目的。
为啥别用数组方案
用数组存图表名和参数的坑很多:
- 增删图表时要同步维护多个数组的索引,很容易搞混出错
- 数组里的元素全是值,看不出对应关系,可读性极差
- 后续要加新参数(比如系列颜色、图例显示状态),数组方案得大改,类模块只需要加个新属性就行
内容的提问来源于stack exchange,提问作者Hallvard Skrede
相关产品推荐
相关产品推荐

