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操作步骤
按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」。把上面的代码整段粘进去。 回到 Excel,用鼠标拖选你要制图的数据(含表头那一行更好,Excel 会自动把第一行当作系列名称)。 按 Alt + F8,选中「一键生成柱形图」,点「运行」。一张柱形图立刻出现;想换成折线图,把代码里 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操作步骤
同样把代码粘进一个模块。 回到 Excel,先选中你的数据区域(不用预先改任何东西)。 按 Alt + F8运行「一键生成图表_自选类型」。第一个框输入标题,点「确定」;第二个框输入 1或2选类型,点「确定」。图表出现在数据右边;想换类型或标题,重新运行再选一次就行。
进阶一点:想做饼图,把
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操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。 回到 Excel,确认你的工作簿里有几张带数据的分表(每张表第一列当分类、后面列当数值最合适)。 按 Alt + F8运行「一键批量生成柱形图」。每张有数据的表都会多出一张带标题、图例、数值标签的柱形图;重复运行也不会叠图,因为旧图会被先删掉。 想换成折线看板,把 xlColumnClustered改成xlLine即可。
关键经验(来自网络实战总结):
建图三步曲: ChartObjects.Add先建图表框 →SetSourceData灌数据 →ChartType定类型(柱形xlColumnClustered/ 折线xlLine/ 饼图xlPie)。先删旧图再建新图:用 ChartObjects("名字").Delete清掉同名旧图,是几乎所有靠谱批量出图代码都会写的一步,能避免图表越堆越多。加数值标签: ApplyDataLabels xlDataLabelsShowValue让每个柱子/折点显示具体数字,汇报时不用别人再拿尺子比高低。批量别怕出错: For Each遍历 +On Error Resume Next兜单张表的异常,一张表坏了也不会让整个宏卡住。保存工作簿一定要存成 .xlsm格式,否则宏会丢失。
知识点小结
用 VBA 出图,本质上就是把“人手动点图表”这件事,翻译成三行固定动作:建框 → 灌数据 → 定类型。整套逻辑记住四句话就够了:
建图表框 → ActiveSheet.ChartObjects.Add(左, 上, 宽, 高),四个数字控制它出现在哪、长多大;给数据 → 图表.Chart.SetSourceData Source:=某个区域,选中区域或UsedRange都能用;定类型 → 图表.Chart.ChartType = xlColumnClustered(柱形)/xlLine(折线)/xlPie(饼图);加装饰 → HasTitle+ChartTitle.Text设标题、HasLegend显图例、ApplyDataLabels标数值,再配合“先删旧图”和For Each批量,就是一套完整的数据看板自动化。
它和前面学的“条件格式自动标红”“工作表美化”“保护工作表”是一套组合拳:美化管“长得好看”、条件格式管“哪里异常”、图表管“趋势一眼懂”、保护工作表管“能不能改”。四样都用上,你的表格既干净、又会报警、还能让领导一眼看懂好坏。
【SVG 示意图】
下一篇预告:表格会自动报警、也能出图了,怎么把这一页“成果”直接变成发给领导的文件?我们来讲一键用 VBA 把表格导出成 PDF,既能打印又能直接发微信、发邮件。















































































