Excel VBA:SetSourceData后嵌入式图表线宽重置,修改代码无效求助
解决VBA重置图表数据源后线宽恢复默认的问题
问题原因
使用SetSourceData方法重新分配图表数据源时,会彻底替换图表的所有数据系列,相当于重新生成系列对象,之前手动设置的线宽、样式等格式会被默认样式覆盖,导致格式丢失。
解决方案一:直接修改现有系列的数据源(推荐)
不使用SetSourceData,而是逐个更新图表中已有系列的XValues和Values属性,这样能保留系列原有的格式设置:
With ActiveChart ' 更新第1个系列的数据 .FullSeriesCollection(1).XValues = Range("BND1!$A$2:$EZ$2") .FullSeriesCollection(1).Values = Range("BND1!$A$" & CStr(b) & ":$EZ$" & CStr(b)) ' 更新第2个系列的数据 .FullSeriesCollection(2).XValues = Range("BND1!$A$2:$EZ$2") .FullSeriesCollection(2).Values = Range("BND1!$A$" & CStr(s) & ":$EZ$" & CStr(s)) ' 更新第3个系列的数据 .FullSeriesCollection(3).XValues = Range("BND1!$A$2:$EZ$2") .FullSeriesCollection(3).Values = Range("BND1!$A$" & CStr(v) & ":$EZ$" & CStr(v)) ' 更新第4个系列的数据 .FullSeriesCollection(4).XValues = Range("BND1!$A$2:$EZ$2") .FullSeriesCollection(4).Values = Range("BND1!$A$2:$EZ$2") End With
解决方案二:先保存格式,重置数据源后恢复
如果必须使用SetSourceData,可以先保存每个系列的格式参数,重置数据源后再逐一恢复:
Dim seriesFormats As Collection Set seriesFormats = New Collection ' 保存当前所有系列的格式 With ActiveChart For i = 1 To .FullSeriesCollection.Count Dim fmt As Object Set fmt = CreateObject("Scripting.Dictionary") fmt("Weight") = .FullSeriesCollection(i).Format.Line.Weight fmt("DashStyle") = .FullSeriesCollection(i).Format.Line.DashStyle ' 可按需添加其他需要保存的格式(如线条颜色、透明度等) seriesFormats.Add fmt Next i End With ' 设置新数据源 ActiveChart.SetSourceData Source:=Range("BND1!$A$" & CStr(b) & ":$EZ$" & CStr(b) & ", BND1!$A$" & CStr(s) & ":$EZ$" & CStr(s) & ", BND1!$A$" & CStr(v) & ":$EZ$" & CStr(v) & ", BND1!$A$2:$EZ$2") ' 恢复保存的格式 With ActiveChart For i = 1 To .FullSeriesCollection.Count With .FullSeriesCollection(i).Format.Line .Weight = seriesFormats(i)("Weight") .DashStyle = seriesFormats(i)("DashStyle") End With Next i End With
原代码无效的可能原因
FullSeriesCollection(1)指向的不是你需要修改的系列,重置数据源后系列顺序可能发生变化;- 图表类型不是折线图/散点图等支持线条格式的类型,部分图表系列没有
Format.Line属性; - 代码执行时图表尚未完成刷新,可尝试在设置格式前添加
DoEvents等待图表加载完成。
内容的提问来源于stack exchange,提问作者Santhana Krishnan Prakash
相关产品推荐
相关产品推荐

