2016-01-28 5 views
0

Я ищу для форматирования нескольких выбранных диаграмм на Excel 2010 с использованием VBA. Приведенный ниже код работает, когда выбрана только одна диаграмма, но когда выбрано несколько диаграмм, я получаю «временную ошибку» 91 «Объектная переменная или с неблокируемой переменной». Любая идея, как запустить макрос для числа выбрано диаграмм?VBA: Форматирование нескольких выбранных графиков

Sub ChartFormat5_Click() 


''Adjust chart area 

'Size 
Selection.Width = 631.9 
Selection.Height = 290.1 

'Border 
With Selection.Format.Line 
    .Visible = msoTrue 
    .ForeColor.ObjectThemeColor = msoThemeColorText1 
    .ForeColor.TintAndShade = 0 
    .ForeColor.Brightness = 0 
    .Transparency = 0 
    .Weight = 1 
    .DashStyle = msoLineSolid 
End With 

'Font 
With Selection.Format.TextFrame2.TextRange.Font 
    .Name = "Calibri" 
    .Size = 10 
    .Fill.Visible = msoTrue 
    .Fill.ForeColor.ObjectThemeColor = msoThemeColorText1 
    .Fill.ForeColor.TintAndShade = 0 
    .Fill.ForeColor.Brightness = 0 
    .Fill.Transparency = 0 
    .Fill.Solid 
End With 


End Sub 

Спасибо!

ответ

1

Это будет обрабатывать активный график или все выбранные диаграммы. Первая процедура определяет, что обрабатывать (активная диаграмма или выбранные диаграммы), а вторая - каждая.

Sub FormatCharts() 
    Dim obj As Object 

    If Not ActiveChart Is Nothing Then 
    FormatOneChart ActiveChart 
    Else 
    For Each obj In Selection 
     If TypeName(obj) = "ChartObject" Then 
     FormatOneChart obj.Chart 
     End If 
    Next 
    End If 
End Sub 

Sub FormatOneChart(cht As Chart) 
    ' do all your formatting here, based on cht not on ActiveChart 
End Sub 

Не выбирайте части диаграммы, просто полностью ссылайтесь на них. Вместо

ActiveChart.ChartArea.Select 
With Selection.Format.Line 

использовать этот

With cht.ChartArea.Format.Line 

т.д.

Примечание: это дубликат VBA: Formatting Multiple Selected Charts (Chart, Plot, Legend, etc.)

1

После некоторой пробной ошибки я выяснил, как заставить ее работать, если вы выбрали только одну или несколько диаграмм. Это было просто, но это сработало, когда я его протестировал.

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

Sub ChartFormat5_Click() 

    Select Case TypeName(Selection) 

     Case Is = "ChartArea" `only 1 selected 

      FormatChart Selection 

     Case Is = "DrawingObjects" 'more than 1 selected 

      Dim cht As ChartObject 
      For Each cht In Selection 
       FormatChart cht.Chart.ChartArea 
      Next 

    End Select 

End Sub 

Sub FormatChart(chtArea As ChartArea) 

With chtArea 

    'size 
    .Width = 631.9 
    .Height = 290.1 

    With .Format 
     'Border 
     With .Line 
      .Visible = msoTrue 
      .ForeColor.ObjectThemeColor = msoThemeColorText1 
      .ForeColor.TintAndShade = 0 
      .ForeColor.Brightness = 0 
      .Transparency = 0 
      .Weight = 1 
      .DashStyle = msoLineSolid 
     End With 

     'Font 
     With .TextFrame2.TextRange.Font 
      .Name = "Calibri" 
      .Size = 10 
      With .Fill 
       .Visible = msoTrue 
       With .ForeColor 
        .ObjectThemeColor = msoThemeColorText1 
        .TintAndShade = 0 
        .Brightness = 0 
       End With 
       .Transparency = 0 
       .Solid 
      End With 
     End With 
    End With 
End With 

End Sub 
+0

Скотт - это работает! Тем не менее, теперь у меня возникают проблемы, если я только пытаюсь запустить макросы для одного выбранного графика (т. Е. 1 из 5 графиков) ... Спасибо за вашу помощь! –

+0

@JKo_FinanceUse - вы видели мой комментарий в коде о ''change ws.ChartObjects в« Selection' –

+0

http://stackoverflow.com/users/1569536/scott-holtzman - yup, поэтому я заменил ws.ChartObjects на Selection но когда я пытаюсь запустить одну выбранную диаграмму, я получаю ошибку «438» ошибки времени выполнения, которая не поддерживает это свойство или метод. Фактически, строка, в которой я получаю сообщение об ошибке, находится в «Для каждого cht in Selection». –

0

Hy попробовать:

Sub ChartFormat5_Click_v02() 

    For i = 1 To Application.Sheets.Count 

    Application.Sheets(i).Activate 

    For j = 1 To ActiveSheet.ChartObjects.Count 

     ActiveSheet.ChartObjects(j).Activate 


     'your code here 

    Next j 

    Next i 

End Sub 
+0

Andre - похоже, что он только выбирает последний график в листе ... Я хотел бы автоматизировать форматирование ТОЛЬКО тех, которые я выбираю –

+0

Собственно, этот скрипт форматирует все графики во всех листах. Если вам нравится форматировать только ТОЛЬКО выбранную диаграмму, лучше ответить на вопрос @Scott Holtzman. –

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