Удаление пустых записей из таблицы с помощью VBA

#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 , чтобы играть с кодом много раз, без необходимости вставлять несколько пустых строк.