2016-04-22 207 views
2

我目前正在嘗試製作一個程序,它接受用戶輸入並將這些值存儲在名爲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

回答

1

它那樣簡單具有一個單獨的變量(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

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 
+0

只是試了一下。我看到它背後的邏輯。似乎i-1不斷重置它,以至於它無限循環。 – Asparagus

+0

這實際上是有道理的,因爲它正在查看數組中的值,並且被刪除的列不會更改數組中的值。你可以在'Else'語句中添加一些從數組中刪除特定值的東西。關閉我的頭頂不知道你會怎麼去,雖然 –

+0

哦,這是有道理的。我不是100%確定如何做到這一點。 – Asparagus