VBA第二十一期 VBA动态显示柱状图表

在很多时候我们设计的表格显示不出我们所有的数据,下面就是柱状图的显示多列数据,他因为每张图表显示的数据量有限,这里通过两个翻页按钮来实现数据图表的分页动态显示,实例如下:

Dim chartdat As Range

Dim cht As Chart

Dim chartlist() As String, listmsg() As String

Dim i, ii, lastrw, endrw, lastcl

Load UserForm10

Sheets("表1").Select

If pbpagenm < 4 Then pbpagenm = 1

 lastrw = Sheets("表1").Range("a1").End(xlDown).Row

 lastcl = Sheets("表1").Range("a1").End(xlToRight).Column

 If pbpagenm + 60 > lastrw Then

  endrw = lastrw

 Else

  endrw = pbpagenm + 60

 End If

 Sheets("表1").Select

 With Sheets("表1")

     If chartdat Is Nothing Then

      Set chartdat = .Range(.Cells(pbpagenm, 1), .Cells(endrw, 4))

     End If

 End With

Sheets("图表").ChartObjects(1).Delete

Call creatchart1("图表", chartdat, 50, 50, 1000, 500, i)

'Set cht = Sheets("图表").ChartObjects(1).Chart

'cht.SeriesCollection(1).XValues = Range(Sheets("表11").Cells(1, 2), Sheets("表11").Cells(1, lastcl))

'cht.Axes(xlCategory).ReversePlotOrder = True

Set currentchart = Sheets("图表").ChartObjects(1).Chart

fname = ThisWorkbook.Path & "\tdxjietu1.JPG"

currentchart.Export Filename:=fname

UserForm10.Image1.Picture = LoadPicture(fname)

UserForm10.Show

下面是增加两个翻页按钮,向上或向下,当然这里必须要设定一个公共变量pbpagenm ,设置公共变量比用通过参数传递的函数比较容易处理。每页显示数据是60栏,为避免数据运行错误,在王后翻页是设定必须小于最大列数。

Private Sub CommandButton6_Click()

pbpagenm = pbpagenm - 60

End Sub

Private Sub CommandButton7_Click()

Dim lastcl

lastcl = Sheets("表1").Range("a1").End(xlToRight).Column

If pbpagenm < lastcl - 60 Then

pbpagenm = pbpagenm + 60

Endif

End Sub

<think>我们将在VBA中创建一个用户窗体,并在该窗体上显示一个图表。这需要以下步骤: 1. 插入用户窗体 2. 在窗体上添加一个用于显示图表的控件(例如,Microsoft Chart Control) 3. 编写代码将数据加载到图表控件中 4. 显示窗体 但是,在VBA中,我们通常使用Chart控件(如Microsoft Chart Control 6.0 (SP6))来在窗体上显示图表。请注意,这个控件可能不是默认加载的,因此可能需要先添加引用。 步骤: 1. 打开VBA编辑器(按Alt+F11)。 2. 在工程资源管理器中,右键单击你的工程,选择“插入”->“用户窗体”。 3. 在工具箱上右键,选择“附加控件”,然后找到“Microsoft Chart Control 6.0 (SP6)”(或类似版本)并勾选,这样工具箱中就会出现图表控件。如果找不到,可能需要先通过“工具”->“引用”添加对MSChart的引用(例如,Microsoft Chart Controls)。 4. 将图表控件(通常显示为一个小柱状图图标)拖放到窗体上。 5. 调整控件大小和位置。 6. 编写代码为图表控件提供数据。 注意:由于环境不同,有些机器可能没有安装Microsoft Chart Controls。如果遇到问题,可以考虑使用其他方法,例如在Excel工作表中创建图表,然后将图表复制到剪贴板,再粘贴到窗体的图片框中。但这里我们主要介绍使用图表控件的方法。 示例代码步骤: 1. 创建用户窗体,命名为`UserForm1`,在窗体上放置一个图表控件,命名为`MSChart1`(默认名称可能为`ChartSpace1`或类似,具体取决于你使用的控件版本,这里我们假设为MSChart控件)。 2. 在窗体的初始化事件中,为图表控件设置数据。 由于我们使用的是MSChart控件,可以通过设置其`ChartData`属性来赋予数据,也可以使用其他方法。 下面是一个示例,展示如何在窗体初始化时给图表控件添加数据: ```vba Private Sub UserForm_Initialize() ' 假设我们使用MSChart控件,名称为MSChart1 With MSChart1 .chartType = VtChChartType2dBar ' 设置图表类型为二维条形图 .ColumnCount = 3 ' 设置列数(系列数) .RowCount = 4 ' 设置行数(数据点) ' 设置数据 .Row = 1 .Column = 1 .Data = 10 .Row = 1 .Column = 2 .Data = 20 .Row = 1 .Column = 3 .Data = 30 .Row = 2 .Column = 1 .Data = 15 .Column = 2 .Data = 25 .Column = 3 .Data = 35 ' 以此类推,可以继续设置其他行 ' 也可以使用数组一次性赋值(但MSChart控件可能需要通过SetData方法或ChartData属性) ' 设置标题 .Title.Text = "示例图表" End With End Sub ``` 但是,上述方法设置数据比较繁琐。另一种方法是使用数组来设置整个数据源: ```vba Private Sub UserForm_Initialize() Dim data(1 To 4, 1 To 3) As Variant ' 填充数据 data(1, 1) = 10 data(1, 2) = 20 data(1, 3) = 30 data(2, 1) = 15 data(2, 2) = 25 data(2, 3) = 35 data(3, 1) = 20 data(3, 2) = 30 data(3, 3) = 40 data(4, 1) = 25 data(4, 2) = 35 data(4, 3) = 45 ' 将数组赋值给图表控件 MSChart1.ChartData = data End Sub ``` 3. 显示窗体:在其他模块中编写代码显示窗体。 ```vba Sub ShowChartForm() UserForm1.Show End Sub ``` 注意:如果找不到MSChart控件,可能需要先添加引用。在VBA编辑器中,点击“工具”->“引用”,然后找到并勾选“Microsoft Chart Controls”(具体名称可能因版本而异,如“Microsoft Chart Control 6.0 (OLEDB)”)。 如果无法使用MSChart控件,替代方案: 1. 在工作表上创建图表,然后将图表导出为图片,在窗体上使用Image控件显示该图片。 2. 使用Excel的Chart对象,但将其嵌入到窗体中。这可以通过将图表复制为图片,然后加载到窗体的Image控件中实现。 下面是一个替代方案的示例: ```vba Sub CreateChartAndShowForm() Dim ws As Worksheet Dim chartObj As ChartObject Dim dataRange As Range Dim imgPath As String Set ws = ThisWorkbook.Sheets("Sheet1") Set dataRange = ws.Range("A1:B10") ' 创建一个临时图表 Set chartObj = ws.ChartObjects.Add(Left:=0, Top:=0, Width:=300, Height:=200) With chartObj.Chart .SetSourceData Source:=dataRange .ChartType = xlColumnClustered .HasTitle = True .ChartTitle.Text = "临时图表" End With ' 将图表导出为图片 imgPath = ThisWorkbook.Path & "\tempChart.png" chartObj.Chart.Export imgPath ' 删除临时图表 chartObj.Delete ' 显示窗体,并将图片加载到Image控件 UserForm1.Image1.Picture = LoadPicture(imgPath) UserForm1.Show ' 可选的:删除临时图片 Kill imgPath End Sub ``` 然后在窗体上添加一个Image控件(命名为Image1),并调整大小以适应窗体。 以上提供了两种方法。第一种方法使用MSChart控件更直接,但需要环境支持;第二种方法通用性更好,但需要临时文件。 请根据你的实际情况选择合适的方法。 相关问题: 1. 如何在VBA用户窗体上添加其他类型的图表(如折线图、饼图)? 2. 如何动态更新窗体图表的数据? 3. 如何避免在窗体中使用图表控件时出现引用缺失的问题? 4. 在VBA窗体中显示图表时,如何调整图表的样式和格式?</think>### VBA创建窗体显示图表教程 在VBA中创建窗体并显示图表需要以下步骤(基于引用内容优化): #### 1. 插入用户窗体 ```vba ' 打开VBA编辑器(Alt+F11) ' 右键工程资源管理器 → 插入 → 用户窗体 UserForm1.Show ' 显示窗体 ``` #### 2. 添加图表控件 ```vba ' 在窗体设计视图中: ' 1. 右键工具箱 → 附加控件 ' 2. 勾选 "Microsoft Chart Control 6.0 (SP6)" ' 3. 将图表控件拖放到窗体上 ``` #### 3. 完整实现代码 ```vba ' 模块代码(如Module1) Sub ShowChartForm() UserForm1.Show vbModal ' 显示模态窗体[^3] End Sub ' 窗体代码(UserForm1) Private Sub UserForm_Initialize() Dim chartData(1 To 5, 1 To 2) As Variant ' 准备示例数据 chartData(1, 1) = "一月": chartData(1, 2) = 120 chartData(2, 1) = "二月": chartData(2, 2) = 230 chartData(3, 1) = "三月": chartData(3, 2) = 180 chartData(4, 1) = "四月": chartData(4, 2) = 310 chartData(5, 1) = "五月": chartData(5, 2) = 275 ' 配置图表 With MSChart1 .ChartData = chartData ' 加载数据 .chartType = VtChChartType2dBar ' 柱状图 .Title.Text = "月度销售报告" .Plot.Axis(VtChAxisIdY).AxisTitle.Text = "销售额(万元)" .Row = 1: .Column = 1: .RowLabel = "月份" .Row = 1: .Column = 2: .RowLabel = "金额" End With End Sub ``` #### 4. 关键设置说明 1. **窗体属性**(确保正常显示): - `ShowModal = True`:独占模式[^3] - `Width/Height`:建议≥400×300像素 2. **图表控件属性**: - `Name`:MSChart1(默认) - `Size`:锚定到窗体边缘(实现缩放) #### 5. 动态更新数据 ```vba ' 添加按钮更新图表 Private Sub CommandButton1_Click() Dim newData As Range Set newData = Sheets("数据源").Range("A1:B10") MSChart1.ChartData = newData.Value End Sub ``` #### 6. 注意事项 1. 首次使用需启用引用: ```vba ' 工具 → 引用 → 勾选 "Microsoft Chart Controls" ``` 2. 如果控件不可用,可改用图片框加载图表截图[^2] 3. 窗体关闭时释放资源: ```vba Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Set MSChart1 = Nothing End Sub ``` [^1]: 窗体控件基础操作参考 [^2]: 图表生成逻辑优化参考 [^3]: 窗体事件处理参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值