别怕,这不是恐怖片,是让你的数据图表“哭”得有道理
各位 Excel 表哥表姐们,今天咱们聊点轻松的——DownBars 对象。
等等,别划走!我知道这名字听起来像是某个过气男团的舞蹈动作,或者工地上的“下 bars”。但它其实是 Excel VBA 图表世界里一个非常有情绪的小家伙。
一、DownBars 是啥?能吃吗?
不能吃,但它能让你的图表“哭”。
想象一下,你画了一张股价图(或者任何有“涨跌”概念的数据图)。Excel 里有一种图表叫 “股价图”(Stock Chart),最常见的是“开盘-盘高-盘低-收盘”图。
在这种图上,每一天(或每个点)都有一根“蜡烛”或一条垂直线。
如果收盘价 ≥ 开盘价 → 涨了 → 那一段叫 UpBars(上柱线,通常绿色/白色)。
如果收盘价 < 开盘价 → 跌了 → 那一段叫 DownBars(下柱线,通常红色/黑色)。
DownBars 就是数据下跌时,那一段“伤心的小柱子”。
没有 DownBars 的图表,就像股市只涨不跌 —— 那叫骗人。
二、VBA 里怎么找到这个小矮人?
在 VBA 对象模型中,DownBars 属于 Series 对象下的一个子对象。你不需要去大海捞针。
Sub 找到DownBars()Dim cht As ChartSet cht = ActiveSheet.ChartObjects(1).Chart' 检查是否有 DownBars 对象If Not cht.SeriesCollection(1).DownBars Is Nothing ThenMsgBox "哈哈,找到了!小柱子在这呢。"ElseMsgBox "你的图表类型不支持 DownBars,换股价图试试?"End IfEnd Sub
三、让 DownBars 变个“脸色”
默认的下跌颜色可能是黑色或暗红,丑得像加班后的脸色。我们可以用 VBA 给它涂上真正悲伤的颜色,比如深紫、暗红,甚至哭丧的灰色。
Sub 给下跌涂上悲伤()Dim cht As ChartSet cht = ActiveSheet.ChartObjects(1).ChartWith cht.SeriesCollection(1).DownBars.Format.Fill.ForeColor.RGB = RGB(128, 0, 0) ' 深红,像流血的亏损.Format.Line.Visible = msoFalse ' 去掉边框,更显落魄End WithEnd Sub
你也可以让它半透明,像眼泪一样朦胧:
.Format.Fill.Transparency = 0.3
四、什么时候 DownBars 会“失踪”?
新手经常遇到一个问题:“我明明写了 DownBars,为什么报错?”
因为 DownBars 不是所有图表类型的亲儿子。
只有这些图表类型才有 DownBars:
xlStockOHLC(开盘-高-低-收盘)
xlStockVOHLC(成交量-开盘-高-低-收盘)
xlLine(仅当设置了高低点连线时,但严格意义的 DownBars 是股价图专属)
如果你对着一张饼图喊 DownBars,Excel 会对你翻白眼:
对象 'DownBars' 的方法 '失败'
所以要先检查:
If cht.SeriesCollection(1).HasUpDownBars Then' 有上下柱线cht.SeriesCollection(1).DownBars.Delete ' 小心使用,会删掉ElseMsgBox "大哥,你这图根本就没开上下柱线啊"End If
五、高级玩法:让 DownBars 自动“哭”得更科学
假设你不想只显示股价的涨跌,而是显示实际值与目标值的差距:
实际 < 目标 → 显示 DownBars(下跌/未达标)
实际 ≥ 目标 → UpBars
这种场景,Excel 默认的 DownBars 不支持。
怎么办?造假:用辅助列构造一个“股价式”数据源,把目标当成“开盘价”,实际当成“收盘价”,再画股价图。
VBA 可以一键帮你生成这种“伪下跌柱”:
Sub 造假下跌柱()' 假设 A列:项目名,B列:目标值,C列:实际值Dim rng As RangeSet rng = Range("A1:A10") ' 假设10个数据' 构造“开盘价”=目标值,“收盘价”=实际值Range("D1").Value = "开盘(目标)"Range("E1").Value = "收盘(实际)"Dim i As LongFor i = 2 To 10Range("D" & i).Value = Range("B" & i).ValueRange("E" & i).Value = Range("C" & i).ValueNext i' 插入股价图ActiveSheet.Shapes.AddChart2(251, xlStockOpenHighLowClose).Select' 此处省略绑定数据的代码(篇幅原因,但保证你一看就懂)MsgBox "小柱子已就位,现在红色就是未达标"End Sub
六、幽默的注意事项(认真脸)
DownBars 没有“灵魂”
它只是一个格式对象,你不能让它显示数值标签。想显示具体跌了多少?请用 DataLabels。
别在散点图上找 DownBars
就像不要在火锅里找寿司,不合适。
颜色别太花哨
大红大绿没问题,但你把它弄成荧光粉 + 闪动,老板会觉得你在嘲讽公司业绩。
删除 DownBars 不会删除数据
它就像撕掉一张创可贴,伤口(数据)还在。
七、送你一个万能“跌停板”小函数
Sub 格式化所有下跌柱为惨绿色()Dim s As SeriesDim cht As ChartObjectFor Each cht In ActiveSheet.ChartObjectsFor Each s In cht.Chart.SeriesCollectionOn Error Resume NextWith s.DownBars.Format.Fill.ForeColor.RGB = RGB(0, 100, 0) ' 惨绿,像韭菜田.Transparency = 0.2End WithOn Error GoTo 0Next sNext chtEnd Sub
最后总结(不加粗,但很重要)
DownBars 不大,但很有戏。
它不会让你的代码更复杂,却能让你的图表一眼看出“哪里跌了”。做报表给老板看时,红色的下跌柱比任何文字都更有冲击力——老板一看就心疼,一心疼就批预算。
所以,别再把 DownBars 当路人甲了。
下回写 VBA 图表代码,记得温柔地问一句:
“今天,你的 DownBars 哭了吗?”
夜雨聆风