Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据条件删除特定列_Vba_Excel - Fatal编程技术网

Vba 根据条件删除特定列

Vba 根据条件删除特定列,vba,excel,Vba,Excel,我目前正在尝试制作一个程序,它接受用户输入并将值存储在一个名为FastenerNumbers的数组中。基于这些值,程序然后用绿色填充特定单元格,以便用户知道在那里输入值。问题是,如果数组中的值为0,我希望删除该列,以便工作表更干净 我遇到的问题是,在for循环中删除列时,单元格会向左移动。因此,一些单元格基本上被跳过。为了解决这个问题,我必须对程序进行强制,使其循环多次,以解释任何跳过的列 代码如下: 'Make cells green for user to put inputs into F

我目前正在尝试制作一个程序,它接受用户输入并将值存储在一个名为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
“将单元格设置为绿色,以便用户输入
对于i=0到UBound(快速编号)
如果FastenerNumber(i)为0,则
带量程(量程(“A14”)。偏移量(0,2*i),量程(“A14”)。偏移量(紧固件编号(i)-1,(2*i)+1))
.Borders.LineStyle=xlContinuous
.Interior.ColorIndex=4
以
如果结束
下一个
'定义初始计数器变量
j=1
'直到j=5为止
'对于i=0到uBond(FastenerNumbers)
'如果FastenerNumber(i)=0,则
'范围(范围(“A14”).偏移量(0,2*i),范围(“A14”).偏移量(快速编号(i)-1,(2*i)+1)).entireclumn.Delete
"完"
”“接着呢
'循环
'
做
对于范围(“A14”,范围(“A14”)。偏移量(,(UBound(FastenerNumber)+1)*2))
如果cell.Interior.ColorIndex为4,则
cell.entireclumn.Delete
如果结束
j=j+1
如果j>=(5*(uBond(紧固件编号)+1)*2),则
退出Do
如果结束
下一个
环

伪代码是我将要使用的另一种方法。我不认为这两种方法都比另一种好。我希望循环更干净、更有效

我还没有测试过这个,所以不完全确定它是否有效,但试一下。本质上,它将所有内容都保留在
For
循环中,如果
FastEnumbers(i)
=0,则删除该列,将
i
减少1,然后继续下一个(在这种情况下为相同的数字):

i=0到uBond(FastEnerNumber)的

如果FastenerNumber(i)为0,则
带量程(量程(“A14”)。偏移量(0,2*i),量程(“A14”)。偏移量(紧固件编号(i)-1,(2*i)+1))
.Borders.LineStyle=xlContinuous
.Interior.ColorIndex=4
以
其他的
范围(范围(“A14”).偏移量(0,2*i),范围(“A14”).偏移量(紧固件编号(i)-1,(2*i)+1)).entireclumn.Delete
i=i-1
如果结束
下一个

只需使用一个单独的变量(
j
)来计算有效的
FastEnumbers()值的数量,如下所示

'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
“将单元格设置为绿色,以便用户输入
对于i=0到UBound(快速编号)
如果FastenerNumber(i)为0,则
对于Range(Range(“A14”).Offset(0,2*j)、Range(“A14”).Offset(fastenerNumber(i)-1,(2*j)+1)),使用j作为列相关变量
.Borders.LineStyle=xlContinuous
.Interior.ColorIndex=4
以
j=j+1'更新列相关变量
如果结束
下一个

刚刚试过。我明白背后的逻辑。看起来i-1一直在重置它,所以它是无限循环的。这实际上是有意义的,因为它正在查看数组中的值,而被删除的列不会更改数组中的值。您可以在
Else
语句中添加从数组中删除该特定值的内容。我不知道你会怎么想这是有道理的。我也不知道该怎么做。与其删除列,不如隐藏它?编辑:还是向后循环?这似乎是我想要的,谢谢!我目前在代码的一个单独部分中有列标题,所以我还需要修复其他一些东西。当我在最后修改我的代码时,我会将它改为这个,这样它运行得更快。
'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