Хочу из своей программы построить диаграмму в 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'];
Здравствуйте Бондаренко Николай, Вы писали:
БН>//значит вот так должно быть, тем не менее — ошибка при исполнении БН>Excel.ActiveWorkBook.ActiveChart.SeriesCollection[1].XValues := 'Sheet1!R1C2:R31C2';
Попробуй полный синтаксис:
Здравствуйте Бондаренко Николай, Вы писали:
БН>Проблема в том, что если для задания диапазона значений существует метод 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 и присвоится ли ему строка. Может, нужно перевести в Вариант и передавать таким образом?
Здравствуйте Vi2, Вы писали:
Vi2>Ну во-первых совсем не похоже: "=Sheet1!R1C2:R31C2" и 'Sheet1!R1C2:R31C2'. А где знак равенства из первой строки?
Пробовал я и так тоже, просто не написал об этом — ничего не меняется.
Vi2>А во-вторых, я Delphi не знаю, поэтому могу ошибуаться, XValues — это VARIANT и присвоится ли ему строка. Может, нужно перевести в Вариант и передавать таким образом?
Здравствуйте Бондаренко Николай, Вы писали:
Vi2>>Ну во-первых совсем не похоже: "=Sheet1!R1C2:R31C2" и 'Sheet1!R1C2:R31C2'. А где знак равенства из первой строки?
БН>Пробовал я и так тоже, просто не написал об этом — ничего не меняется.
А не пробовал имя листа написать по-русски? Или как он там называется? И знак равенства нужен.
Здравствуйте Бондаренко Николай, Вы писали:
БН>Попробовал по русски — результат тот же БН>Где-то все таки, мне кажется, глубже проблема зарыта.
Хорошо. Не могу советовать — Delphi не знаю. Но свойство XValues — это Вариант, содержащий массив double. Если есть что-то подобное в Delphi — array(1,2,3,4,...,31), попробуй передать массив.
Здравствуйте Vi2, Вы писали:
Vi2>Если есть что-то подобное в Delphi — array(1,2,3,4,...,31), попробуй передать массив.
Есть такое — VarArrayOf([1,2]) — не помогает.
Все равно ощущение, что нет интерфейса к этому свойству. Будто надо писать туда через какие-то методы, но методов-то этих нет. И в хелпе его просто так задают Никакой зацепки...
Дошло до того, что я сам уже почти написал построитель диаграмм , а с экселем не могу совладать...
Здравствуйте Бондаренко Николай, Вы писали:
БН>Хочу из своей программы построить диаграмму в 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" ? Раз ты с ней работаешь.
Здравствуйте Vi2, Вы писали:
Vi2>Может тебе надо сохранять созданную через Excel.ActiveWorkBook.Charts.Add; диаграмму в переменной и использовать вместо "ActiveWorkBook.ActiveChart" ? Раз ты с ней работаешь.
Да вроде бы не уходит т.к. выполняется
Excel.ActiveWorkBook.ActiveChart.SetSourceData
и сразу же за этим
Excel.ActiveWorkBook.ActiveChart.SeriesCollection(1).XValues := '=Sheet1!R1C2:R31C2';
Через переменную — вообще вылазит "OLE Error ..." либо я что-то не так делал. Уже голова пухнет.
Я старался идти по пути наименьшего сопротивления — делал как в макросе.
Я пока приостанавливаю свои изыскания в этом направлении и дописываю свою рисовалку графиков.
Хотелось как лучше — получилось как всегда