laifik |
Отправлено: 22.03.2005, 11:58 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
Мне нужно определить прямоугольную область, где есть значения на листе файла Excel. Желательно, название последнего правого столбца и номер последней строки. Это вообще реально? Просмотрела кучу примеров по теме, но нигде даже намеков не нашла... |
|
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
|
Лучше позже чем никогда
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
|
Спасибо за совет. Нечто подобное я уже реализовала. |
|