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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2009, 03:57   #1
Аццкий прогер
Пользователь
 
Аватар для Аццкий прогер
 
Регистрация: 26.02.2009
Сообщений: 24
По умолчанию как узнать последнюю строку и последний столбец в xls таблице?

Здравствуйте.
Скажите пожалуйста, как узнать последнюю строку и последний столбец в xls таблице? Т.е. строку и столбец, за которыми однозначно нет никаких данных.

И ещё вопрос: как узнать, является ли ячейка объеденённой и какие ячейки объеденены?

Спасибо.
Может быть когда-нибудь я кому-нибудь в чём-нибудь и помогу...
Аццкий прогер вне форума Ответить с цитированием
Старый 26.02.2009, 04:26   #2
Ramires
Пользователь
 
Аватар для Ramires
 
Регистрация: 23.07.2008
Сообщений: 69
По умолчанию

Ну вот быстрый ответ на то как узнать последний столбец/строку:
Просто проверять в цикле пустоты, скажем так нашли строку, за ней проверяем есть ли что то в ячейках, а если ситуация такая что могут встретится пустые строки (разрывы), то и проверить скажем еще 100 строк на пустоту, со столбцами так же..
I like beer.. more beer..
Ramires вне форума Ответить с цитированием
Старый 26.02.2009, 08:15   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Пробуй так ...
Код:
WorkBk := XLApp.WorkBooks.Item[1];// первая книга в сервере 
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; // первый лист в первой книге
WorkSheet.Cells.SpecialCells($0000000B, EmptyParam).Activate;// ... активируем последнюю непустую ячейку 
X := XLApp.ActiveCell.Row; // Получаем значение последней заполненной строки
Y := XLApp.ActiveCell.Column; // Получаем значение последней заполненной колонки
здесь :
X, Y : Integer;
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;

P.S. Это все актуально если пользоваться компонентом TExcelApplication из палитры Servers
"Заряженному танку в дуло не смотрят" @Dekmer in WoT

Последний раз редактировалось Kotofff; 26.02.2009 в 08:17.
Kotofff вне форума Ответить с цитированием
Старый 26.02.2009, 08:42   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Можно и без активации последней ячейки:
Код:
WorkBk := XLApp.WorkBooks.Item[1];// первая книга в сервере
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; // первый лист в первой книге
LastRowNumber := WorkSheet.Cells.SpecialCells(11, EmptyParam).Row;// ... номер последней используемой строки
LastColumnNumber := WorkSheet.Cells.SpecialCells(11, EmptyParam).Column;// ... номер последнего используемого столбца
Цитата:
как узнать, является ли ячейка объеденённой и какие ячейки объеденены?
Тут только один способ - в цикле перебирать на нужном листе все ячейки (или ячейки определённого диапазона), и у каждой из ячеек проверять свойство .MergeArea.Cells.Count
Если значение этого свойства больше 1, значит, ячейка объединённая.

На Delphi написать пример не могу, но на VBA будет так:
Код:
Sub ПоискОбъединённыхЯчеек()
    Dim cell As Excel.Range
    For Each cell In Worksheets(1).UsedRange.Cells
        If cell.MergeArea.Cells.Count > 1 Then Debug.Print "Ячейка " & cell.Address & " входит в состав объединённой ячейки"
    Next
End Sub
Не забывайте, что перебирать надо не все ячейки на листе (Worksheets(1).Cells) - цикл займёт очень много времени, а только ячейки используемой области листа - Worksheets(1).UsedRange.Cells (так будет намного быстрее)
EducatedFool вне форума Ответить с цитированием
Старый 26.02.2009, 14:34   #5
Аццкий прогер
Пользователь
 
Аватар для Аццкий прогер
 
Регистрация: 26.02.2009
Сообщений: 24
Хорошо

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно и без активации последней ячейки:
Код:
WorkBk := XLApp.WorkBooks.Item[1];// первая книга в сервере
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; // первый лист в первой книге
LastRowNumber := WorkSheet.Cells.SpecialCells(11, EmptyParam).Row;// ... номер последней используемой строки
LastColumnNumber := WorkSheet.Cells.SpecialCells(11, EmptyParam).Column;// ... номер последнего используемого столбца
Большое спасибо! Для моей задачи это подойдёт.
Но у этого метода есть один недостаток:
Допустим если в таблице заполнены ячейки А1:В5, а ячейка С10 без данных, но имеет форматирование, то этот метод найдёт именно ячейку С10.
Может быть когда-нибудь я кому-нибудь в чём-нибудь и помогу...
Аццкий прогер вне форума Ответить с цитированием
Старый 26.02.2009, 15:12   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Допустим если в таблице заполнены ячейки А1:В5, а ячейка С10 без данных, но имеет форматирование, то этот метод найдёт именно ячейку С10.
С этим будет чуть сложнее.
Во-первых, если в таблице заполненные строки идут подряд, можно попробовать получить адрес заполненного диапазона так:
Код:
    CurrentRegionAddress = Worksheets(1).Cells(1, 1).CurrentRegion.Address
    LastRow = Worksheets(1).Cells(1, 1).CurrentRegion.Rows.Count
    LastColumn = Worksheets(1).Cells(1, 1).CurrentRegion.Columns.Count
    Debug.Print LastRow, LastColumn
Но для этого надо точно знать, что все строки после ячейки (1, 1) на этом листе заполнены.
(если 3-я строка, к примеру, пустая, данный метод даст неверный ответ)


Корректно определить последнюю строку и столбец можно только так:
(пример опять на VBA, но перевести его, думаю, проблем не составит)
Код:
Sub test()
    Dim ra As Excel.Range, Item as Excel.Range
    Set ra = Worksheets(1).Cells.SpecialCells(2)    ' возвращает все ячейки со значениями
    LastRow = 0: LastColumn = 0

    For Each Item In ra.EntireRow.Rows
        If Item.Row > LastRow Then LastRow = Item.Row
    Next Item

    For Each Item In ra.EntireColumn.Columns
        If Item.Column > LastColumn Then LastColumn = Item.Column
    Next Item

    Debug.Print LastRow, LastColumn
End Sub

Последний раз редактировалось EducatedFool; 26.02.2009 в 15:32.
EducatedFool вне форума Ответить с цитированием
Старый 08.10.2009, 12:04   #7
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Корректно определить последнюю строку и столбец можно только так:
(пример опять на VBA, но перевести его, думаю, проблем не составит)
К сожалению, проблем не составит только у тех, у кого Delphi версии позднее 2005. В предыдущих версиях нет конструкции For each....

Может кто-нибудь знает как быть?
Краткость - сестра таланта.
Л.Н.Толстой
Pitonio вне форума Ответить с цитированием
Старый 06.12.2010, 12:58   #8
ivanes
Новичок
Джуниор
 
Регистрация: 15.10.2010
Сообщений: 1
По умолчанию

k = .Cells(1, .Columns.Count).End(xlToLeft).Colum n
ivanes вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как игнорироть последний символ переход на новую строку Rustik2 Общие вопросы C/C++ 11 08.11.2009 23:09
Как найти последнюю строку Листа? Stilet Microsoft Office Excel 6 13.10.2009 14:33
Как закрепить верхюю строку или левый столбец MiroslavHerhardt Microsoft Office Excel 3 16.08.2009 14:09
Как найти последнюю запись в таблице? dsapa Microsoft Office Excel 2 21.07.2009 16:37
Удалить последнюю строку из файла Flame_of_Death Помощь студентам 6 21.07.2009 13:48