Уже с утра мучаюсь не могу понять почему выводится ошибка "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;
}