Excel VBA - 删除范围内的每第3列和第4列

问题描述:

试图找出如何删除范围内的每第3列和第4列。Excel VBA - 删除范围内的每第3列和第4列

我知道我可以在范围内删除列有:

Columns("C:E").EntireColumn.Delete

但无法弄清楚如何删除只有每3楼和4 ...

+0

“C; E”引用与您的标题不匹配的第3,4和5列。删除第3列和第4列后,第5列变为第3列。您可能需要从右边开始,并在删除时向左移动,以便列数没有变化或向右移动,以便列数已更改。你怎么知道要删除的最右边一列?您可以使用数字而不是字母来识别列,以便可以轻松设置合适的循环。 –

+2

您是否想要删除每个第3列和第4列(即列3,4,6,8,9,12,15,16,18,20,21,24等)或第3列和第4列4列组(即3,4,7,8,11,12,15,16,19,20,23,24等栏)? – YowE3K

如先前通过@ YowE3K提到的,如果要求是目前尚不清楚:

  1. 删除每列是多个3或4(即列3,4,6,8,9,12,15,16,18,20,21,24等)或
  2. 删除每列4列中的第3列和第4列(即列3,4,7 ,8,11,12,15,16,19,20,23,24等)。

所以我对每一种情况下提供分离的解决方案:

这些解决方案的工作UsedRange是符合要求内删除一次所有列。

1.Delete每列,它是3的倍数或4

Sub Delete_Every_Column_Multiple_Of_3_or_4() 
Dim rTrg As Range, iLstCol As Integer, i As Integer 
    With ThisWorkbook.Sheets("Sht(1)") 'Change as required 
     iLstCol = .UsedRange.SpecialCells(xlLastCell).Column 
     For i = 1 To iLstCol 
      If i <> 1 And (i Mod 3 = 0 Or i Mod 4 = 0) Then 
       If rTrg Is Nothing Then 
        Set rTrg = .Columns(i) 
       Else 
        Set rTrg = Union(rTrg, .Columns(i)) 
     End If: End If: Next 
     rTrg.EntireColumn.Delete 
    End With 
End Sub 

2.删除第三和第四列中的每个组4列

Sub Delete_3rd_And_4th_Column_in_Every_Group_of_Four() 
Dim rTrg As Range 
Dim iLstCol As Integer 
Dim i As Integer 
    With ThisWorkbook.Sheets("Sht(2)") 'Change as required 
     iLstCol = .UsedRange.SpecialCells(xlLastCell).Column 
     For i = 1 To iLstCol 
      If i Mod 4 = 0 Or i Mod 4 = 3 Then 
       If rTrg Is Nothing Then 
        Set rTrg = .Columns(i) 
       Else 
        Set rTrg = Union(rTrg, .Columns(i)) 
     End If: End If: Next 
     rTrg.EntireColumn.Delete 
    End With 
End Sub 
的在之前

enter image description here 列两种情况下。

enter image description here 之后的列都是这两种情况。

下面的代码删除每一个第三和第四在 “工作表Sheet1” 列(根据自己的需要修改表的名字):

Option Explicit 

Sub DeleteEvery_ThirdFourthCol() 

Dim LastCol As Long 
Dim Col As Long 

' modify "Sheet1" to your sheet's name 
With Sheets("Sheet1")  
    ' find last column with data in row 1 > modify to your needs 
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 

    ' loop columns backwards when deleting 
    For Col = LastCol To 1 Step -1 
     If Col Mod 3 = 0 Or Col Mod 4 = 0 Then 
      .Range(.Cells(1, Col), .Cells(1, Col)).EntireColumn.Delete 
     End If 
    Next Col    
End With 

End Sub 
+0

我假设OP希望从第一列开始(每隔三分钟表示日常使用的语言),并且您的代码也可以从第二列或第三列开始。莫弗,我不认为所有非空列都必须考虑,但目标范围的列。 – z32a7ul

Public Sub DeleteEveryThirdColumn() 
    Const EveryN As Long = 3 
    Dim rng As Range: Set rng = ActiveSheet.Range("C:F") 
    Dim c As Long: For c = ((rng.Columns.Count - 1) \ EveryN) * EveryN + 1 To 1 Step -EveryN 
     rng.Columns(c).Delete 
    Next c 
End Sub