在用户窗体中select图表

我正在寻找写一个macros从一个graphics复制格式,并将其应用到多个其他graphics。

我正在努力做的是确定一种方法来允许用户设置模板图表,然后select多个其他图表。 虽然这可以通过combobox完成,如果用户知道图表名称,我试图做,而不知道图表名称。

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

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

这是什么让你开始。

在用户窗体上放置两个combobox和两个图像控件。

在这里输入图像说明

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

在这里输入图像描述

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

 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 

所以当你运行表单的时候,看起来就像这样

在这里输入图像描述

在combobox的单击事件中,使用来自HERE的Stephen Bullen的PastePicture代码在用户窗体中显示图表。 例如

 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 

这是表格的外观。

从那里开始,现在你有了图表的名字。 只要用它们就可以随心所欲地工作。

希望这可以帮助。

在这里输入图像描述

下面的代码应该允许您使用选定的图表区域进行操作,您可以在其中select一个或多个图表:

 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 

你可能需要细化一下,也就是说,如果用户select了实际的图表,那么它应该可以工作,但是如果他只select图表中的一个特定的元素,则可能会失败。

好的,接下来的问题是,你什么时候从你的用户表单调用这个。 所以首先,你的用户表单应该是模态的,当然是允许用户select任何东西。 那么你怎么注意到用户什么时候select了什么? 我可以想到三种方法,我会列出他们从最好到最差(最后2只描述非常简短,因为我不会推荐使用它们):

  1. 使用工作表上的“Worksheet_SelectionChange”事件,让它调用你的用户表单中的一个方法来通知它select已经改变。 现在,您只需要检查是否以及select了哪些图表(请参阅上面的代码),然后运行algorithm。

  2. 在你的用户表单中运行一个定时器,并定期检查活动select。

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

这应该允许您创build一个类似ref的function,从用户窗体中select工作表上的图表。