根据条件删除特定的列

问题描述:

我目前正在尝试制作一个程序,它接受用户输入并将这些值存储在名为FastenerNumbers的数组中。基于这些值,程序然后用绿色填充特定的单元格,以便用户知道在那里输入值。问题是如果数组中的值是0我想删除该列,以便工作表更清晰。根据条件删除特定的列

我遇到的问题是,当在for循环中删除列时,单元格向左移动。由于这一些细胞基本上被跳过。为了抵消这一点,我基本上不得不暴力强制该程序,以便循环多次来解决任何跳过的列。

下面的代码:

'Make cells green for user to put inputs into 
For i = 0 To UBound(FastenerNumbers) 
    If FastenerNumbers(i) <> 0 Then 
     With Range(Range("A14").Offset(0, 2 * i), Range("A14").Offset(FastenerNumbers(i) - 1, (2 * i) + 1)) 
      .Borders.LineStyle = xlContinuous 
      .Interior.ColorIndex = 4 
     End With 
    End If 
Next 

'Define initial counter variable 
j = 1 

' Do Until j = 5 
'  For i = 0 To UBound(FastenerNumbers) 
'   If FastenerNumbers(i) = 0 Then 
'    Range(Range("A14").Offset(0, 2 * i), Range("A14").Offset(FastenerNumbers(i) - 1, (2 * i) + 1)).EntireColumn.Delete 
'   End If 
'  Next 
' Loop 
' 

Do 
    For Each cell In Range("A14", Range("A14").Offset(, (UBound(FastenerNumbers) + 1) * 2)) 
     If cell.Interior.ColorIndex <> 4 Then 
      cell.EntireColumn.Delete 
     End If 
     j = j + 1 
     If j >= (5 * (UBound(FastenerNumbers) + 1) * 2) Then 
      Exit Do 
     End If 
    Next 
Loop 

中的伪是另一种方法,我打算用。我不认为任何一种方法都比另一种更好。我希望循环更清洁,更高效。

+0

代替删除列,只是隐藏它?编辑:或向后循环? – findwindow

它那样简单具有一个单独的变量(j)计数有效FastenerNumbers() valueslike的数量如下

'Make cells green for user to put inputs into 
For i = 0 To UBound(FastenerNumbers) 
    If FastenerNumbers(i) <> 0 Then 
     With Range(Range("A14").Offset(0, 2 * j), Range("A14").Offset(FastenerNumbers(i) - 1, (2 * j) + 1)) ' use j as the column relevant variable 
      .Borders.LineStyle = xlContinuous 
      .Interior.ColorIndex = 4 
     End With 
     j = j + 1 'update column relevant variable 
    End If 
Next 
+0

这似乎是做我想要的感谢!我目前在代码的单独部分中有列标题,所以我将不得不修复其他一些问题。当我最后修改我的代码时,我会将其更改为此,以便它可以更快地运行。 – Asparagus

+0

不客气 – user3598756

我没有测试过,所以不完全确定它的工作原理,但给了这个镜头。本质上,它保持For环路内的一切,并且如果FastenerNumbers(i) = 0,那么它会删除所述柱,减少i由1,然后继续到下一个(在这种情况下,相同的编号):

For i = 0 To UBound(FastenerNumbers) 
    If FastenerNumbers(i) <> 0 Then 
     With Range(Range("A14").Offset(0, 2 * i), Range("A14").Offset(FastenerNumbers(i) - 1, (2 * i) + 1)) 
      .Borders.LineStyle = xlContinuous 
      .Interior.ColorIndex = 4 
     End With 
    Else 
     Range(Range("A14").Offset(0, 2 * i), Range("A14").Offset(FastenerNumbers(i) - 1, (2 * i) + 1)).EntireColumn.Delete 
     i = i - 1 
    End If 
Next 
+0

只是试了一下。我看到它背后的逻辑。似乎i-1不断重置它,以至于它无限循环。 – Asparagus

+0

这实际上是有道理的,因为它正在查看数组中的值,并且被删除的列不会更改数组中的值。你可以在'Else'语句中添加一些从数组中删除特定值的东西。关闭我的头顶不知道你会怎么去,虽然 –

+0

哦,这是有道理的。我不是100%确定如何做到这一点。 – Asparagus