C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сколько строк на листе Excel
laifik
  Отправлено: 22.03.2005, 11:58


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Мне нужно определить прямоугольную область, где есть значения на листе файла Excel. Желательно, название последнего правого столбца и номер последней строки. Это вообще реально? Просмотрела кучу примеров по теме, но нигде даже намеков не нашла... wink.gif
Rius
Отправлено: 22.03.2005, 19:23


Мастер участка

Группа: Участник
Сообщений: 321



Есть мысль — записать в Excel глобальный макрос, вычисляющий границы и вызывать его из билдера.
как реализовать — незнаю, с макросами пока не работал.
laifik
Отправлено: 23.03.2005, 09:22


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Нашла такое решение:
CODE
int X, Y;
Variant EmptyPar=False;
// Чтобы узнать размер листа(WorkSheet), т.е. количество строк и количество
// столбцов, мы активируем его последнюю непустую ячейку
vVarSheet.OlePropertyGet("Cells").OleFunction("SpecialCells",xlCellTypeLastCell,EmptyParam).OleProcedure("Activate");
// Получаем значение последней строки
X = vVarSheet.OlePropertyGet("Cells").OleFunction("SpecialCells", xlCellTypeLastCell).OlePropertyGet("Row");
// Получаем значение последней колонки
Y = vVarSheet.OlePropertyGet("Cells").OleFunction("SpecialCells", xlCellTypeLastCell).OlePropertyGet("Column");

Но результат странен. Получается кол-во строк 1089, а столбцов 121.
Почему выбирается эта ячейка? Она очень далеко находится от ячейки, на которой расположено последнее значение на листе. Или может смысл фразы "размер листа" совсем другой? И он не имеет отношения к размещению данных?
AVC
Отправлено: 23.03.2005, 09:53


Ветеран

Группа: Модератор
Сообщений: 1583



Лучше позже чем никогда smile.gif
CODE

// где то отктрыт WorkBook
XLSheets = XLWBook.OlePropertyGet("Worksheets");
XLSheet = XLSheets.OlePropertyGet("Item",1);

MSExcel.OlePropertySet("WindowState", long(xlMaximized));
MSExcel.OlePropertySet("Visible", true);

XLSheet.OleProcedure("Activate");

// запомнить текущую позицию (можно через Range???)
int row_cur = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
int col_cur = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Column");

// стать на последнюю известную
XLSheet.OlePropertyGet("Cells").OlePropertyGet("SpecialCells",xlCellTypeLastCell).OleProcedure("Activate");

// получить значения
int row_last = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
int col_last = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Column");

// вернуться к старым
XLSheet.OlePropertyGet("Cells", row_cur, col_cur).OleProcedure("Activate");

ShowMessage(AnsiString(col_last) + ":" + AnsiString(row_last));


Большие значения получаются из-за того, что когда то эти клетки были активизированы. Но с этим придется мириться — с Excell спорить трудно.
PS. Лучше иметь большИе значения чем меньшИе. Я то же поличил 121:1089

Отредактировано AVC — 23/03/2005, 08:54
Aptem
Отправлено: 28.03.2005, 14:19


Мастер участка

Группа: Участник
Сообщений: 349



Можно сделать так.

Пробежаться по каждому столбцу (по каждой ячейке) и сравнивать ее значение с пустой строкой (""), как только количество таких ячеек привысит, например 20, то можно сказать, что ниже этих ячеек ничего нет, соответственно количество непустых ячеек равно текущая_ячейка — 20.

Надеюсь понятно.
laifik
Отправлено: 29.03.2005, 09:32


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Спасибо за совет. Нечто подобное я уже реализовала. smile.gif

Вернуться в Вопросы программирования в C++Builder