简体   繁体   中英

VBA clear cells adjacent to the column if it is empty

I have 5 columns. If column 3 has no value, I want all other adjacent cells (column 1,2,4,5) to clear. I got this from another site:

    Sub ClearCust()
'Clears data in column if there is no Amt number next to it.
'Used in conjunction to fill blanks.
Dim j As Range
For Each j In Workbooks("OH Details_v1").Worksheets("Sheet1").Range("C2:D" & Worksheets("Sheet1").Range("a65536").End(xlUp).Row)
    If j.Value = 0 Then
        j.Offset(0, 1).ClearContents
    End If
Next j

End Sub

But it only clears column C, D, E...

Something like this might be what you're looking for:

Sub ClearCust()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rLast As Range

    'Set wb = Workbooks("OH Details_v1")
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")
    Set rLast = ws.Range("A:E").Find("*", ws.Range("A1"), xlValues, , , xlPrevious)
    If rLast Is Nothing Then Exit Sub   'No data

    With ws.Range("C1:C" & rLast.Row)
        .AutoFilter 1, "="
        Intersect(.Parent.Range("A:E"), .Offset(1).EntireRow).ClearContents
        .AutoFilter
    End With

End Sub

EDIT :

To address your request of iterating over sets of columns to perform this same task, you can do something like this:

Sub ClearCust()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rLast As Range
    Dim aClearAreas() As String
    Dim i As Long

    'Set wb = Workbooks("OH Details_v1")
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")
    ReDim aClearAreas(1 To 3, 1 To 2)
        'Define columns that will be cleared    Define column within that range to evaluate for blanks
        aClearAreas(1, 1) = "A:E":              aClearAreas(1, 2) = "C"
        aClearAreas(2, 1) = "F:J":              aClearAreas(2, 2) = "H"
        aClearAreas(3, 1) = "K:O":              aClearAreas(3, 2) = "M"

    'loop through your array that contains your clear area data
    For i = LBound(aClearAreas, 1) To UBound(aClearAreas, 1)
        'Get last populated row within the defined range
        Set rLast = ws.Range(aClearAreas(i, 1)).Find("*", ws.Range(aClearAreas(i, 1)).Cells(1), xlValues, , , xlPrevious)
        If Not rLast Is Nothing Then
            'Filter on the column to be evaluated
            With ws.Range(aClearAreas(i, 2) & "1:" & aClearAreas(i, 2) & rLast.Row)
                .AutoFilter 1, "="                                                                  'Filter for blanks
                Intersect(.Parent.Range(aClearAreas(i, 1)), .Offset(1).EntireRow).ClearContents     'Clear cells only in the defined range
                .AutoFilter                                                                         'Remove the filter
            End With
        End If
    Next i

End Sub

Your explanation and title are two different subjects but based on your explanation-i understand you want to loop through column C and if a cell is empty, then you make other cells value to blank-i wrote below code. You may use. Tested

Sub test()

Dim ws As Worksheet

Set ws = ActiveSheet

With ws

    lr = .Cells(Rows.Count, "C").End(xlUp).Row

    For i = 2 To lr
        If .Cells(i, "C") = "" Then
            .Cells(i, "A") = ""
            .Cells(i, "B") = ""
            .Cells(i, "D") = ""
            .Cells(i, "E") = ""
        End If
    Next i
End With

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM