2016-04-22 46 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

の次の数をカウントする別の変数(j)を有する、それを非表示にするには?編集:またはループバック? – findwindow

答えて

1

として、それはのように簡単に有効な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は、それが列を削除した場合、その後、1によってi低減次(その場合には同じ番号)へと続く。

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

関連する問題