Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Изменение диаграммы в Excel Добавлено: 07.02.07 18:02  

Автор вопроса:  demtruder
Помогите, плз!

Я копирую лист с графиками и в новых графиках надо везде изменить источник - имя листа, а диапазон ячеек не изменяется. Пример кода -

 ActiveSheet.ChartObjects(7).Activate
        ActiveChart.SeriesCollection(1).XValues = _
            "='Downlink Packet Data (" & k + 1 & ")'!R5C15:R52C15"
        ActiveChart.SeriesCollection(1).Values = _
            "='PCF Call Activation (" & k + 1 & ")'!R5C6:R52C6"
        ActiveChart.SeriesCollection(1).Name = "='PCF Call Activation (" & k + 1 & ")'!R3C6"
        ActiveChart.SeriesCollection(2).XValues = _
            "='Downlink Packet Data (" & k + 1 & ")'!R5C15:R52C15"
        ActiveChart.SeriesCollection(2).Values = _
            "='PCF Call Activation (" & k + 1 & ")'!R5C7:R52C7"
        ActiveChart.SeriesCollection(2).Name = "='PCF Call Activation (" & k + 1 & ")'!R3C7"

Так вот, проблема в том, что Ексель говорит, нельзя установить свойство Values (XValues, Name) класса Series! Что это за хрень?

И еще. Такое ощущение, что индексы диаграмм меняются рандомом! Такое может быть иль нет?

Заранее благодарен!

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #1
Добавлено: 07.02.07 22:23
Судя по всему код сгенерирован изначально макрорекордером... и потом адаптирован... верно?

Попробуйте так:

Dim ChOb As Chart
    Set ChOb = ActiveSheet.ChartObjects(7).Chart
        ChOb.SeriesCollection(1).XValues = _
            "='Downlink Packet Data (" & k + 1 & ";)'!R5C15:R52C15"
        ChOb.SeriesCollection(1).Values = _
            "='PCF Call Activation (" & k + 1 & ";)'!R5C6:R52C6"
        ChOb.SeriesCollection(1).Name = "='PCF Call Activation (" & k + 1 & ";)'!R3C6"
        ChOb.SeriesCollection(2).XValues = _
            "='Downlink Packet Data (" & k + 1 & ";)'!R5C15:R52C15"
        ChOb.SeriesCollection(2).Values = _
            "='PCF Call Activation (" & k + 1 & ";)'!R5C7:R52C7"
        ChOb.SeriesCollection(2).Name = "='PCF Call Activation (" & k + 1 & ";)'!R3C7"


Я конечно не смог полностью смоделировать всю Вашу ситуацию... но на своем примере у меня вроде все работает.

Про индексы диаграмм не могу ничего сказать.. не понял вопроса.

Ответить

Номер ответа: 2
Автор ответа:
 demtruder



Вопросов: 6
Ответов: 12
 Профиль | | #2 Добавлено: 08.02.07 11:39
Спасибо за ответ, GenyaA!

Я действительно сразу записал макрос, а потом добавил переменную в имя листа.
Я попробывал так, как вы сказали, но проблема не решилась!
Макрос работает через раз...:-(
В документе на листе всего 7 диаграмм, 4 из которых макрос заполняет правильно, 1 - только на-половину ( в ней 2 ряда, изменяется только один, причем второй), а на двух диаграммах Ексель постоянно ругается ( нельзя установить свойство ... класса Series ).

Что это может быть и что с этим делать?

А по поводу индекса диагамм - после повторной прогонки макроса, Ексель выдает сообщение, что объект не найден, хотя во время первого запуска макроса он всё находил!

Заранее благодарен!

Ответить

Номер ответа: 3
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #3
Добавлено: 08.02.07 12:51
Макрос работает через раз...:-(

Значит все-таки работает... в таком случае проверяйте правильность составляемой формулы... может быть k меняет значение так, что формируется имя листа, которого нет в книге...
Может быть стоит решать не через подстановку формул, а присвоением нужных объектов Range?

Я не уверен, но может быть при переопределении значений Series их индексы также переопределяются, и даже добавляются. Т.е. возможно старые делаются недоступными и скрытыми, а новые индексы растут. Попробуйте проверить свойство Count до и после отработки макроса. Честно говоря, я с графиками почти не работаю, поэтому... Извините, мало чем могу быть более полезным.

Ответить

Номер ответа: 4
Автор ответа:
 demtruder



Вопросов: 6
Ответов: 12
 Профиль | | #4 Добавлено: 08.02.07 13:36
Проверял, используя Step Into, значения k - всё правильно!
Также использовал Range вместо формул - результат тот же...
А вы не знаете случайно, есть ли автозамена в рядах графиков? А то таким образом всё очень сильно упрощается!

Спасибо!

Ответить

Номер ответа: 5
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #5
Добавлено: 08.02.07 14:01
Т.е. Вы уверены, что имя листа и адреса областей серий в формуле формируется абсолютно правильно?

Опять не понял по поводу "автозамена в рядах графиков" - что Вы имеете в виду? Во всяком случае, определенно можно сказать, что Excel не производит поиск/замену в ссылках параметров графиков, и не может сделать поиск/замену какой-либо строки/подстроки в базе данных всего документа (включая все данные всех объектов), подобно тому, как это можно сделать в AutoCAD. Excel делает поиск только в пределах явно указанного объекта, где этот поиск возможнен - лист, группа листов, область листа, группа областей листа/листов, и т.п.

Но я предложил бы Вам еще попробовать перебирать элементы коллекции SeriesCollection в цикле For each, вместо указания конкретных их номеров - это может действительно упростить работу, если сделать, например, так (с помощью функции Replace):

ChOb.SeriesCollection(1).Values = _
   Replace(ChOb.SeriesCollection(1).Values,CStr(k),CStr(k + 1))

Ответить

Номер ответа: 6
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #6
Добавлено: 08.02.07 15:52
Вот мой примерчик, он на 100% рабочий - меняются диапазоны одной конкретной диаграммы на одном и том же листе. Переделывайте как вам надо, только не говорите, что пример нерабочий - надо отлаживать свои программки.
Sub UpdateCharts()
    Const interval = 23
    Dim sh As Worksheet
    Dim i As Integer
    Set sh = ThisWorkbook.Worksheets("Курсы валют";)
    sh.Activate
    i = 1655
    Do While Not sh.Cells(i, 1).Value = Empty
        i = i + 1
    Loop
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SeriesCollection(1).XValues = "='Курсы валют'!R" & CStr(i - interval) & "C1:R" & CStr(i - 1) & "C1"
    ActiveChart.SeriesCollection(1).Values = "='Курсы валют'!R" & CStr(i - interval) & "C2:R" & CStr(i - 1) & "C2"
    ActiveChart.SeriesCollection(2).XValues = "='Курсы валют'!R" & CStr(i - interval) & "C1:R" & CStr(i - 1) & "C1"
    ActiveChart.SeriesCollection(2).Values = "='Курсы валют'!R" & CStr(i - interval) & "C3:R" & CStr(i - 1) & "C3"
    ActiveSheet.ChartObjects(2).Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SeriesCollection(1).XValues = "='Курсы валют'!R" & CStr(i - interval) & "C1:R" & CStr(i - 1) & "C1"
    ActiveChart.SeriesCollection(1).Values = "='Курсы валют'!R" & CStr(i - interval) & "C4:R" & CStr(i - 1) & "C4"
    sh.Cells(i, 2).Select
    Set sh = Nothing
End Sub

Ответить

Номер ответа: 7
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #7
Добавлено: 08.02.07 15:57
Сори, неточность.. у меня меняются две диаграммы. Но не толко в этом суть. Надо на самом деле в случае demtruder перебирать все диаграммы на новом листе for each ... in ... и какими станут новый индексы диаграмм - это дело excel. Они присваиваются не случайными ислами. Советую в for each перепроверять диаграммы не по индексу, а по значению например заголовка (если заголовки и demtruder одинаковые).

Ответить

Номер ответа: 8
Автор ответа:
 demtruder



Вопросов: 6
Ответов: 12
 Профиль | | #8 Добавлено: 09.02.07 11:50
Если честно, я только начал использовать VBA, и многого не знаю... Вот цикл For Each ... Next. Но он просто игнорируется при Step Into:


For Each SeriesCollection In ActiveSheet.ChartObjects
            
SeriesCollection.Replace What:="UP Link Data", Replacement:="UP Link Data (" & k + 1 & ";)"
                      
SeriesCollection.Replace What:="PCF Call Activation", Replacement:="PCF Call Activation (" & k + 1 & ";)"
    
SeriesCollection.Replace What:="Inter-PCF HO", Replacement:="Inter-PCF HO (" & k + 1 & ";)"
    
SeriesCollection.Replace What:=";Downlink Packet Data", Replacement:=";Downlink Packet Data (" & k + 1 & ";)"
            
Next


Что я не правильно делаю?

Кстати, а как обратится к диаграмме по ее заголовку?

Заранее спасибо!

Ответить

Номер ответа: 9
Автор ответа:
 demtruder



Вопросов: 6
Ответов: 12
 Профиль | | #9 Добавлено: 09.02.07 13:02
Проверил работу Replace для SeriesCollection - Ексель ругается и говорит, что этот метод не поддерживается данным объектом :-(
Я все равно не понимаю, почему некоторые ряды Ексель не видит, что-ли?
И что значит невозможность установления значения Value, Name, XValue для Series?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам