VBA - 在userform中绘制图表时出错

时间:2015-08-04 13:54:46

标签: vba excel-vba excel

我正在尝试在userform(userform2)中的图表中显示一些数据。填充图表的数据列先前是使用另一个用户表单(userform1)计算的。

userform2中有复选框,使用户可以选择要在x轴上绘制的数据。它还允许同时绘制多个系列。

我之前在另一个excel文档中测试过我的代码并且工作正常,但是当我尝试在所需的文件中使用它时,它呈现出一种奇怪的行为:图表创建了许多我没有要求的额外系列用顶部单元格的文本标记(这是一个显示标题并从A1到L1的合并单元格。)

我试图通过在终止userform1后将应填充图表的列复制到空白工作表来解决此问题。尽管正确复制了单元格,但生成的图表仍然会显示相同的错误,从工作表1中绘制不应出现在图表中的数据。

Private Sub CommandButton1_Click()
If CheckBox1 = False And CheckBox2 = False And CheckBox3 = False Then

    MsgBox "Select a chart to be plotted"
    Exit Sub

End If

Dim MyChart As Chart
Dim ChartData1 As Range
Dim ChartData2 As Range
Dim ChartData3 As Range
Dim ChartName1 As String
Dim ChartName2 As String
Dim ChartName3 As String

Set ChartData1 = Worksheets("Sheet2").Range("B2:B13")
ChartName1 = Worksheets("Sheet2").Range("B1")

Set ChartData2 = Worksheets("Sheet2").Range("C2:C13")
ChartName2 = Worksheets("Sheet2").Range("C1")

Set ChartData3 = Worksheets("Sheet2").Range("D2:D13")
ChartName3 = Worksheets("Sheet2").Range("D1")

Application.ScreenUpdating = False

Set MyChart = ActiveSheet.Shapes.AddChart(xlXYScatterLinesNoMarkers).Chart

MyChart.SeriesCollection.NewSeries

If CheckBox1 = True Then
MyChart.SeriesCollection(1).Name = ChartName1
MyChart.SeriesCollection(1).Values = ChartData1
MyChart.SeriesCollection(1).XValues = ActiveSheet.Range("A2:A13")
End If

MyChart.SeriesCollection.NewSeries
If CheckBox2 = True Then
MyChart.SeriesCollection(2).Name = ChartName2
MyChart.SeriesCollection(2).Values = ChartData2
MyChart.SeriesCollection(2).XValues = ActiveSheet.Range("A2:A13")
End If

MyChart.SeriesCollection.NewSeries
If CheckBox3 = True Then
MyChart.SeriesCollection(3).Name = ChartName3
MyChart.SeriesCollection(3).Values = ChartData3
MyChart.SeriesCollection(3).XValues = ActiveSheet.Range("A2:A13")
End If

Dim imageName As String
imageName = Application.DefaultFilePath & Application.PathSeparator & "TempChart.gif"
MyChart.Export Filename:=imageName, FilterName:="GIF"

ActiveSheet.ChartObjects(1).Delete
Application.ScreenUpdating = True
UserForm2.Image1.Picture = LoadPicture(imageName)
End Sub

此外,我必须在MyChart.SeriesCollection.NewSeries循环之前使用命令行If,所以即使只标记了一个复选框,也会有3个系列的标签(带有通用标题)。有办法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我能够通过在工作表2中绘制图形而不是在工作表1中绘制图来解决问题。我不明白为什么代码最初失败,但是更改解决了问题,所以没关系。 / p>

我所做的就是将所有ActiveSheet更改为Worksheets("Sheet2")。然后,不是使用工作表2中的数据并将其绘制在工作表1中,而是在工作表2中完成所有操作。这并不重要,因为图表实际上将显示在用户表单中。