2016-09-09 15 views
1

私はプログラミングに新しいことがあり、現在vbaを学ぼうとしています。ループを終了するとすぐに実行しようとしている各ループに対して、問題が発生しています。特定の値があるかどうかを調べるためにテストしたい範囲があります。その場合は、その列を削除したいと思います。しかし、条件を1回だけテストしてループを終了します。間違いなくこれについての助けに感謝します!forループが速すぎるvba

For Each cell In ActiveSheet.Range("S1:AA1") 


    If ActiveCell.Value = "Actual" Then 
     ActiveCell.EntireColumn.Delete 


    ElseIf ActiveCell.Value = "" Then 
     ActiveCell.EntireColumn.Delete 


    Else: ActiveCell.Offset(, 1).Select 


    End If 

Exit For 

Next 
+2

代わりActiveCell' 'の' cell'を使用します「選択」する必要はありません。 –

+1

また、「Exit For」ステートメントは疑わしいと思われます。これは最初のセルで終了します。 –

答えて

5

利用cell代わりのActiveCell、およびSelectの必要はありません。

また、あなたのExit Forステートメントは疑わしいと思われます。これは最初のセルで終了します。すべての項目(の最初ののインスタンスがのように見えるように設計されたループ)を処理する前にループを終了する必要がある条件が満たされたときには、通常、Exitステートメントを使用します。

最後に、コレクションからメンバーを削除するときは、逆の順序でメンバーを削除する必要があります(そうしないと、すべてのアイテムが確実に処理されるようにする特別な対策が必要です)。

Dim i as Long 
Dim cell as Range 
For i = ActiveSheet.Range("S1:AA1").Columns.Count to 1 Step - 1 
    Set cell = ActiveSheet.Range("S1:AA1").Cells(i) 
    Select Case cell.Value 
     Case "Actual", "" 
      cell.EntireColumn.Delete 
     Case Else 
      'Do nothing, unless you need to do something... 
    End Select 
Next 

NB:大文字と小文字の区別と末尾のスペース。あなたは、「実際の」「実際」、「実際の」などと、「のような値」と「」実際の懸念している場合は、実行する必要があります。

Select Case UCase(Trim(cell.Value)) 
    Case "ACTUAL", "" 
... 
+1

私はたぶん '次は'より良い練習 - 良い答えは - 私は後方を削除することを忘れていたと言うだろう! – CallumDA

+1

私は '次は'余分だと思うが、おそらくベストプラクティスです。 D –

+0

「次のi」はネストされたループを少なくとも持っているときは素晴らしい視覚的な手掛かりです。 – Brad

関連する問題