excel - 我应该如何使用 VBA 在 Excel 中创建图形?
问题描述
我正在制作一份 Excel 报告,该报告将根据输入电子表格的数据为用户创建图表。我对 VBA 很陌生,虽然我认为我掌握了一些基本的表达式和结构,但我肯定无法理解可用于编码图形的选项。
基本的 Google 搜索会产生大量指南,以下是示例:
https://peltiertech.com/Excel/ChartsHowTo/QuickChartVBA.html
https://www.thespreadsheetguru.com/blog/2015/3/1/the-vba-coding-guide-for-excel-charts-graph
...在 Stack Overflow 上进行搜索并浏览 Microsoft 帮助页面可以提供一定的洞察力。但是,似乎有几种使用 VBA 制作图表的方法,我正在努力理解不同代码示例中的细微差别。
例如,我对应该为图表使用哪些变量犹豫不决。Dim cht As Chart
使用而不是As Shape
or可能会产生什么后果As ChartObject
?我想这可能会通知我考虑用来创建实际图形的表达式 - 根据示例,这似乎包括:
Set cht = ws.Shapes.AddChart2(201, xlColumnClustered)
或者:
ws.ChartObjects.Add(*Left, Top, Width, Height*)
或者:
Set chtSht = Charts.Add
...每一个看起来都完全不同,我最终不明白这些差异的目的是什么。
我有一种预感,这主要与图表是否嵌入有关,尽管我不确定这会在多大程度上通知代码。
因此,对于那些比我更有经验并且可能比我消化 Google 搜索结果更有效地解决这些问题的人:我应该如何使用 VBA 在 Excel 中创建图表?
解决方案
有四种语法可将嵌入式图表添加到工作表。我会先列出他们最老的。
最古老的方法是添加图表工作表,然后将图表工作表放到工作表上。不要使用它,它已经过时了。
Charts.Add
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
这种方式将 ChartObject 直接添加到工作表中。ChartObject 是一种包含图表的特殊形状。这会添加一个默认图表(除非您定义了不同的默认值,否则为聚集列),使用括号中的尺寸和位置(这是必需的)。它返回一个图表对象。
ActiveSheet.ChartObjects.Add(Left, Top, Width, Height)
Excel 2007 引入了这种语法,其中包括图表类型(如果省略,您将获得默认类型)以及位置和大小(如果省略,图表是默认大小,3 x 5 英寸,位于活动窗口的中心)。它返回一个形状。
ActiveSheet.Shapes.AddChart(XlChartType, Left, Top, Width, Height)
Excel 2013 引入了另一种语法,除了其他参数外,它还包括图表样式,并且还返回一个形状。
ActiveSheet.Shapes.AddChart2(Style, XlChartType, Left, Top, Width, Height)
我一直想用AddChart2
,但是我还是支持Excel 2010的用户,所以我必须用AddChart
. 我有一个例程查找给定图表类型的默认样式,因此我可以在 Excel 2013+ 中应用它来模仿AddChart2
. 可能没有理由使用ChartObjects.Add
overAddChart
或AddChart2
; 如果它正在工作,则无需重写代码,但不要在新代码中使用它。
您应该做的是声明一个类型的变量Chart
,并将其设置如下:
Dim cht As Chart
Set cht = ActiveSheet.ChartObjects.Add(100, 100, 360, 216).Chart
Set cht = ActiveSheet.Shapes.AddChart(xlXYScatterLines, 100, 100, 360, 216).Chart
Set cht = ActiveSheet.Shapes.AddChart2(240, xlXYScatterLines, 100, 100, 360, 216).Chart
现在您可以对分配给 的图表执行进一步的操作cht
。
推荐阅读
- visual-studio-code - 适用于 VSC IDE 的 Jupyterlab 目录
- git - 新分支在 Git 中创建时跟踪本地分支
- vba - 拆分函数中的类型不匹配
- android - Android验证apk签名
- javascript - 如何实现 OpenWeatherMap 2.0?
- python - 我可以将带有日期和值的 Pandas 数据框转换为 3d numpy 数组吗
- javascript - 如何访问具有列表类型数据列表的 Spring Model 对象?
- spring - Zookeeper服务器重启后Apache ignite客户端不会自动重新连接
- python - 使用python从Excel文件中提取图像
- linux - Linux内核代码动态测量与sha256