c# excel определить последнюю ячейку

215
06 апреля 2018, 15:39

Есть xls файл, созданный сторонней программой. В нем 28 030 подряд вниз заполненных ячеек в столбце. Используя

excelcells = excelworksheet.get_Range("A1");
int lastRow = excelworksheet.UsedRange.Rows.Count;

получил, как и положено, lastRow = 28030; Затем в этом файле вручную удалил нижнюю часть ячеек, осталось 28 007. Все так же идущие подряд. Используя все те же строчки кода, lastRow = 28016; Пробовал несколько раз удалять (и добавлять больше, чем было) ячейки. При удалении/добавлении иногда последнюю определяет правильно, иногда нет. В других аналогичных файлах ситуация повторяется. Как же 100% правильно определить нижнюю не пустую ячейку?

Answer 1

Ответ по операторам 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

READ ALSO
Использование postcss-loader без css-loader

Использование postcss-loader без css-loader

Обратил внимание, что при выстраивании цепочки style-loader, css-loader, postcss-loader файлы стилей 2 раза прогоняется через autoprefixer (css-loader и postcss-loader)Частично...

193
Анимация пунктирной svg линии

Анимация пунктирной svg линии

Столкнулся с интересной проблемой, возможно ли сделать анимацию данной линии от начала до конца?

231
ширина блока-потомка в блоке-родителе

ширина блока-потомка в блоке-родителе

нужно чтоб блок-потомок был по ширине окна, и при этом не "ездил" при его уменшении(окна)Блок-родитель же меньше , нежели ширина окна

225
Загрузка изображений Joomla

Загрузка изображений Joomla

Необходимо выполнить загрузку с помощью Ajax изображения, но проблема в том, что даже если я не вывожу в функции модуля ничего, но возвращается...

222