2012-02-25 8 views
1

私はループを使ってコレクションを埋めています。コレクションの各アイテムにはいくつかのプロパティがありますが、これらのプロパティの一部はオプションです。コレクションにコピーするプロパティを選択するようユーザーに求められます。ユーザーが無視することを選択した場合、オプションのプロパティのコードを省略することは可能ですか?このコードでループの構造をユーザーの好みに合わせるにはどうすればいいですか?

Sub fillcoll() 
    Dim coll as Collection 
    Set coll = New Collection 
    Dim NewItem as Class1 

    For each r in Selection.Rows 
     Set NewItem = New Class1 

     If Userform1.Checkbox1.Value = True then 
      NewItem.Property1 = somearray1(r.Row) 
     End If 

     If Userform1.Checkbox2.Value = True then 
      NewItem.Property2 = somearray2(r.Row) 
     End If 

     If Userform1.Checkbox3.Value = True then 
      NewItem.Property3 = somearray3(r.Row) 
     End If 

    Next r 
End Sub 

、チェックボックス値は、各反復において読み出されます。プログラムの実行が不必要に遅くなる恐れがあります。チェックボックスは一度読むことができ、ループの内容はチェックボックスの値に適応します。これは可能ですか?

ありがとうございます。

+4

"プログラムの実行が不必要に遅くなる恐れがあります。"恐れや知っている?あなたは尋ねる前にあなた自身をチェックしましたか?最適化が必要であることがわかっていない限り最適化しないでください。あなたが知らないなら、見つけてください。 –

+1

10,000回の処理を含むバックグラウンドプロセスがある場合は、1回の繰り返しにつき1秒または2回の保存が価値があります。しかし、画面を読んで意思決定し、指を動かし、キーを押してマウスをクリックしなければならないユーザーがいます。ユーザーは保存された時間に気づくことはありません。 –

+0

私はここでJCMとTonyに同意します。あなたはそこにさえいないかもしれない何かを心配しているかもしれません。ところで、somearray1,2,3は何をするのですか?また、配列の範囲を読み取ってから、ループ自体をループするのではなく、ループすることもできます。これはまた、ループの速度を増加させる。 –

答えて

1

先頭からループの外にあるチェックボックスを読み、その値を3つのブール値またはブール値の配列に割り当てます。毎回ブール変数から読み込むだけです。

これは、オブジェクト変数にアクセスする必要はなく、クラス/オブジェクトの内部にあるブール値にアクセスするため、パフォーマンスが向上します。

+0

ありがとうございます。しかし、変数からの読み込みを避けることさえ可能ですか?私のコードの3つのIFは不要です。 – Cutter

+1

コードの繰り返しを避けたい場合は、ブール値を使用するほうがはるかに優れています。とにかくブール値にアクセスするのは非常に高速です。私はあなたが数十億回以上のブール値にアクセスすることができると思います –

+0

'(r.Row)'セルへの繰り返し参照は、チェックボックスをチェックするよりも、 –

関連する問題