link10224 link10225 link10226 link10227 link10228 link10229 link10230 link10231 link10232 link10233 link10234 link10235 link10236 link10237 link10238 link10239 link10240 link10241 link10242 link10243 link10244 link10245 link10246 link10247 link10248 link10249 link10250 link10251 link10252 link10253 link10254 link10255 link10256 link10257 link10258 link10259 link10260 link10261 link10262 link10263 link10264 link10265 link10266 link10267 link10268 link10269 link10270 link10271 link10272 link10273 link10274 link10275 link10276 link10277 link10278 link10279 link10280 link10281 link10282 link10283 link10284 link10285 link10286 link10287 link10288 link10289 link10290 link10291 link10292 link10293 link10294 link10295 link10296 link10297 link10298 link10299 link10300 link10301 link10302 link10303 link10304 link10305 link10306 link10307 link10308 link10309 link10310 link10311 link10312 link10313 link10314 link10315 link10316 link10317 link10318 link10319 link10320 link10321 link10322 link10323 link10324 link10325 link10326 link10327 link10328 link10329 link10330 link10331 link10332 link10333 link10334 link10335 link10336 link10337 link10338 link10339 link10340 link10341 link10342 link10343 link10344 link10345 link10346 link10347 link10348 link10349 link10350 link10351 link10352 link10353 link10354 link10355 link10356 link10357 link10358 link10359 link10360 link10361 link10362 link10363 link10364 link10365
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