Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2013, 15:56   #1
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию excel нельзя установить свойство FormulAarray класса Range

Уже с утра мучаюсь не могу понять почему выводится ошибка "excel нельзя установить свойство FormulAarray класса Range", может кто сталкивался? через Formula и FormulaR1C1 тоже не получается.
Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Variant varApp, varBook, varSheet, varRangeIn, varRangeOut, varDataOut, varDataIn, Range;
  int i,j;
  try
  {
	  varApp = Variant::GetActiveObject("excel.application");  //пытаемся подключиться к текущему эксэлю
  }
  catch (...) //ловим ошибки
  {
	  try
	  {
		  varApp = Variant::CreateObject("excel.application");  //не получилось подключиться, нажимаем continue и запускаем эксэль сами
	  }
	  catch(...)
	  {
		  MessageBox(Handle, "Can't open server of Excel", "Error", MB_OK||MB_ICONERROR);
		  return;
	  }
  }
  varApp.OlePropertySet("Visible",true);
  varApp.OlePropertyGet("Workbooks").OleProcedure("Add"); //загружаем коллекцию рабочих книг
  varBook = varApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1); //выбираем из коллекции 1 книгу
  varSheet = varBook.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1); // выбираем 1 лист
  varSheet.OlePropertySet("Name", "My Excel Book"); //называем его
  const int bounds[4] = {0, StringGrid1->RowCount-1, 0, StringGrid1->ColCount-1}; //границы массивов
  varDataOut = VarArrayCreate(bounds, 3, varVariant);    //создаем массив кот-ый отправляем в эксэль
  varDataIn = VarArrayCreate(bounds, 3, varVariant);    //создаем массив кот-ый отправляем из эксэля
  for (i = 0; i < StringGrid1->RowCount; ++i)
  {

	for (j = 0; j < StringGrid1->ColCount; ++j)
	{
	   varDataOut.PutElement(StringGrid1->Cells[j][i], i, j);  //заполняем массив
	}
  }
  varRangeIn = varSheet.OlePropertyGet("Range", varSheet.OlePropertyGet("Cells", 1, 1),
	varSheet.OlePropertyGet("Cells", StringGrid1->RowCount, StringGrid1->ColCount)); //выбираем диапазон ячеек
  varRangeIn.OlePropertySet("Value", varDataOut); //присваиваем значениям ячеек элементы массива
  /////////////////////////////////////////////////

  varRangeOut = varSheet.OlePropertyGet("Range", varSheet.OlePropertyGet("Cells",
	 1 + StringGrid1->RowCount, 1 + StringGrid1->ColCount),
	 varSheet.OlePropertyGet("Cells", 2*StringGrid1->RowCount, 2*StringGrid1->ColCount)); //диапазон куда запишем обратную матрицу */
  //varRangeOut.OlePropertySet("Value", varDataOut); //моё     */
/*  varRangeOut = varSheet.OlePropertyGet("Range",
  varSheet.OlePropertyGet("Cells", 1, 2 + StringGrid1->ColCount),
  varSheet.OlePropertyGet("Cells", StringGrid1->RowCount, 1 + 2*StringGrid1->ColCount));
varRangeOut.OlePropertySet("Value", varDataOut); */
  // склеиваем строки чтобы посчитать обратную матрицу для диапазона
//  UnicodeString str = "=МОБР(R1C1:R" + IntToStr(StringGrid1->RowCount) + "C" + IntToStr(StringGrid1->RowCount) + ")";
UnicodeString str = "=MINVERSE(R1C1:R" + IntToStr(StringGrid1->RowCount) + "C" + IntToStr(StringGrid1->RowCount) + ")";
  ShowMessage(str);
  // записываем в ячейки эксэля полученную матрицу

  varRangeOut.OlePropertySet("FormulaArray", str.c_str());
  //Variant cur = varSheet.OlePropertyGet("Cells", StringGrid1->RowCount + 1, 1 + StringGrid1->ColCount);
  //cur.OlePropertySet("Formula", str.c_str());

  for (i = 0; i < StringGrid1->RowCount; i++)
  {
	for (j = 0; j < StringGrid1->ColCount; j++)
	{
	   // записываем значения из диапазона ячеек в массив
	   varDataIn.PutElement(varSheet.OlePropertyGet("Cells", i+1+StringGrid1->ColCount, j+1+StringGrid1->RowCount), i, j);
	}
  }

  //////////////////////////////////////////////////////

  for (i = 0; i < StringGrid1->RowCount; i++)
  {
	for (j = 0; j < StringGrid1->ColCount; j++)
	{
	   StringGrid2->Cells[j][i] = varDataIn.GetElement(i, j); //из массива терь пишем в стринггрид
	}
  }
  varApp.OlePropertySet("DisplayAlerts", False); //отключаем предупреждения
  varApp.OleProcedure("Quit"); //выходим из эксэля
  varDataIn = Unassigned;    //"очищаем" переменные
  varDataOut = Unassigned;
  varRangeOut = Unassigned;
  varRangeIn = Unassigned;
  varSheet = Unassigned;
  varBook = Unassigned;
  varApp = Unassigned;
}
WebbMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка "1004 нельзя установить свойство xvalues класса series" Ogeris Microsoft Office Excel 2 17.01.2013 09:53
TThread. Почему нельзя выполнить start в конструкторе класса а resume можно? Человек_Борща Общие вопросы Delphi 1 09.01.2013 19:44
Установить свойство .FormulaHidden для ячейки tae1980 Microsoft Office Excel 2 09.01.2012 22:27
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
Можно ли программно установить свойство поля DisplayFormat ? М_Виктор БД в Delphi 4 12.01.2010 13:36