Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Удаление пустых строк после обновления., VBA
 
Добрый день.
Таблица после обновления сократилась в строках. Но в окне immediate видно  (sheets(1).usedrange.rows.select), что её размеры сохранились.
Решил почистить отработанные строки, т.е. удалить разность между usedrange - cells(rows.Count,2).end(xlup).row
Пищу  rows(cells(rows.Count,2).end(xlup).row+1&":"&sheets(1).usedrange.rows.count).delete Shift:=xlUp, но орфографию макросов слабо пока понимаю, поэтому не могу составить диапазон удаляемых строк.
Подскажите, люди добрые, где ошибаюсь?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Здравствуйте, Владимир. Думаю так:
Код
 rows(cells(rows.Count,2).end(xlup).row+1 & ":" & cells.SpecialCells(xlCellTypeLastCell).Row).delete Shift:=xlUp
ПС Только после этого придётся сохранить файл, чтобы используемый диапазон был без крайних пустот.
Изменено: JayBhagavan - 28 Авг 2015 10:56:09

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
что-то туплю. может, так?
Код
With Sheets(1)
.Rows((.Cells(.Rows.Count,2).End(xlup).Row+1) & ":" & .UsedRange.Rows(.UsedRange.Rows.Count).Row).Delete Shift:=xlUp
End With
F1 творит чудеса
 
Доброе время суток
А если UsedRange начинается не с первой строки листа?
Код
    Dim LRow As Long, LTableRow As Long
    LRow = Sheets(1).UsedRange.Rows.Count + Sheets(1).UsedRange.Row - 1
    LTableRow = Sheets(1).Cells(Sheets(1).Rows.Count, 2).End(xlUp).Row + 1
    If LRow >= LTableRow Then Sheets(1).Rows(CStr(LTableRow) & ":" & CStr(LRow)).EntireRow.Delete Shift:=xlUp
 
Код
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Удалит строки с пустыми ячейками в столбце А
 
Я пробовал Range([a2], [a2].SpecialCells(xlLastCell)), но эта строка также выделяла диапазон как usedrange до обновления, т.е. с отработанными строками. Но у Вас, JayBhagavan, всё правильно сработало.  Спасибо.
--------------
Максим, спасибо. Непонятен этот диапазон в диапазоне - sheets(1).UsedRange.Rows(sheets(1).UsedRange.Rows.Count).Row)
-------------
Андрей спасибо. Мне Ваш вариант понравился.
-------------
Виктор, спасибо.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Цитата
Владимир написал:
Непонятен этот диапазон в диапазоне - Sheets(1).UsedRange.Rows(Sheets(1).UsedRange.Rows.Count).Row)
берем строку использованного диапазона с индексом, равным количеству строк в диапазоне (т.е. последнюю строку использованного диапазона), и возвращаем ее номер.
F1 творит чудеса
 
Цитата
JayBhagavan написал: .row+1 & ":" & ce
Я привык, что пробелы автоматом подставляются, а тут оказывается вручную нужно.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, да, надо самому, т.к. символ & после переменной означает, что она типа Long.
сокращ. обознач. типа

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Максим Зеленский написал: и возвращаем ее номер
Допустим UsedRange.select выделит диапазон а2:c20, из которых а18:c20 пусто, т.е. нам нужно rows("18:20").delete. А UsedRange.Rows.row показывает 2 - начало таблицы?
Вот и непонятно, как при  таких данных  - начало таблицы и кол-во строк "грязной" таблицы вычислить разницу удаляемого.
 
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
UsedRange - такой же Range, как и остальные. Чтобы узнать его последнюю строку, можно изгаляться так, как я:
Код
Set rng = Sheets(1).Range("A2:C20") ' это вместо UsedRange
RowsNum = rng.Rows.Count '- количество строк в rng. Если UsedRange A2:C20 - то в нем будет 19 строк.
rng.Rows(RowsNum) '- это 19-я (последняя) строка в UsedRange
rng.Rows(RowsNum).Row '- номер (фактический) этой последней строки.

Или найти номер первой строки UsedRange, добавить к нему количество строк в UsedRange, минус 1.
Андрей VG предложил именно этот вариант, плюс в его коде есть проверка на то, в какую сторону изменился (и изменился ли) фактический размер таблицы. Так что лучше его вариант пользуйте.
F1 творит чудеса
Страницы: 1
Читают тему (гостей: 1)
Наверх