2014-08-27 61 views
4

我正在尋找一個宏,它可以從一個圖表複製格式並將其應用於多個其他圖表。在用戶表單中選擇圖表

我正在努力做的是確定一種方法來允許用戶設置模板圖表,然後選擇多個其他圖表。如果用戶知道圖表名稱,可以使用組合框來完成,但我試圖在不知道圖表名稱的情況下執行此操作。

因此,我正在考慮有一個用戶對話框,用戶可以在其中選擇基本圖表,然後選擇要應用格式的圖表。就像refedit的範圍。但是我無法弄清楚如何從用戶表單中引用圖表。

可以這樣做,如果是這樣,如何?

+1

通常情況下,我投這樣的問題是「寬」,但在這個場合我想提出一個例外,因爲這種「可能」是一個很好的問題,如果你縮小你的問題具體:) – 2014-08-27 08:47:40

回答

5

這是什麼讓你開始。

在用戶窗體上放置兩個組合框和兩個圖像控件。

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

在組合框的Click事件,使用斯蒂芬·布倫的PastePicture代碼HERE顯示圖表在用戶表單中。例如,

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

2

下面的代碼應該讓你做的東西與所選擇的圖表區(S),在那裏你可以選擇一個或多個圖表:

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調用鉤住鼠標事件並註冊任何鼠標點擊,然後檢查選擇更改。

這應該允許您創建一個類似ref的編輯功能,以從用戶窗體中選擇工作表上的圖表。

+0

我只是看到你發佈了一個答案。我準備發表一個答案,因爲我正在研究它一段時間。我希望你不介意我發佈一個答案。另外它遵循不同的方法:) – 2014-08-27 09:08:52

+0

+ 1對於另一種選擇:) – 2014-08-27 09:24:40

+0

柏忌,我結合了你和@SiddharthRout的答案。我已經獲得了Siddharth的代碼片段,可以選擇我的基本病例圖,然後使用您的代碼將格式應用於已經選擇的圖表。但是我無法讓你的代碼工作。你能幫忙嗎? 我正在努力使用'設置chart_area = chart_obj.Chart.chartArea'在furture代碼段。所以我正在尋找使用循環內的代碼來使用'targetName = Selection(i).Name'來獲取圖表名稱,然後使用它。 – MatthewK 2014-08-27 12:11:41