Диаграмма в Excel через OLE
От: Бондаренко Николай Россия  
Дата: 25.09.02 02:16
Оценка:
Хочу из своей программы построить диаграмму в Excel. Кто знает — там нужно задать диапазон для значений(по оси Y) и диапазон для подписей (по оси X). Проблема в том, что если для задания диапазона значений существует метод SetSourceData то для задания диапазона подписей нужно просто присваивать значение свойству XValues. Вот при этом то присвоении и появляется ошибка "Неудалось установить свойство XValues." Хотя в хелпе по Excel VBA оно обозначаетя как Read/Write, да и в макросе оно без проблем присваивается.
Как мне задать диапазон подписей программно?
Вот кусок кода на Delphi


var
 Excel: OLEVariant;
begin
 try
   Excel := GetActiveOleObject('Excel.Application');
 except
   Excel := CreateOleObject('Excel.Application');
 end;
 Excel.Workbooks.Open(RptPath+'Report.xls');

 Excel.ActiveWorkBook.Charts.Add;
 Excel.ActiveWorkBook.ActiveChart.ChartType := xlLine;
 Excel.ActiveWorkBook.ActiveChart.SetSourceData(Excel.ActiveWorkBook.Sheets['Sheet1'].Range['A1:A31'],xlColumns);

//вот оригинал из макроса
//ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C2:R31C2"

//значит вот так должно быть, тем не менее - ошибка при исполнении
Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := 'Sheet1!R1C2:R31C2';

//пробовал еще вот так  - тоже не выходит
//Excel.ActiveWorkBook.ActiveChart.SeriesCollection(1).XValues := 'Sheet1!R1C2:R31C2';
//пробовал еще вот так  - тоже не выходит
//Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := 
//Excel.ActiveWorkBook.Sheets['Sheet1'].Range['B1:B31'];
//пробовал еще вот так  - тоже не выходит
//Excel.ActiveWorkBook.ActiveChart.SeriesCollection(1).XValues := 
//Excel.ActiveWorkBook.Sheets['Sheet1'].Range['B1:B31'];



--------------------------------------------------------------------------------
Re: Диаграмма в Excel через OLE
От: retalik www.airbandits.com/
Дата: 25.09.02 03:57
Оценка:
Здравствуйте Бондаренко Николай, Вы писали:

БН>//значит вот так должно быть, тем не менее — ошибка при исполнении

БН>Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := 'Sheet1!R1C2:R31C2';
Попробуй полный синтаксис:

Excel.ActiveWorkBook.ActiveChart.SeriesCollection.Item(1).XValues := 'Sheet1!R1C2:R31C2';
Успехов,
Виталий.
Re: Неточности в тексте
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.09.02 05:00
Оценка:
Здравствуйте Бондаренко Николай, Вы писали:

БН>Проблема в том, что если для задания диапазона значений существует метод SetSourceData то для задания диапазона подписей нужно просто присваивать значение свойству XValues. Вот при этом то присвоении и появляется ошибка "Неудалось установить свойство XValues."


БН>//вот оригинал из макроса

БН>//ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C2:R31C2"

БН>//значит вот так должно быть, тем не менее — ошибка при исполнении

БН>Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := 'Sheet1!R1C2:R31C2';

Ну во-первых совсем не похоже: "=Sheet1!R1C2:R31C2" и 'Sheet1!R1C2:R31C2'. А где знак равенства из первой строки?

А во-вторых, я Delphi не знаю, поэтому могу ошибуаться, XValues — это VARIANT и присвоится ли ему строка. Может, нужно перевести в Вариант и передавать таким образом?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Неточности в тексте
От: Бондаренко Николай Россия  
Дата: 26.09.02 00:22
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Ну во-первых совсем не похоже: "=Sheet1!R1C2:R31C2" и 'Sheet1!R1C2:R31C2'. А где знак равенства из первой строки?


Пробовал я и так тоже, просто не написал об этом — ничего не меняется.

Vi2>А во-вторых, я Delphi не знаю, поэтому могу ошибуаться, XValues — это VARIANT и присвоится ли ему строка. Может, нужно перевести в Вариант и передавать таким образом?


Ну а насчет второго — в хелпе пишут:
All integer, real, string, character, and Boolean types (except Int64) are assignment-compatible with Variant.
Так что проблема не в этом.
Re[2]: Диаграмма в Excel через OLE
От: Бондаренко Николай Россия  
Дата: 26.09.02 00:25
Оценка:
Здравствуйте retalik, Вы писали:

R>Попробуй полный синтаксис:


R>
R>Excel.ActiveWorkBook.ActiveChart.SeriesCollection.Item(1).XValues := 'Sheet1!R1C2:R31C2';
R>


Полный синтаксис тоже ничего не изменил — по прежнему "Нельзя установить свойство XValues класса Series"
Re[3]: Неточности в тексте
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.09.02 04:10
Оценка:
Здравствуйте Бондаренко Николай, Вы писали:

Vi2>>Ну во-первых совсем не похоже: "=Sheet1!R1C2:R31C2" и 'Sheet1!R1C2:R31C2'. А где знак равенства из первой строки?


БН>Пробовал я и так тоже, просто не написал об этом — ничего не меняется.


А не пробовал имя листа написать по-русски? Или как он там называется? И знак равенства нужен.
Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := '=Лист1!R1C2:R31C2';
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Неточности в тексте
От: Бондаренко Николай Россия  
Дата: 26.09.02 04:33
Оценка:
Здравствуйте Vi2, Вы писали:
i2>А не пробовал имя листа написать по-русски? Или как он там называется? И знак равенства нужен.

Попробовал по русски — результат тот же

Где-то все таки, мне кажется, глубже проблема зарыта.
Re[5]: Неточности в тексте
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.09.02 04:41
Оценка:
Здравствуйте Бондаренко Николай, Вы писали:

БН>Попробовал по русски — результат тот же

БН>Где-то все таки, мне кажется, глубже проблема зарыта.

Хорошо. Не могу советовать — Delphi не знаю. Но свойство XValues — это Вариант, содержащий массив double. Если есть что-то подобное в Delphi — array(1,2,3,4,...,31), попробуй передать массив.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Неточности в тексте
От: Бондаренко Николай Россия  
Дата: 26.09.02 05:16
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Если есть что-то подобное в Delphi — array(1,2,3,4,...,31), попробуй передать массив.


Есть такое — VarArrayOf([1,2]) — не помогает.
Все равно ощущение, что нет интерфейса к этому свойству. Будто надо писать туда через какие-то методы, но методов-то этих нет. И в хелпе его просто так задают Никакой зацепки...
Дошло до того, что я сам уже почти написал построитель диаграмм , а с экселем не могу совладать...
Re: Может, она не активна?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.09.02 05:34
Оценка:
Здравствуйте Бондаренко Николай, Вы писали:

БН>Хочу из своей программы построить диаграмму в Excel. Кто знает — там нужно задать диапазон для значений(по оси Y) и диапазон для подписей (по оси X). Проблема в том, что если для задания диапазона значений существует метод SetSourceData то для задания диапазона подписей нужно просто присваивать значение свойству XValues. Вот при этом то присвоении и появляется ошибка "Неудалось установить свойство XValues." Хотя в хелпе по Excel VBA оно обозначаетя как Read/Write, да и в макросе оно без проблем присваивается.

БН>Как мне задать диапазон подписей программно?

' ActiveWorkBook.ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C2:R31C2"
Вот немного поэкспериментировал:
    Dim c As Chart, s As Worksheet
    Set v = ActiveWorkbook.ActiveChart

v может быть реальным объектом, а может и не быть (Nothing), в зависимости активно оно или нет. Может у тебя активизация "ушла" с Chart?

Может тебе надо сохранять созданную через Excel.ActiveWorkBook.Charts.Add; диаграмму в переменной и использовать вместо "ActiveWorkBook.ActiveChart" ? Раз ты с ней работаешь.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Может, она не активна?
От: Бондаренко Николай Россия  
Дата: 26.09.02 06:54
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Может тебе надо сохранять созданную через Excel.ActiveWorkBook.Charts.Add; диаграмму в переменной и использовать вместо "ActiveWorkBook.ActiveChart" ? Раз ты с ней работаешь.


Да вроде бы не уходит т.к. выполняется
Excel.ActiveWorkBook.ActiveChart.SetSourceData
и сразу же за этим
Excel.ActiveWorkBook.ActiveChart.SeriesCollection(1).XValues := '=Sheet1!R1C2:R31C2';

Через переменную — вообще вылазит "OLE Error ..." либо я что-то не так делал. Уже голова пухнет.

Я старался идти по пути наименьшего сопротивления — делал как в макросе.

Я пока приостанавливаю свои изыскания в этом направлении и дописываю свою рисовалку графиков.
Хотелось как лучше — получилось как всегда
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.