根据条件删除特定列

时间:2016-04-22 18:54:40

标签: vba excel-vba excel

我目前正在尝试创建一个程序,该程序接受用户输入并将值存储在名为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

伪代码是我将要使用的另一种方法。我认为这两种方法都不比另一种明显好。我希望循环更清洁,更高效。

2 个答案:

答案 0 :(得分:1)

我还没有对此进行过测试,因此不能完全确定它有效,但请试一试。从本质上讲,它将所有内容保留在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

答案 1 :(得分:1)

就像有一个单独的变量(j)计算有效FastenerNumbers()值的数量一样简单

'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