在userform中选择图表

时间:2014-08-27 08:06:40

标签: excel excel-vba charts vba

我正在寻找一个宏,它从一个图表复制格式并将其应用于多个其他图表。

我正在努力做的是确定一种方法,允许用户设置模板图表,然后选择多个其他图表。虽然如果用户知道图表名称,可以使用组合框完成此操作,但我试图在没有他们知道图表名称的情况下执行此操作。

因此我想有一个用户对话框,用户可以在其中选择基本图表,然后选择要应用格式的图表。就像范围的refedit一样。但是,我无法弄清楚如何从用户表单中引用图表。

可以这样做,如果是,怎么做?

2 个答案:

答案 0 :(得分:6)

这是让你入门的原因。

在用户表单上放置两个ComboBox和两个Image Controls。

enter image description here

假设您的工作表看起来像这样

enter image description here

UserForm_Initialize()事件中填充两个组合框中的图表名称。例如

Dim ws As Worksheet

'~~> Prepare your form
Private Sub UserForm_Initialize()
    Set ws = ThisWorkbook.Sheets("Sheet1")

    Dim ChartObj As ChartObject

    For Each ChartObj In ActiveSheet.ChartObjects
        ComboBox1.AddItem ChartObj.Name
        ComboBox2.AddItem ChartObj.Name
    Next ChartObj
End Sub

因此,当您运行表单时,它将如下所示

enter image description here

在组合框的点击事件中,使用来自HERE的Stephen Bullen的PastePicture代码在userform中显示图表。例如

Private Sub ComboBox1_Click()
    ws.Shapes(ComboBox1.Value).CopyPicture
    Set Me.Image1.Picture = PastePicture(xlPicture)
End Sub

Private Sub ComboBox2_Click()
    ws.Shapes(ComboBox2.Value).CopyPicture
    Set Me.Image2.Picture = PastePicture(xlPicture)
End Sub

这就是表单的外观。

从那以后,现在你有了图表的名称。只需使用它们就可以随心所欲地工作。

希望这有帮助。

enter image description here

答案 1 :(得分:2)

以下代码应该允许您对选定的图表区域执行操作,您可以在其中选择一个或多个图表:

Public Sub ProcessSelectedCharts()
    Dim i As Integer
    Dim chart_obj As ChartObject
    Dim chart_area As chartArea

    If TypeOf Selection Is DrawingObjects Then
        For i = 1 To Selection.Count
            If TypeOf Selection(i) Is ChartObject Then
                Set chart_obj = Selection(i)
                Set chart_area = chart_obj.Chart.chartArea
                Call ProcessChart(chart_area)
            End If
        Next i
    ElseIf TypeOf Selection Is chartArea Then
        Set chart_area = Selection
        Call ProcessChart(chart_area)
    End If

End Sub

Public Sub ProcessChart(obj As chartArea)
    ' Do something...
End Sub

您可能希望稍微改进一下,即如果用户选择实际图表,这应该有效,但如果他只选择图表中的特定元素,则可能会失败。

好的,接下来的问题是,您何时从用户表单中调用此方法。首先,您的用户表单当然应该是模态的,以允许用户选择任何内容。那么,当用户实际选择什么时,您如何注意到? 我可以想到三种方法,并且我会从最好到最差的方式列出它们(最后2只是非常简短地描述,因为我不建议使用它们):

  1. 使用" Worksheet_SelectionChange"您的工作表上的事件,并让它调用您的用户窗体中的方法,以通知它选择已更改。现在,您只需要检查是否已选择了哪些图表(请参阅上面的代码),然后运行算法。

  2. 在用户表单中运行计时器并定期检查活动选择。

  3. 通过DLL调用挂钩鼠标事件并注册任何鼠标点击,然后检查选择更改。

  4. 这应该允许您创建一个类似于ref-edit的功能,用于从用户表单中选择工作表上的图表。