Как отнести макрос к диапазону ячеек на текущем листе? - PullRequest
1 голос
/ 12 января 2012

Я записал макрос для создания графиков на листе. Данные организованы одинаковым образом на всех листах рабочей книги, поэтому я хотел бы обобщить макрос так, чтобы его можно было использовать на каждом листе (или, если есть возможность пакетной обработки рабочих таблиц).

Код выглядит так:

ActiveWindow.SmallScroll Down:=-57
Range("C5:C65").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=Range("fr_1!$C$5:$C$65")
ActiveChart.Axes(xlCategory).Select
ActiveChart.SeriesCollection(1).XValues = "=fr_1!$A$5:$A$65"

Записав макрос на fr_1, у меня теперь есть эта ссылка в 5-й и последней строке, тогда как я хотел бы иметь общую ссылку на активный лист.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Вы можете

  • добавить нужные листы в массив и просто получить доступ к листам, на которых вы хотите разместить диаграммы.Этот код работает только для трех имен листов, предоставленных Arrshts = Array("Sheet1", "Sheet3", "MySheet With Space")
  • , чтобы пропустить потенциальную проблему с именами, ссылаясь только на локальные диапазоны

[ Обновлено - добавленообработка ошибок для потенциально недопустимых имен листов]

    Sub Sample()
    Dim ws As Worksheet
    Dim Arrshts()
    Dim ArrSht
    Dim strOut As String
    Arrshts = Array("Sheet1", "Sheet3", "MySheet With Space")
    For Each ArrSht In Arrshts
    On Error Resume Next
    Set ws = Nothing
    Set ws = Sheets(ArrSht)
    On Error GoTo 0
    If Not ws Is Nothing Then
        With Sheets(ArrSht).Shapes.AddChart.Chart
            .ChartType = xlLine
            .SetSourceData Range("$C$5:$C$65")
            .SeriesCollection(1).XValues = Range("$A$5:$A$65")
        End With
    Else
        strOut = strOut & (vbNewLine & ArrSht)
    End If
    Next
    If Len(strOut) > 0 Then MsgBox strOut, , "These array names are incorrect and need adjusting"
    End Sub
2 голосов
/ 12 января 2012

Вы можете:

Dim aSheet As Worksheet
For Each aSheet In ActiveWorkbook.Worksheets
    With aSheet.Shapes.AddChart.Chart
        .ChartType = xlLine
        .SetSourceData Source:=aSheet.Range(aSheet.Name & "!$C$5:$C$65")
        .SeriesCollection(1).XValues = "=" & aSheet.Name & "!$A$5:$A$65"
    End With
Next

Если вы хотите перебрать выбранные вручную листы, измените на for each asheet in activewindow.selectedsheets

Для ручной фильтрации по имени;

Dim aSheet As Worksheet
For Each aSheet In ActiveWorkbook.Worksheets
    select case aSheet.name
        case "sheet1", "sheet50", "sheet999"   
            With aSheet.Shapes.AddChart.Chart
                .ChartType = xlLine
                .SetSourceData Source:=aSheet.Range(aSheet.Name & "!$C$5:$C$65")
                .SeriesCollection(1).XValues = "=" & aSheet.Name & "!$A$5:$A$65"
            End With
    end select
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...