我正在尋找一個宏,它可以從一個圖表複製格式並將其應用於多個其他圖表。在用戶表單中選擇圖表
我正在努力做的是確定一種方法來允許用戶設置模板圖表,然後選擇多個其他圖表。如果用戶知道圖表名稱,可以使用組合框來完成,但我試圖在不知道圖表名稱的情況下執行此操作。
因此,我正在考慮有一個用戶對話框,用戶可以在其中選擇基本圖表,然後選擇要應用格式的圖表。就像refedit
的範圍。但是我無法弄清楚如何從用戶表單中引用圖表。
可以這樣做,如果是這樣,如何?
我正在尋找一個宏,它可以從一個圖表複製格式並將其應用於多個其他圖表。在用戶表單中選擇圖表
我正在努力做的是確定一種方法來允許用戶設置模板圖表,然後選擇多個其他圖表。如果用戶知道圖表名稱,可以使用組合框來完成,但我試圖在不知道圖表名稱的情況下執行此操作。
因此,我正在考慮有一個用戶對話框,用戶可以在其中選擇基本圖表,然後選擇要應用格式的圖表。就像refedit
的範圍。但是我無法弄清楚如何從用戶表單中引用圖表。
可以這樣做,如果是這樣,如何?
這是什麼讓你開始。
在用戶窗體上放置兩個組合框和兩個圖像控件。
比方說,您的工作表看起來像這樣
在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
所以,當你運行的形式,它看起來像這樣
在組合框的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
這是窗體的外觀。
從那裏開始,現在你有了圖表的名字。只需使用它們就可以隨心所欲地工作。
希望這會有所幫助。
下面的代碼應該讓你做的東西與所選擇的圖表區(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只描述很簡單,因爲我不建議使用它們):
使用「Worksheet_SelectionChange」事件上你的工作表,並讓它在你的用戶表單中調用一個方法來通知它選擇已經改變。現在,您只需檢查是否以及選擇了哪些圖表(請參閱上面的代碼),然後運行算法。
在您的用戶表單中運行計時器並定期檢查活動選擇。
通過DLL調用鉤住鼠標事件並註冊任何鼠標點擊,然後檢查選擇更改。
這應該允許您創建一個類似ref的編輯功能,以從用戶窗體中選擇工作表上的圖表。
我只是看到你發佈了一個答案。我準備發表一個答案,因爲我正在研究它一段時間。我希望你不介意我發佈一個答案。另外它遵循不同的方法:) – 2014-08-27 09:08:52
+ 1對於另一種選擇:) – 2014-08-27 09:24:40
柏忌,我結合了你和@SiddharthRout的答案。我已經獲得了Siddharth的代碼片段,可以選擇我的基本病例圖,然後使用您的代碼將格式應用於已經選擇的圖表。但是我無法讓你的代碼工作。你能幫忙嗎? 我正在努力使用'設置chart_area = chart_obj.Chart.chartArea'在furture代碼段。所以我正在尋找使用循環內的代碼來使用'targetName = Selection(i).Name'來獲取圖表名稱,然後使用它。 – MatthewK 2014-08-27 12:11:41
通常情況下,我投這樣的問題是「寬」,但在這個場合我想提出一個例外,因爲這種「可能」是一個很好的問題,如果你縮小你的問題具體:) – 2014-08-27 08:47:40