【问题标题】:Delete column based on row value根据行值删除列
【发布时间】:2018-12-08 03:16:21
【问题描述】:

我有一张包含数据的表格。我想根据行值删除列。

我的代码没有停止,当我点击转义时,它已经从我的起始列中删除了所有列。

我想检查第 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. 您的问题中有一个额外的With ws2. 您从未真正使用过With ws - 在CellsColumns.CountColumns 前面应该有句点。 3. 从最右边的列开始向左移动:For i = LR1 to 4 Step - 14Cells(2, i),不是Cells(2 & i)
  • 谢谢我试图修复它,我已经发布了修改后的代码,但现在我的代码什么也不做,这意味着在我点击运行宏后,什么也没有发生
  • Cells 前面添加一个句点 - 两次 - 和 Columns - 一次。
  • 你也错过了第 4 点。
  • 你还有一个错字——你的循环中有LR,但上面有LR1

标签: excel vba


【解决方案1】:

除了 cmets 中提出的所有要点之外,主要问题是您的循环逻辑已关闭。你的外循环应该是列,内​​循环应该是数组。但是使用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

【讨论】:

  • 你知道你和我的主要区别是什么吗?由于您的代码效果很好。我应该使用范围吗?谢谢
  • 您的循环逻辑已关闭 - 您的外循环应该是列,而内循环应该是数组。但是Select Case 将其简化为一个循环。
猜你喜欢
  • 2015-11-14
  • 2019-02-24
  • 2019-05-29
  • 2019-07-06
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多