#excel #vba
Вопрос:
У меня есть таблица входных данных, на которой я выполняю вычисления. Наличие пустых строк в этой таблице влияет на вычисления. Прямо сейчас у меня есть макрос, который сортирует таблицу каждый раз, когда вносятся какие-либо изменения, из-за чего все пустые строки собираются в нижней части таблицы. Поэтому мне просто нужно вручную изменять размер таблицы перед каждым вычислением.
Здесь вы можете увидеть пустую строку в нижней части таблицы. Я не знаю, как его удалить, чтобы таблица заканчивалась последней непустой записью
Но я хочу знать, есть ли способ привязать сетку таблицы к последней непустой строке с помощью VBA и удалить пустые строки из таблицы. Спасибо!
Комментарии:
1. Не могли бы вы, пожалуйста, опубликовать свой код, чтобы узнать, что вы сделали до сих пор и с какими проблемами столкнулись?
2. @Bharat Остальная часть кода делает то, что она должна делать. Я добавил скриншот таблицы, чтобы показать вам, что я хочу, чтобы она делала. Я не написал для этого никакого кода, потому что не знаю, как этого достичь.
3. посмотрите, поможет ли опубликованный анализатор
Ответ №1:
Вот функция VBA, которая удалит пустые строки
Public Sub DeleteBlankRows()
Dim LastRowIndex As Integer
Dim RowIndex As Integer
Dim UsedRng As Range
Set UsedRng = ActiveSheet.UsedRange
LastRowIndex = UsedRng.Row - 1 UsedRng.Rows.Count
Application.ScreenUpdating = False
For RowIndex = LastRowIndex To 1 Step -1
If Application.CountA(Rows(RowIndex)) = 0 Then
Rows(RowIndex).Delete
End If
Next RowIndex
Application.ScreenUpdating = True
End Sub
Вот пример
Комментарии:
1. это приведет к удалению даже тех данных, которые не отсортированы
Ответ №2:
Удаление пустых строк в таблице Excel
- Нет необходимости сортировать таблицу, если вы этого не хотите.
Option Explicit
Sub DeleteTableBlankRows()
With Sheet1.ListObjects(1).DataBodyRange
Dim cCount As Long: cCount = .Columns.Count
Dim drg As Range ' Delete Range
Dim rrg As Range ' Row Range
For Each rrg In .Rows
If Application.CountBlank(rrg) = cCount Then
If drg Is Nothing Then
Set drg = rrg
Else
Set drg = Union(drg, rrg)
End If
End If
Next rrg
If Not drg Is Nothing Then
drg.Delete
End If
End With
End Sub
Ответ №3:
Пожалуйста, используйте следующий Sub
. Он удалит все пустые строки таблицы после фильтрации. Я имею в виду последние (пустые) :
Private Sub deleteTableEmptyRows(Optional TblD As Range) 'calculate table last empty rows
Dim lastShER As Long, lastShTblR As Long, lastTblER As Long, lastTblR As Long
If TblD Is Nothing Then Set TblD = ActiveSheet.ListObjects(1).DataBodyRange
lastShER = TblD.cells(TblD.rows.count, 1).End(xlUp).row 1 'last empty row on the sheet (no needed, only to demonstrate how to calculate)
lastTblER = lastShER - (TblD.row - 1) 'last empty row on the table DataBodyRange
lastShTblR = TblD.rows.count TblD.row 'last table row on the sheet
lastTblR = lastShTblR - TblD.row 'last table row
If lastTblER > 1 Then TblD.rows(lastTblER amp; ":" amp; lastTblR).Select 'please, change Select with Delete, only after checking that selected range is as you need
End Sub
Это можно назвать так:
Sub testDeleteTableEmptyRows()
Dim TblD As Range
Set TblD = ActiveSheet.ListObjects(1).DataBodyRange 'use here the table name (or index)
deleteTableEmptyRows TblD
End Sub
Комментарии:
1. Еще раз здравствуйте! Спасибо за ответ, я думаю, что могу понять, как это будет работать, но у меня небольшие проблемы с пониманием переменных даже с комментариями, извините. Не могли бы вы, пожалуйста, рассказать мне, какое значение было бы для каждой переменной на скриншоте, которым я поделился, если таблица варьируется от строки 2 до строки 6. Еще раз спасибо!
2. @Wren Я бы сделал это, если бы твоя фотография была красноречивой… Я не могу видеть заголовки столбцов и строк листа, поэтому я не знаю, начинается ли обсуждаемая таблица с первой строки, первого столбца или нет. Вот почему мой код может работать с таблицей, расположенной в любом месте листа. Вот почему я сохранил две ненужные переменные только для того, чтобы показать вам механизм вычисления строк. Можете ли вы указать, что выглядит неясным в приведенном выше коде, прокомментировав все соответствующие строки… И я постараюсь быть более точным.
3. моя вина, я внес правки. Таким образом, таблица колеблется от строки 2 до строки 7, когда мне нужно, чтобы она заканчивалась в строке 6.
4. @Wren Я бы предложил вам последний способ тестирования, обучения: Сделайте окно VBE (Visual Basic для редактора приложений) меньше, чтобы видеть таблицу на листе. Щелкните внутри
testDeleteTableEmptyRows
под кода и нажмитеF8
, чтобы выполнить код строка за строкой. Когда код достигнет функциональных строк, наведите курсор на каждую переменную, чтобы увидеть ее значение. Сначала вы увидите номер первой пустой строки листа, затем первую пустую строку таблицы DataBodyRange, за которой следует последняя строка таблицы на листе (в вашем случае 7) и последняя строка DataBodyRange. Вы также можете вставитьDebug.Print lastShER
или другую переменную.5. @Wren Я попробую прокомментировать код и, по причине тестирования , заменить
Delete
наSelect
, чтобы играть с кодом много раз, без необходимости вставлять несколько пустых строк.