Макрос VBA, который фильтрует определенный столбец «U», если в столбце U есть данные или дата, он удаляет всю строку

#excel #vba

#excel #vba

Вопрос:

Я новичок в VBA, макрос. Я хочу, чтобы макрос фильтровал по столбцу «U», предпочтительно с именем столбца «Судно, отправленное из порта погрузки», если в этом столбце есть дата или данные, затем удалите всю соответствующую строку. Мои коды под ним не работают… Пожалуйста, помогите, я вставил код и экран Excel ниже для ссылки

 Private Sub CommandButton5_Click()

ActiveWorkbook.Worksheets("POL").Range("U").NumberFormat = "m/d/yyyy"
Rows(2).Select

Rows(1).AutoFilter
 
'Create a variable that = the last used row in column U
lr = Cells(Rows.Count, "U").End(xlUp).Row
 
'Create a looping variable # to go backwards from the last used Row# to 1
For i = lr To 1 Step -1
    If Cells(i, "U").Value < #1/3/2009# Or Cells(i, "U").Value > #2/3/2010# Then
        Rows(i).EntireRow.Delete shift:=xlUp
    End If
Next i

End Sub
  

Столбец Excel U

Например, если в столбце U «Судно, отправленное из порта погрузки», есть данные или дата, тогда удалите и все соответствующие строки. Вместо указания номера столбца «U» имя столбца «Судно, отправленное из порта погрузки», было бы лучше, потому что номер столбца может отличаться… пожалуйста, помогите

Ответ №1:

Я написал макрос, который удалит все, что НЕ является пустым в столбце «U» (или column21), ВКЛЮЧАЯ всю строку, в листах с именем «POL»

Основываясь на вашем описании, я бы сделал следующее:

 Option Explicit

Dim wb As Workbook

Dim sRng As Range
Dim fRng As Range

Dim cel As Range

Dim tRow As Long 
Dim fCol As Long


Sub foo()
    
    'setting wb as thisworkbook
    Set wb = ThisWorkbook
    
    'row 1 assigned into fRng(find range) object
    Set fRng = wb.Sheets("POL").Rows(1).Find(what:="Vessel Departed from Port of Loading", LookIn:=xlValues, lookat:=xlWhole)
    
    'gets fRng range object, and assigns its column property value into fCol variable
    fCol = fRng.Column
    

    'finding the last row for column 1, make sure you select a col that covers the whole data set, based on last row
    tRow = wb.Sheets("POL").Cells(Rows.Count, 1).End(xlUp).Row

    'assigning range based on col index based on str search(fCol)   total row count (tRow) in sRng range object
    With wb.Sheets("POL")
    
        Set sRng = .Range(.Cells(1, fCol), .Cells(tRow, fCol))
    
    End With
    
    'call sub deltR, the function does a filter based on range, string, and col number passed as argument.
    'passing arguments: range (sRng), delete anything not empty, on col#1 (sRng has only one range = columns("U:U"   tRow)
    Call deltR(sRng, "<>", 1)


End Sub





Private Sub deltR(ByRef sRng As Range, ByVal aStr As String, ByVal f As Integer)

    'this sub procedure looks for a string (aStr) passed in (sRng) range object range, based on col number (f)
    With sRng

        .AutoFilter field:=f, Criteria1:=aStr
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete

    End With

    wb.Sheets("POL").AutoFilterMode = False

    Set sRng = Nothing

End Sub
  

просто запустите вспомогательную процедуру «foo ()», чтобы запустить скрипт.

Я назвал лист «POL» на основе кода, который вы написали выше. Я не знаю, как структурирована ваша рабочая книга. итак, я предположил, основываясь на вашем объяснении

Попробуйте и свяжитесь со мной в комментариях, чтобы исправить возможные проблемы.

ОБНОВЛЕНИЕ: пожалуйста, проверьте еще раз, я создал дополнительный объект range, который ищет в строке 1 строку «Судно, отправленное из порта погрузки», и возвращает индекс col. Также я удалил «set wb = nothing» в конце. Я думаю, возможно, это вызвало ошибку, которую я прочитал в комментариях.

Попробуйте еще раз и, пожалуйста, дайте мне знать, если у вас есть вопросы.

Спасибо

Комментарии:

1. Отлично @Victor Song это сработало! Однако он перестал зацикливаться на «wb.Sheets («POL»).AutoFilterMode = False», в котором я дал / изменил код на «ActiveWorkbook. Worksheets («POL»).AutoFilterMode = False» после того, как это сработало правильно… Однако вместо указания номера столбца «U1: U» я хотел бы указать имя столбца, т.Е. «Судно, отправленное из порта погрузки», потому что номер столбца U1: U может отличаться, поэтому лучше указать имя столбца, на основе которого он далее удаляет данные…. Я был бы очень признателен, если бы вы могли мне помочь с этим. Еще раз спасибо.

2. Я видел в вашем описании и видел, что этот комментарий появился. Есть способ найти позицию столбца на основе строки. Если вы ищете столбец с именем «Судно, вышедшее из порта загрузки», сценарий может быть реализован. Я обновлю скрипт и отправлю его вам

3. Пожалуйста, смотрите Обновление, я создал дополнительный объект диапазона, который ищет в строке 1 строку «Судно, отправленное из порта погрузки», и возвращает индекс col. Теперь скрипт найдет столбец, содержащий «Загрузка судна (…)», выполнит поиск незаполненных полей и удалит весь поток.

4. Привет @ Victor Song Сегодня я опубликовал еще 1 запрос, с которым я борюсь… Я был бы рад, если бы вы могли проверить и помочь мне в этом… Заголовок запроса: «Фильтровать по определенному столбцу и удалять все данные с будущей датой» Спасибо