Удалить столбец на основе значения строки - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть лист с данными.Я хочу удалить столбцы на основе значения строки.

Мой код не останавливается, и когда я нажимаю escape, он удаляет все столбцы из моих начальных столбцов.

Я хочупроверьте значения в строке 2 от столбца D до последнего использованного столбца (у меня сейчас около 100 столбцов), чтобы, если они содержат C15, C17 и т. д., ничего не делали, иначе удалите столбцы.

У меня только 40k строк.Мой диапазон, столбец и строка будут расширяться каждую неделю, поэтому я хочу использовать VBA для сокращения времени форматирования.

Sub test()
'start
Dim LR1 As Long
Dim i As Long
Set ws = ThisWorkbook.ActiveSheet

With ws
    LR1 = .Cells(2, .Columns.Count).End(xlToLeft).Column   
    Dim arr As Variant
    Dim x
    arr = Array("C15", "C17", "C19", "C20", "C21", "C22", "C23", "C24", "C25", "C28", "C29", "C30", "C32")

    For x = LBound(arr) To UBound(arr)
        For i = LR1 To 4 Step -1
            If .Cells(2, i).Value = arr(x) Then
            Else
                .Columns(i).Delete
            End If
        Next i
    Next x
End With
End Sub

1 Ответ

0 голосов
/ 08 декабря 2018

Помимо всех замечаний, высказанных в комментариях, основной проблемой является то, что ваша логика зацикливания отключена.Ваш внешний цикл должен быть столбцами, а внутренний цикл должен быть массивом.Но с Select Case это все равно можно упростить до одного цикла.

Возможно, что-то вроде этого:

Option Explicit

Sub Test()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.ActiveSheet

    With ws
        Dim lastCol As Long, i As Long
        Dim rng As Range

        lastCol = .Cells(2, .Columns.Count).End(xlToLeft).Column

        For i = lastCol To 4 Step -1
            Select Case .Cells(2, i).Value
                Case "C15", "C17", "C19", "C20", "C21", "C22", "C23", "C24", "C25", "C28", "C29", "C30", "C32"
                    ' keep
                Case Else
                    If rng Is Nothing Then
                        Set rng = .Columns(i)
                    Else
                        Set rng = Union(rng, .Columns(i))
                    End If
            End Select
        Next i

        If Not rng Is Nothing Then
            rng.Delete
        End If
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...