Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA несколько диаграмм на одном листе / 8 сообщений из 8, страница 1 из 1
08.05.2007, 13:36
    #34512544
Семён Семёнович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Всем привет, и с наступающим праздником. Начал использовать язык VBA, файл делаю в Excel2003. Использую довольно много диаграмм и реально возник вопрос можно ли на одном листе екселя разместить сразу две, три диаграммы, естественно с разными показателями. Сейчас получается рабочая диаграмма только в одном окне, хотя указываю для них разные диапазоны, как привожу в примере кода. Понимаю что If .ChartObjects.Count > 0 Then .ChartObjects.Delete убивает старые диаграммы, менять показатель 0 на 1 или 2 нет смысла, получается старые диаграммы не убиваются, что не есть хорошо. Умные книжки по VBA в этом вопросе ответа не дали. Как то можно дать каждой из двух диаграмм имя, знак, отличие что бы прога размещала убивала конкретную диаграмму. А может быть вообще в VBA это не возможно – разместить пять диаграмм на одном листе? Спасибо если кто подскажет.
привожу часть кода с двумя диаграммами в двух окнах из которых работает только одно окно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
[/SRC]Private Sub Workbook_Open()
    DeleteCharts52l1
    ChartBuilder52l1
    Filllst52l1
    DeleteCharts52l2
    ChartBuilder52l2
    Filllst52l2
End Sub

Private Sub DeleteCharts52l1()
With Worksheets("Ëèñò52")
If .ChartObjects.Count >  0  Then
    .ChartObjects.Delete
    End If
   End With
End Sub
Private Sub ChartBuilder52l1()
    Charts.Add
    With ActiveChart()
      .ChartType = xlColumnClustered
      .SetSourceData _
        Source:=Sheets("Ëèñò52").Range("B25:M25"), PlotBy:=x1Rows
    .SeriesCollection( 1 ).XValues = "= Ëèñò2!R24C2:R24C13"
    .Location Where:=xlLocationAsObject, Name:="Ëèñò52"
    End With
    With ActiveChart()
    .HasTitle = True
    .ChartTitle.Characters.Text = _
    Worksheets("Ëèñò52").Range("A25").Value
    .Axes([xlCategory], xlPrimary).HasTitle = False
    .Axes([xlValue], xlPrimary).HasTitle = False
    End With
    ActiveChart().HasLegend = False
    With Worksheets("Ëèñò52").ChartObjects( 1 )
    .Top = Range("A7").Top
    .Left = Range("A7").Left
    .Width = Range("A7:K23").Width
    .Height = Range("A7:K23").Height
    End With
    End Sub
Private Sub Filllst52l1()
    With Worksheets("Ëèñò52").lst52l1
    .ListFillRange = "Ëèñò52!A25:A29"
    .ListIndex =  0 
    End With
End Sub
Private Sub DeleteCharts52l2()
With Worksheets("Ëèñò52")
If .ChartObjects.Count >  0  Then
    .ChartObjects.Delete
    End If
   End With
End Sub
Private Sub ChartBuilder52l2()
    Charts.Add
    With ActiveChart()
      .ChartType = xlColumnClustered
      .SetSourceData _
        Source:=Sheets("Ëèñò52").Range("B55:M55"), PlotBy:=x1Rows
    .SeriesCollection( 1 ).XValues = "= Ëèñò2!R54C2:R54C13"
    .Location Where:=xlLocationAsObject, Name:="Ëèñò52"
    End With
    With ActiveChart()
    .HasTitle = True
    .ChartTitle.Characters.Text = _
    Worksheets("Ëèñò52").Range("A55").Value
    .Axes([xlCategory], xlPrimary).HasTitle = False
    .Axes([xlValue], xlPrimary).HasTitle = False
    End With
    ActiveChart().HasLegend = False
    With Worksheets("Ëèñò52").ChartObjects()
    .Top = Range("A37").Top
    .Left = Range("A37").Left
    .Width = Range("A37:K53").Width
    .Height = Range("A37:K53").Height
    End With
    End Sub
Private Sub Filllst52l2()
    With Worksheets("Ëèñò52").lst52l2
    .ListFillRange = "Ëèñò52!A55:A59"
    .ListIndex =  0 
    End With
End Sub


Ну и на самом листе где строиться  график стандартный код 

Private Sub lst52l1_Click()
Dim r As Integer
ActiveSheet.ChartObjects( 1 ).Activate
r = lst52l1.ListIndex +  1 
With ActiveChart()
    .SetSourceData _
    Source:= _
    Sheets("Ëèñò52").Range("B25:M29").Rows(r), PlotBy:=x1Rows
  .SeriesCollection( 1 ).XValues _
  = Sheets("Ëèñò52").Range("B24:M24")
  End With
  With ActiveChart()
  .HasTitle = True
  .ChartTitle.Characters.Text = lst52l1.Text
  End With
End Sub
Private Sub lst52l2_Click()
Dim r As Integer
ActiveSheet.ChartObjects( 1 ).Activate
r = lst52l2.ListIndex +  1 
With ActiveChart()
    .SetSourceData _
    Source:= _
    Sheets("Ëèñò52").Range("B55:M59").Rows(r), PlotBy:=x1Rows
  .SeriesCollection( 1 ).XValues _
  = Sheets("Ëèñò52").Range("B54:M54")
  End With
  With ActiveChart()
  .HasTitle = True
  .ChartTitle.Characters.Text = lst52l2.Text
  End With
End Sub
[SRC vba]
...
Рейтинг: 0 / 0
08.05.2007, 15:17
    #34513000
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Имя Chart выясняется просто:

ActiveChart.Name


По-моему, оно только читается, но не пишется.
...
Рейтинг: 0 / 0
08.05.2007, 19:38
    #34513847
Семён Семёнович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Да похоже оно не пишеться, и диаграммы не различаються ничем, и DeleteChart срубает их все кроме последней. Если что накапаю по диаграммам, отпишу. Ну должно же быть решение. Просто мой изучение VBA это поиск решений день за днём, книга Гарнаева Разработка приложений очень помогает, но чуть ухожу в сторону, начинаются траблы в решении которых есть определённая красота, но так как язык пока знаю не очень и возникают такие ситуации. Ну вобщем дать имя строящейся диаграмме, то есть разделить их между собой, что бы в дальнейшем код работал с каждой в отдельности пока не получаеться.
...
Рейтинг: 0 / 0
08.05.2007, 19:58
    #34513879
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Так дать имя и не получится, но его дает за вас система, вы имя узнайте и ссылайтесь на диаграмму по ее узнанному имени.
...
Рейтинг: 0 / 0
08.05.2007, 20:03
    #34513888
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Семён СемёновичДа похоже оно не пишеться, и диаграммы не различаються ничем,Нуууу... а если подумать? Как они могут ничем не различаться?

Семён СемёновичПросто мой изучение VBA это поиск решений день за днём, книга Гарнаева Разработка приложений очень помогает, но чуть ухожу в сторону, начинаются траблы в решении которых есть определённая красота, но так как язык пока знаю не очень и возникают такие ситуации. Во первых, в Офисе есть такая штука как macro-recorder. Tools->Macro->Record New Macro. Запусти запись макроса, сделай что тебе нужно на листе, останови запись, а потом вдумчиво рассмотри получившийся макрос. Только смотреть на него надо ВДУМЧИВО. Макро-рекодер делает макросы привязаные к текущей ситуации на листе и без рашпиля их использовать нельзя.
Во вторых, находясь в окне VBA ткни кнопку F2 получишь список всех объектов которые зарегестрированы в текущей книге. Изучай этот список - намного полезнее будет чем читать книги.

Ну а чтобы разобраться с диаграмами, показываю. Вот на пустом листе я запустил MacroRecoder и нарисовал две диаграммы на одном листе. Можешь скопировать этот макрос напрямую в чистую книгу и запустить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Sub Macro1()
    ActiveCell.FormulaR1C1 = "1"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "4"
    Range("A5").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "4"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("C1").Select
    Charts.Add
    ActiveChart.ChartType = xlLineMarkers
    ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:A5"), PlotBy:= _
        xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
    With ActiveChart
        .HasTitle = False
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With
    ActiveSheet.Shapes("Chart 1").IncrementLeft - 13 . 5 
    ActiveSheet.Shapes("Chart 1").IncrementTop - 108 #
    ActiveWindow.Visible = False
    Windows("Book2").Activate
    Range("D28").Select
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B1:B5"), PlotBy:= _
        xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
    With ActiveChart
        .HasTitle = False
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With
    ActiveSheet.Shapes("Chart 2").IncrementLeft - 15 #
    ActiveSheet.Shapes("Chart 2").IncrementTop  109 . 5 
    ActiveSheet.Shapes("Chart 2").ScaleHeight  0 . 8 , msoFalse, _
        msoScaleFromBottomRight
    ActiveWindow.Visible = False
    Windows("Book2").Activate
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.ChartArea.Select
    ActiveSheet.Shapes("Chart 1").ScaleHeight  0 . 69 , msoFalse, msoScaleFromTopLeft
    ActiveWindow.Visible = False
    Windows("Book2").Activate
    ActiveSheet.ChartObjects("Chart 2").Activate
    ActiveChart.ChartArea.Select
    ActiveSheet.Shapes("Chart 2").IncrementLeft  3 #
    ActiveSheet.Shapes("Chart 2").IncrementTop - 85 . 5 
End Sub
И что мы можем рассматривая этот макрос найти? А например то, что диаграммы между собой все таки различаются. Причем по имени. Достаточно указать .ChartObjects("Chart 1") и ты будешь работать с первым графиком. А укажешь .ChartObjects("Chart 22") и будешь работать с 22-ым графиком.

А если хочешь изменить имя графика, то используй знак присваивания:
Код: plaintext
    ActiveSheet.Shapes("Chart 2").Name = "My Second Chart"
И после этого можешь обращаться к диаграмме по новому имени.
...
Рейтинг: 0 / 0
08.05.2007, 20:08
    #34513897
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
VladConnТак дать имя и не получится, но его дает за вас система, вы имя узнайте и ссылайтесь на диаграмму по ее узнанному имени.Не обманывай. Имя дать можно без проблем.
Код: plaintext
1.
2.
With ActiveSheet.ChartObjects.Add
    .Name = "My cool chart"
End With
...
Рейтинг: 0 / 0
08.05.2007, 20:46
    #34513942
Семён Семёнович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Спасибо, сейчас буду ВДУМЧИВО капать
но уже по вашему коду вижу, что подхожу к задаче с совсем другой стороны, точнее сказать я просто зациклился
...
Рейтинг: 0 / 0
08.05.2007, 21:15
    #34513983
Семён Семёнович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA несколько диаграмм на одном листе
Ещё раз спасибо всем. Спасибо за макрос. И по поводу F2 и VBAProject это просто круто, упрощает, точнее очищает взляд на то, что сделал в текущем проекте, в умной книжке про это так конкретно написано не было. Буду работать ВДУМЧИВО, но завтра сегодня уже поздно.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA несколько диаграмм на одном листе / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]