Есть xls файл, созданный сторонней программой. В нем 28 030 подряд вниз заполненных ячеек в столбце. Используя
excelcells = excelworksheet.get_Range("A1");
int lastRow = excelworksheet.UsedRange.Rows.Count;
получил, как и положено, lastRow = 28030; Затем в этом файле вручную удалил нижнюю часть ячеек, осталось 28 007. Все так же идущие подряд. Используя все те же строчки кода, lastRow = 28016; Пробовал несколько раз удалять (и добавлять больше, чем было) ячейки. При удалении/добавлении иногда последнюю определяет правильно, иногда нет. В других аналогичных файлах ситуация повторяется. Как же 100% правильно определить нижнюю не пустую ячейку?
Ответ по операторам VBA-Excel. Похоже, рекомендации применимы и к этому вопросу.
UsedRange - пользовательский диапазон. Но он может начинаться не с первой строки на листе и заканчиваться не последней строкой с даными. Это диапазон, в котором производились какие-либо действия.
На новом листе в строке 5 рисуем шапку таблицы, вносим 10 строк данных. В данном случае UsedRange.Rows.Count = 11 (10 строк + заголовки).
Удаляем данные из последней строки. Диапазон не изменился - последняя строка в диапазоне пользователя.
Удаляем последнюю строку таблицы. И? Нет, в диапазоне пользователя по прежднему 11 строк. А вот если после удаления строки сохранить изменения - UsedRange.Rows.Count = 10. Наконец-то избавились... Если же сохраниться после удаления данных, то не факт, что диапазон уменьшится - ячейки отформатированы.
Еще ситуация. Копирование из другой таблицы. Копируют не глядя - Copy/Paste целыми столбцами. И часто-густо книга с данными в сотню строк имеет мегабайтный вес. Причина? Копировалось все, в том числе и форматы нижних строк, в которых данных нет, но с которыми раньше усиленно работали.
Последняя рабочая строка на листе с учетом возможных незадействованных строк сверху:
With excelworksheet
LastRow = .UsedRange.Rows.Count + .UsedRange.Row - 1
End With
Для примера с таблицей: 11 + 5 - 1 = 15 Следует помнить, что будут учтены и форматированные строки (вернее: строки с форматированными ячейками) без данных.
Последнюю строку с данными можно определять другим способом:
With excelworksheet
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
Здесь единичка - столбец А (можно писать имя столбца - "A").
Этот метод тоже имеет недостаток. Так определится последняя ячейка с данными, но в отображаемых строках. Если на листе применен фильтр и посление строки с данным скрыты, LastRow покажет меньшее число.
Если заранее неизвестно, будут ли пустые форматированные ниже диапазона с данными и будут ли скрытые строки, можно задействовать один из вариантов:
определить нижнюю строку UsedRange, в цикле проверить наличие данных и найти последнюю заполненную ячейку;
принудительно отобразить все строки и применить End(xlUp).Row
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Обратил внимание, что при выстраивании цепочки style-loader, css-loader, postcss-loader файлы стилей 2 раза прогоняется через autoprefixer (css-loader и postcss-loader)Частично...
Столкнулся с интересной проблемой, возможно ли сделать анимацию данной линии от начала до конца?
нужно чтоб блок-потомок был по ширине окна, и при этом не "ездил" при его уменшении(окна)Блок-родитель же меньше , нежели ширина окна
Необходимо выполнить загрузку с помощью Ajax изображения, но проблема в том, что даже если я не вывожу в функции модуля ничего, но возвращается...