Excel - VBA |根据用户单击的按钮,使图表显示特定系列

时间:2013-03-15 02:00:14

标签: vba excel-vba excel

我是Excel-VBA的新用户。所以,我正在尝试一个小项目来教我自己的步骤。我希望创建一个交互式图表,显示sin(x),cos(x)或tan(x)的曲线,具体取决于用户点击我创建的用户窗体的按钮。

下面是模块1的VBA代码。此代码创建图表,将图表放在工作表中,生成x值,并生成sin(x)集的y值。到目前为止,我只为sin(x)集创建了y值,因为我更关心的是让userform按钮执行我想要的操作。另外,我想快点发布这个问题!

Option Explicit
---------------------------------------------------------------------------------
Sub one()

'VARIABLES
Dim Row As Integer
Dim j As Single
Dim pi As Single
pi = 3.14159265359

'LABEL X SET
Cells(1, 38).Value = "X"

'GENERATE X VALUES
j = -4 * pi
For Row = 2 To 82

Cells(Row, 38).Value = j

j = j + 0.025 * pi

Next Row

'LABEL / GENERATE Y VALUES = SIN ( X )
Cells(1, 39).Value = "SIN ( X )"
For Row = 2 To 82

Cells(Row, 39).Value = Sin(Cells(Row, 38).Value)

Next Row

'CREATE CHART 1
Dim c As Chart
Set c = ActiveWorkbook.Charts.Add
Set c = c.Location(where:=xlLocationAsObject, Name:="Sheet1")
With c
    .ChartType = xlXYScatter
    .Axes(xlValue).MajorGridlines.Delete
    .Legend.Delete
End With

'POSITION CHART 1
Dim cobject As ChartObject
Dim r As Range
Set cobject = ActiveSheet.ChartObjects(1)
Set r = ActiveSheet.Range(Cells(1, 1), Cells(37, 22))
cobject.Left = r.Left
cobject.Top = r.Top
cobject.Width = r.Width
cobject.Height = r.Height

'DISPLAY USERFORM 1
Userform1.Show


End Sub

我创建的简单用户窗体有三个命令按钮。 Sin(x)的按钮1,Cos(x)的按钮2和Tan(x)的按钮3。 下面是我为Button1_Click编写的代码。它不是模块一的一部分。它位于项目浏览器的自己的部分。的VBAProject /表格/ Userform1

Option Explicit
---------------------------------------------------------------------------------------
Private Sub CommandButton1_Click()

Dim sinx As Series
Set sinx = c.SeriesCollection.NewSeries :::ERROR
With sinx
    .Values = Range(Cells(2, 39), Cells(82, 39))
    .XValues = Range(Cells(2, 38), Cells(82, 38))
    .Format.Fill.ForeColor.RGB = rgbBlack
    c.SeriesCollection(1).MarkerSize = 2
End With

End Sub

所以......我运行模块1.它成功地将x值生成到它们各自的范围,生成sin(x)值到它们各自的范围,创建和定位图表,并显示UserForm1。然而!当我在userform上单击Button 1时,出现错误...

编译错误: 变量未定义

Excel会突出显示导致错误的代码行。 我用::: ERROR表示这行代码 我假设错误是指我在模块1中定义为图表的“c”。我猜定定义的变量不会从模块1传输到userform1。

我的目标是让用户能够在用户窗体上单击sin(x)aka按钮1或cos(x)按钮2或tan(x)按钮3,然后单击sin,cos或tan的曲线应该在图表上。 我提前感谢stackoverflow的所有成员对此查询发表评论。我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您正在发现(突出显示的错误)VBA变量具有范围:只有声明它们的模块才知道它们,除非您声明它们是 public < / strong>(在模块级别)您声明它们的模块中。 ,再次在另一个使用它们的模块中。有关详细信息,请参阅this article

回到你的问题:声明

Option Explicit
Public c as Chart

在模块1中的模块级别(在Sub 1()之前;删除相应的

Dim c as Chart

来自Sub one()内部。接下来,更改userform的代码,如下所示:

Option Explicit

Private Sub CommandButton1_Click()

Dim sinx As Series

Set sinx = c.SeriesCollection.Add(Source:=Range(Cells(2, 38), Cells(82, 39)), _
  CategoryLabels:=True)

With sinx
    .Format.Fill.ForeColor.RGB = rgbBlack
    c.SeriesCollection(1).MarkerSize = 2
End With

' important: must hide the dialog so control returns to the calling sub!
Me.Hide

End Sub

这些改变让事情对我有用......