夜雨聆风学习资料网

ARTICLE · 1188116

Excel VBA编程-一键用 VBA 自动生成图表

Excel VBA编程-一键用 VBA 自动生成图表

你有没有过这种经历:辛辛苦苦把几百行数据录进 Excel,领导却说“给我看个图,一眼能看懂的那种”。于是你手忙脚乱地点“插入”→“图表”→选类型→拖数据→调标题……一张图折腾半天。其实,只要写一小段 VBA,选中数据、按一下,柱形图、折线图就自动蹦出来,还能自己加标题、加图例、加数值标签。

今天我们从网络上整理了一批 Excel VBA“自动生成图表”的实用技巧(包括 Microsoft Learn 里 Excel 2010 VBA 入门的 ChartObjects.Add 标准写法、Excel VBA Tutor 第 24 课用 SetSourceData 指定数据源并设 ChartType 的做法,以及今日头条「VBA 小白第十六课」总结的“生成前先删除同名旧图表防止堆积”“用 ApplyDataLabels 显示数值标签”“End(xlUp) 自动适配数据行数”等实战经验),核心就一句话:用一行创建图表、一行给数据、一行定类型,让 Excel 自己把数字画成图。

下面用 3 个由浅入深的案例,带你从“选中数据一键出图”到“全工作簿批量出图”。


案例一(简单):选中一片数据,一键生成柱形图

功能说明 先在 Excel 里用鼠标选中你要制图的那片数据(比如 A 列是月份、B 列是销售额,把这两列一起选中),运行这一段,一张柱形图就自动出现在数据旁边。它用的是 ChartObjects.Add 先“建一个空白图表框”,再用 SetSourceData 把选中的数据灌进去,最后用 ChartType 指定成柱形图。想换折线图、饼图,只改一个词就行。

代码

Sub 一键生成柱形图()    ' 先选中一片数据,运行后一键生成柱形图    Dim 数据区域 As Range    Dim 图表 As ChartObject    ' 没选中单元格就提醒并退出,避免报错    If TypeName(Selection) <> "Range" Then        MsgBox "请先在工作表里选中要制图的数据区域。", vbExclamation        Exit Sub    End If    Set 数据区域 = Selection    ' 在活动工作表上新建一个图表框(左、上、宽、高 四个数字控制位置和大小)    Set 图表 = ActiveSheet.ChartObjects.Add(Left:=80, Top:=40, Width:=420, Height:=260)    图表.Chart.SetSourceData Source:=数据区域   ' 把选中的数据交给图表    图表.Chart.ChartType = xlColumnClustered    ' 柱形图(xlColumnClustered)    图表.Chart.HasTitle = True    图表.Chart.ChartTitle.Text = "我的图表"      ' 图表标题    MsgBox "柱形图已生成!", vbInformationEnd Sub

操作步骤

  1. 按 Alt + F11 打开 VBA 编辑器,点菜单「插入」→「模块」。
  2. 把上面的代码整段粘进去。
  3. 回到 Excel,用鼠标拖选你要制图的数据(含表头那一行更好,Excel 会自动把第一行当作系列名称)。
  4. 按 Alt + F8,选中「一键生成柱形图」,点「运行」。
  5. 一张柱形图立刻出现;想换成折线图,把代码里 xlColumnClustered 改成 xlLine 再运行即可。

小提示:ChartObjects.Add(Left, Top, Width, Height) 里四个数字分别是“左边距、上边距、宽度、高度”,单位是“磅”(约等于像素),想让图大一点就把 Width 和 Height 调大。


案例二(中等):运行时输入标题和图表类型,生成图表放在数据右侧

功能说明 案例一里标题和类型都写死在代码里。这个案例改成:运行后先弹框让你输入图表标题(比如“上半年销售额”),再弹框让你选类型(输入 1 是柱形图、2 是折线图),而且图表会自动放在选中数据的右边,不会盖住你的原始数据。这样今天做柱形、明天做折线,都不用改代码。

代码

Sub 一键生成图表_自选类型()    ' 运行后输入标题和图表类型,生成图表并放在数据右侧    Dim 数据区域 As Range    Dim 图表 As ChartObject    Dim 标题 As String    Dim 类型选择 As String    Dim 末列 As Long    If TypeName(Selection) <> "Range" Then        MsgBox "请先选中要制图的数据区域。", vbExclamation        Exit Sub    End If    Set 数据区域 = Selection    标题 = InputBox("请输入图表标题(例如:上半年销售额):", "设置标题")    If 标题 = "" Then 标题 = "我的图表"   ' 不填就用默认标题    类型选择 = InputBox("请选择图表类型,输入数字:" & vbCrLf & "1 = 柱形图" & vbCrLf & "2 = 折线图", "选择类型")    If 类型选择 = "" Then Exit Sub        ' 点取消就退出    ' 把图表放在选中区域右边两列,避免盖住数据    末列 = 数据区域.Columns(数据区域.Columns.Count).Column    Set 图表 = ActiveSheet.ChartObjects.Add( _        Left:=ActiveSheet.Cells(1, 末列 + 2).Left, _        Top:=40, Width:=420, Height:=260)    图表.Chart.SetSourceData Source:=数据区域    If 类型选择 = "1" Then        图表.Chart.ChartType = xlColumnClustered   ' 柱形图    ElseIf 类型选择 = "2" Then        图表.Chart.ChartType = xlLine              ' 折线图    Else        图表.Chart.ChartType = xlColumnClustered   ' 输错就默认柱形图    End If    图表.Chart.HasTitle = True    图表.Chart.ChartTitle.Text = 标题    图表.Chart.HasLegend = True                    ' 显示图例(哪条线/哪根柱代表什么)    MsgBox "图表已生成:" & 标题, vbInformationEnd Sub

操作步骤

  1. 同样把代码粘进一个模块。
  2. 回到 Excel,先选中你的数据区域(不用预先改任何东西)。
  3. 按 Alt + F8 运行「一键生成图表_自选类型」。
  4. 第一个框输入标题,点「确定」;第二个框输入 1 或 2 选类型,点「确定」。
  5. 图表出现在数据右边;想换类型或标题,重新运行再选一次就行。

进阶一点:想做饼图,把 xlColumnClustered 改成 xlPie 即可;HasLegend = True 是“显示图例”,不想要就改成 False。


案例三(实用小案例):一键给工作簿里所有表批量生成柱形图(数据看板)

功能说明 真实工作里常常一个文件里有十几张分表(各车间、各门店、各月份),你希望“一键给每张有数据的表都来一张图”,做成数据看板。这个案例用 For Each 遍历整个工作簿的每一张表,给“行数大于 1 且列数大于 1”的表自动生成一张带标题、图例、数值标签的柱形图;同时先删除这张表里可能已有的同名旧图,避免图表越堆越多(这是今日头条实战里反复强调的关键经验)。单张表万一出错也不会影响其他表。

代码

Sub 一键批量生成柱形图()    ' 遍历工作簿里每张工作表,给有数据的表都生成一张带数据标签的柱形图    Dim 工作表 As Worksheet    Dim 图表 As ChartObject    Dim 生成数 As Long    生成数 = 0    For Each 工作表 In ActiveWorkbook.Worksheets        On Error Resume Next   ' 某张表出错也不影响其他表继续生成        ' 只给“行数>1 且 列数>1”的表制图,纯空表或只有一行的表跳过        If 工作表.UsedRange.Rows.Count > 1 And 工作表.UsedRange.Columns.Count > 1 Then            ' 先删掉这张表里可能已有的同名旧图,避免图表越堆越多            工作表.ChartObjects("自动图表").Delete            Set 图表 = 工作表.ChartObjects.Add(Left:=80, Top:=40, Width:=420, Height:=260)            图表.Name = "自动图表"            图表.Chart.SetSourceData Source:=工作表.UsedRange            图表.Chart.ChartType = xlColumnClustered            图表.Chart.HasTitle = True            图表.Chart.ChartTitle.Text = 工作表.Name & " 数据图"            图表.Chart.HasLegend = True            图表.Chart.ApplyDataLabels xlDataLabelsShowValue   ' 在每个柱子上显示具体数值            生成数 = 生成数 + 1        End If        On Error GoTo 0      ' 恢复正常的报错提示    Next 工作表    MsgBox "已全部生成!共生成 " & 生成数 & " 张图表。", vbInformationEnd Sub

操作步骤

  1. 把代码粘进模块(和前两个可以放在同一个模块里)。
  2. 回到 Excel,确认你的工作簿里有几张带数据的分表(每张表第一列当分类、后面列当数值最合适)。
  3. 按 Alt + F8 运行「一键批量生成柱形图」。
  4. 每张有数据的表都会多出一张带标题、图例、数值标签的柱形图;重复运行也不会叠图,因为旧图会被先删掉。
  5. 想换成折线看板,把 xlColumnClustered 改成 xlLine 即可。

关键经验(来自网络实战总结):

  • 建图三步曲:ChartObjects.Add 先建图表框 → SetSourceData 灌数据 → ChartType 定类型(柱形 xlColumnClustered / 折线 xlLine / 饼图 xlPie)。
  • 先删旧图再建新图:用 ChartObjects("名字").Delete 清掉同名旧图,是几乎所有靠谱批量出图代码都会写的一步,能避免图表越堆越多。
  • 加数值标签:ApplyDataLabels xlDataLabelsShowValue 让每个柱子/折点显示具体数字,汇报时不用别人再拿尺子比高低。
  • 批量别怕出错:For Each 遍历 + On Error Resume Next 兜单张表的异常,一张表坏了也不会让整个宏卡住。
  • 保存工作簿一定要存成 .xlsm 格式,否则宏会丢失。

知识点小结

用 VBA 出图,本质上就是把“人手动点图表”这件事,翻译成三行固定动作:建框 → 灌数据 → 定类型。整套逻辑记住四句话就够了:

  1. 建图表框 → ActiveSheet.ChartObjects.Add(左, 上, 宽, 高),四个数字控制它出现在哪、长多大;
  2. 给数据 → 图表.Chart.SetSourceData Source:=某个区域,选中区域或 UsedRange 都能用;
  3. 定类型 → 图表.Chart.ChartType = xlColumnClustered(柱形)/ xlLine(折线)/ xlPie(饼图);
  4. 加装饰 → HasTitle+ChartTitle.Text 设标题、HasLegend 显图例、ApplyDataLabels 标数值,再配合“先删旧图”和 For Each 批量,就是一套完整的数据看板自动化。

它和前面学的“条件格式自动标红”“工作表美化”“保护工作表”是一套组合拳:美化管“长得好看”、条件格式管“哪里异常”、图表管“趋势一眼懂”、保护工作表管“能不能改”。四样都用上,你的表格既干净、又会报警、还能让领导一眼看懂好坏。

【SVG 示意图】 


下一篇预告:表格会自动报警、也能出图了,怎么把这一页“成果”直接变成发给领导的文件?我们来讲一键用 VBA 把表格导出成 PDF,既能打印又能直接发微信、发邮件。

相关学习资料