2017-06-19 18 views
0

このSELECT CASEシナリオは私のために働いていますが、私はコードがよりフレンドリーなことができると思う...任意のアドバイスは非常に役立つだろう。このSelect Case 80回通じガイダンス、VBA - SELECT CASEをクリーンアップ

Select Case True 'select case where worker name and action is true then in each case RSworkhours.addnew 

    Case Me.Worker1.Value <> "" And Me.fw1a1 = 1 
     With RsWorkHours 
      .AddNew 
      !WorkerID = Me.Worker1 
      !Date = Me.TxtDate 
      !StandardTime = Me.w1a1s 
      !Overtime = Me.w1a1o 
      !Doubletime = Me.w1a1d 
      !ScaffoldID = Me.cboScaffnum 
      .Update 
     End With 
     Me.fw1a1 = 0 
     GoTo WorkerHours 
    Case Me.Worker1.Value <> "" And Me.fw1a2 = 1 
     With RsWorkHours 
      .AddNew 
      !WorkerID = Me.Worker1 
      !Date = Me.TxtDate 
      !StandardTime = Me.w1a2s 
      !Overtime = Me.w1a2o 
      !Doubletime = Me.w1a2d 
      !ScaffoldID = Me.cboScaffnum 
      .Update 
     End With 
     Me.fw1a2 = 0 
     GoTo WorkerHours 

コード反復し、そこに16人の労働者があり、それぞれが5つのアクションを持っている場合。

私は多分のように、引数内の数を変更するループ持つ考えていた:

for each x to 16 
    for each y to 5 
     If Me.worker & x & .Value <> "" And Me.fw & x & a & y Then 
      With Recordset 
       .AddNew 
       'insert stuff 
       .Update 
      End With 
     End If 
    Next y 
Next x 

を誰もが任意の洞察力を持っていますか? ありがとうございます。

-Matt ATTACHED IS AN IMAGE OF THE FORM JUST TO GET AN UNDERSTANDING OF WHAT THE CODE IS DOING.

+0

あなたのユースケースでは、これは最高のUIですか? – Tomalak

+0

@Tomalakが述べたことに加えて、「Worker 1」に6番目のアクションがあるとどうなりますか? – FreeMan

+0

この場合、これはデザインビューのフォームの半分だけです...これは、必要に応じてフォームを展開する各コンボボックスの '_Click'イベントです。このフォームは、今までにない一連の状況に適しています1日に最大5つのアクションがあります.... 私はいつも私のフォームとプログラムを合理化する方法の提案をしています。 –

答えて

2

あなたはControls collectionから自分の名前ですべてのコントロールにアクセスすることができます。

コントロールの名前を渡すだけで、そのコントロールが得られます。名前は文字列であり、もちろん動的でもかまいません。

Dim x As Long, y As Long 
Dim WorkerX As Control, wXaYs As Control, wXaYo As Control, wXaYd As Control 

For x = 1 To 16 
    For y = 1 To 5 
     Set WorkerX = Me.Controls("Worker" & x) 
     Set wXaYs = Me.Controls("w" & x & "a" & y & "s") 
     Set wXaYo = Me.Controls("w" & x & "a" & y & "o") 
     Set wXaYd = Me.Controls("w" & x & "a" & y & "d") 
     If WorkerX.Value > "" And wXaYs.Value > "" Then 
      With Recordset 
       .AddNew 
       !WorkerID = WorkerX.Value 
       !Date = Me.TxtDate 
       !StandardTime = wXaYs.Value 
       !Overtime = wXaYo.Value 
       !Doubletime = wXaYd.Value 
       !ScaffoldID = Me.cboScaffnum 
       .Update 
      End With 
     End If 
    Next y 
Next x 
+0

これは本当にすっきりしています!ありがとうございました。 –