| 
			
			 | 
		#1 | 
| 
			
			 int 20h 
		
			
	 | 
	
	
	
		
		
			
			
			Еще проблема с Excel при построении диаграмм
			 
			
			Добрый день. 
		
		
		
		
		
		
			Пытаясь построить диаграмму программно на Х++ столкнулся с затруднением. Как вывести содержимое объедененных ячеек в легенду. Диаграмма строится на отдельном листе. Лист с данными называется свод. Методом проб выяснил что передать в xValue можно только форматом RC колонок. ячейки с R2C5 по R2C23 являются объедененными по принципу R2C5 объеденена R2C6 R2C7 объеденена R2C9 и тд Данные содержатся для легенды содержатся в R2C5, R2C7 то есть каждой нечетной до 23 столбца включительно. пытаясь передать в метод ComExcelDocument_RU содержимое X++: outputRangeHeader ="=\свод\'\!R2C5\:R2C23";X++: SeriesCollection.xValue(_outputRangeHeader); Метод "range" в COM-объекте класса "_Application" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: <неизвестно>. Подскаджите пожалуйста, как можно передать такой Range ![]() ![]()  
		
				__________________ 
		
		
		
		
		
			It's just my Unhopelessnessabilityerism   Trying to debug my mind   
			Последний раз редактировалось zZ_TOP_Zz; 19.09.2008 в 15:09.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			"За сколько времени сможете подготовиться и сдать экзамен по китайскому языку? - Конспект есть? Щас докурю и пойдём сдавать!"  
		
		
		
		
		
		
		
	Если руками в Excel делать, то это в каком месте? Во-первых, SeriesCollection.XValues, наверное, всё-таки, а не .xlValue?  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 int 20h 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну да опечатался...что же теперь ....по существу есть что то?... 
		
		
		
		
		
		
			Там же между строк написано, что строится отчет в неком классе, Из него вызывается метод класса ComExcelDocument_RU Вызывается вот этой командой со значениями указанными в начале поста X++: exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader ); X++: #define.xlPie(5) void addXlPieChart(int _workSheet, BookMark _bookMark, str _title, str _newSheetName, str _outputLegendRange, boolean _reverse = false) { COM Charts, Chart, comRange; COM ChartTitle, Characters, SeriesCollection,Border, Legend; COM ActiveSheet; int i; str bookmark; ; if (! m_comDocument) throw error(strFmt("@DIS6401", this.getApplicationName())); Charts = m_comDocument.charts(); Charts.Add(); Chart = m_comDocument.ActiveChart(); comRange = this.findRange(_bookMark, _workSheet); Chart.SetSourceData(comRange, 1); Chart.ChartType(#xlPie); SeriesCollection = Chart.SeriesCollection(1); SeriesCollection.ApplyDataLabels(1,0,0,0,0,0,1); SeriesCollection.XValues(_outputLegendRange); Border = SeriesCollection.Border(); Border.Weight(1); Chart.HasTitle(True); ChartTitle = Chart.ChartTitle(); Characters = ChartTitle.Characters(); Characters.Text(_title); ChartTitle.AutoScaleFont(false); Chart.Name(_newSheetName); } X++: SeriesCollection.XValues(_outputLegendRange); 
				__________________ 
		
		
		
		
	It's just my Unhopelessnessabilityerism   Trying to debug my mind   
			 | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 int 20h 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вопрос снимается.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	It's just my Unhopelessnessabilityerism   Trying to debug my mind   
			 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Получилось? Расскажете? У меня, честно говоря, с наскока не получилось, поэтому и затих  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 int 20h 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Конечно расскажу  
		
		
		
		
		
		
			![]() Не совсем красиво, но это работает передал не как Range, а как перечисление всех нужных ячеек вот такую строчку X++: outputRangeHeader = "=\'свод\'\!R2C5\;\'свод\'\!R2C7\;\'свод\'\!R2C9\;\'свод\'\!R2C11\;\'свод\'\!R2C13\;\'свод\'\!R2C15\;\'свод\'\!R2C17\;\'свод\'\!R2C19"; exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader ); 
				__________________ 
		
		
		
		
	It's just my Unhopelessnessabilityerism   Trying to debug my mind   
			 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо. А вот мой рассказ  
		
		
		
		
		
		
		
	![]() Я собирался попробовать подсунуть такой диапазон, как если бы в Excel, держа Ctrl, щелкать мышкой по ячейкам через одну: Код:  
'код - Excel VBA
SeriesCollection.XValues = Worksheets("свод").Range("E2,G2,I2,K2,M2,O2,Q2,S2,U2")Далее я попытался "где-то сбоку" в той же строке, в подряд идущих ячейках AA2:AI2 написать формулы, ссылающиеся на разрозненные ячейки исходного диапазона: Код:  
Set cell = Worksheets("свод").Range("AA2")
For i = 22 To 15 Step -1
    cell.FormulaR1C1 = "=RC[-" & i & "]"
    Set cell = cell.Offset(0, 1)
Next i
SeriesCollection.XValues = Worksheets("свод").Range("AA2:AJ2")При попытке же переноса в Аксапту происходили какие-то странные вещи с FormulaR1C1. В ячейку AA2 по этому моему алгоритму должна была попасть формула =RC[-22], которая в ячейке преображалась в формулу A1-стиля: =E2. И при прогоне в Excel всё так и происходило. При попытке же задать формулы из Аксапты в ячейке AA2 вместо ожидаемого =E2 оказалось =IA1, что в R1C1-стиле соответствует =R1C235. Интересно, что 235 - это 257-22 (взгляните на исходную формулу =RC[-22] ). Ну, а 257 - это нечто рядом с 256. Есть ощущение, что значение в квадратных скобках, внешнее напоминающее контейнер или индекс массива, каким-то таинственным образом преображается. В общем, хочу всё это на досуге поисследовать. НО! Даже если это наконец заработает, всё равно необходим дополнительный код, объем которого будет явно не меньше кода, формирующего строку outputRangeHeader. Так что оставим в покое вопросы красивости. Ваше решение - простое, экономное и, самое главное, уже работающее.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В общем, формулы оказались ни при чем. Точнее, "при чем", но как бы не по своей воле.  
		
		
		
		
		
		
		
	Всему "виной" программное построение диаграммы, которое, как выяснилось, весьма капризно, и успешное завершение этого процесса зависит даже от последовательности операторов. Например, поменяйте местами два самых последних оператора (казалось бы, абсолютно независимых) в нижеследующем демонстрационном джобе и вы получите сообщение об ошибке. Что касается формул, то всё получилось, как хотелось, после помещения кода по их созданию перед кодом для создания диаграммы. Опять-таки, если хотите увидеть, какие с ними были проблемы, перенесите код по "организации непрерывного диапазона" в место перед оператором series.XValues (см. комментарии). X++: {
    ComExcelDocument_RU doc = new ComExcelDocument_RU();
    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    int     i;
    COM     charts;
    COM     activeChart;
    COM     rangeOutputHeader;
    COM     range;
    COM     seriesCollection;
    COM     series;
    ;
    doc.NewFile();
    wbook = doc.getComDocument();
    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();
    // генерация тестовых данных для примера
    for (i=1; i<=10; i++)
        doc.insertValue(ComExcelDocument_RU::numToNameCell(i,1), i*10);
    // тестовые значения для XValues
    for (i=5; i<=23; i+=2)
        doc.insertValue(ComExcelDocument_RU::numToNameCell(i,2), strFmt('Категория %1', i));
    // организация непрерывного диапазона в AA2:AJ2
    range = activeSheet.Range('AA2');
    for (i=22;i>=13;i--)
    {
        range.FormulaR1C1(strFmt('=RC[-%1]', i));
        range = range.Offset(0, 1);
    }
    rangeOutputHeader = activeSheet.Range('AA2:AJ2');
    // построение диаграммы
    charts = wbook.Charts();
    activeChart = charts.Add();
    activeChart.ChartType(5); // 5 = xlPie
    activeChart.SetSourceData(activeSheet.Range('A1:J1'));
    series = activeChart.SeriesCollection(1); // немного странно, что это работает, не требуя промежуточного series = seriesCollection.Item(1);
    // если организацию непрерывного диапазона перенести сюда,
    // то будут описанные выше проблемы с формулами
    series.XValues(rangeOutputHeader); // и, как хотелось, здесь Range, а не стринг
    activeChart.Location(2, activeSheet.Name()); // 2 = xlLocationAsObject
}X++: // организация непрерывного диапазона в AA2:AJ2 rangeOutputHeader = activeSheet.Range('AA2:AJ2'); rangeOutputHeader.FormulaArray('=INDEX(RC[-22]:RC[-4],{1,3,5,7,9,11,13,15,17,19})'); // построение диаграммы  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: G.Menshikh (1), kornix (1). | |