Access中如何修改饼图系列的填充颜色?
解决Access图表按类别设置数据点颜色的问题
问题分析
你的查询通过UNION将Ricavi和Costi合并成了单个数据系列,所有数据点都归属于同一个系列,因此直接修改整个系列的颜色(ChartSeriesCollection.Item(0))无法区分Costi和Ricavi两类数据。另外,窗体的Open/Load事件触发时,图表数据可能还未完全加载,导致代码无法生效。
解决方案
需要遍历图表的每个数据点,根据CostiRicavi字段的取值("Costi"或"Redditività")单独设置颜色,并且将代码放在图表的AfterUpdate事件或者窗体的Current事件中(确保数据加载完成后执行)。
代码实现
Private Sub CostiRicaviGR_AfterUpdate() Dim chartSeries As ChartSeries Dim dataPoint As ChartDataPoint Dim rs As Recordset Dim i As Integer ' 打开查询记录集用于匹配数据点类别 Set rs = CurrentDb.OpenRecordset("SELECT IDtrattativa, NomeCognome, [Ricavi] AS Valore, ""Redditività"" AS CostiRicavi FROM qryAnalisiOperazione UNION SELECT IDtrattativa, NomeCognome, [costi], ""Costi"" FROM qryAnalisiOperazione;") Set chartSeries = Me.CostiRicaviGR.ChartSeriesCollection.Item(0) i = 0 rs.MoveFirst Do While Not rs.EOF Set dataPoint = chartSeries.ChartDataPointCollection.Item(i) ' 根据类别设置对应颜色 If rs!CostiRicavi = "Costi" Then dataPoint.FillColor = RGB(255, 0, 0) ' 红色 dataPoint.BorderColor = RGB(200, 0, 0) ' 深红边框 ElseIf rs!CostiRicavi = "Redditività" Then dataPoint.FillColor = RGB(0, 200, 0) ' 绿色 dataPoint.BorderColor = RGB(0, 150, 0) ' 深绿边框 End If rs.MoveNext i = i + 1 Loop rs.Close Set rs = Nothing Set chartSeries = Nothing End Sub
关键注意点
- 你之前代码中的
RGB(200, 300, 111)是无效的,RGB颜色值的范围必须是0-255,超出范围的数值会被自动截断,导致颜色不符合预期 - 必须确保图表数据完全加载后再执行颜色设置,
AfterUpdate事件是最适合的时机,避免Open/Load事件中数据未就绪的问题 - 如果查询结果有排序,要保证记录集的顺序和图表数据点的顺序一致,否则颜色会匹配错误
内容的提问来源于stack exchange,提问作者diego
相关产品推荐
相关产品推荐

