#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
Например, если в столбце 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 запрос, с которым я борюсь… Я был бы рад, если бы вы могли проверить и помочь мне в этом… Заголовок запроса: «Фильтровать по определенному столбцу и удалять все данные с будущей датой» Спасибо