2014-08-27 2 views
4

Я ищу, чтобы написать макрос, который копирует форматирование с одного графика и применяет его к нескольким другим графам.Выберите диаграмму в userform

То, что я пытаюсь сделать, - это определить способ, позволяющий пользователю установить шаблонную диаграмму, а затем выбрать несколько других диаграмм. Хотя это можно сделать с помощью комбинированного поля, если пользователь знал название диаграммы, я пытаюсь сделать это, не зная названия диаграммы.

Как таковой, я думал о наличии диалогового окна пользователя, где пользователь может выбрать базовую диаграмму, а затем выбрать диаграммы для применения форматирования. Точно так же, как refedit для диапазона. Однако я не могу понять, как ссылаться на график из пользовательской формы.

Это можно сделать, и если да, то как?

+1

Обычно я голосую такие вопросы, как «широкий», но в этом случае я делаю исключение, так как это «может» быть хороший вопрос, если сузить свой вопрос конкретика :) –

ответ

5

Вот что вы начнете.

Поместите два ComboBoxes и два элемента управления изображением на пользовательскую форму.

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

В храповом случае из Наримера, используйте 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

Следующий код должен позволять вам делать вещи с выделенной областью графика (ов), где вы можете выбрать одну или несколько диаграмм:

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 и зарегистрировать любые щелчки мыши, а затем проверить изменения выбора.

Это должно позволить вам создать функцию редактирования, подходящую для редактирования, для выбора диаграмм на вашем листе из пользовательской формы.

+0

я просто увидел, что вы отправили ответ. Я собираюсь опубликовать ответ, когда я работал над ним некоторое время. Надеюсь, вы не возражаете, если я отправлю ответ. Также следует другой подход :) –

+0

+ 1 Для альтернативы :) –

+0

Bogey, я отправился с сочетанием ваших ответов и @SiddharthRout. Я получил часть кода Сиддхарта, чтобы выбрать диаграмму базового случая, а затем использовать свой код для применения форматирования к уже выбранным диаграммам. Однако я не могу заставить ваш код работать. Вы можете помочь? Я старался работать с 'Set chart_area = chart_obj.Chart.chartArea' в фрагментах кода furture. Поэтому я искал код в цикле, чтобы получить имя диаграммы, используя 'targetName = Selection (i) .Name', а затем просто используйте это. – MatthewK

Смежные вопросы