2011-01-13 16 views
0

73個のテキストボックスを含むレポートがあり、プルアップされる各レコードは9個の結果の1つになります。結果に応じてボックス。 私はそう、私はその後、私はメッセージの手順が大きくなりすぎ73箱のそれぞれに対して、MS Access 2007条件付きVBAで複数のテキストボックスをフォーマットする 'Procdure Too Large'

If Me!A = "0-1" Then 
    Me!A.ForeColor = 329171 
    Me!A.BackColor = 329171 
    ElseIf Me!A = "1-2" Then 
    Me!A.ForeColor = 33023 
    Me!A.BackColor = 33023 
    ElseIf Me!A = "2-3" Then 
    Me!A.ForeColor = 251574 
    Me!A.BackColor = 251574 
    ElseIf Me!A = "3-4" Then 
    Me!A.ForeColor = 16645487 
    Me!A.BackColor = 16645487 
    ElseIf Me!A = "4-5" Then 
    Me!A.ForeColor = 8453888 
    Me!A.BackColor = 8453888 
    ElseIf Me!A = "5-6" Then 
    Me!A.ForeColor = 12615680 
    Me!A.BackColor = 12615680 
    ElseIf Me!A = "6-7" Then 
    Me!A.ForeColor = 16744703 
    Me!A.BackColor = 16744703 
    ElseIf Me!A = "7-8" Then 
    Me!A.ForeColor = 65535 
    Me!A.BackColor = 65535 
    ElseIf Me!A = "8-9" Then 
    Me!A.ForeColor = 32896 
    Me!A.BackColor = 32896 
    Else 
    Me!A.ForeColor = 0 
    Me!A.BackColor = 16777215 

    End If 

    If Me!B = "0-1" Then 
    Me!B.ForeColor = 329171 
    Me!B.BackColor = 329171 
    ElseIf Me!B = "1-2" Then 
    Me!B.ForeColor = 33023 
    Me!B.BackColor = 33023 
    ElseIf Me!B = "2-3" Then 
    Me!B.ForeColor = 251574 
    Me!B.BackColor = 251574 
    ElseIf Me!B = "3-4" Then 
    Me!B.ForeColor = 16645487 
    Me!B.BackColor = 16645487 
    ElseIf Me!B = "4-5" Then 
    Me!B.ForeColor = 8453888 
    Me!B.BackColor = 8453888 
    ElseIf Me!B = "5-6" Then 
    Me!B.ForeColor = 12615680 
    Me!B.BackColor = 12615680 
    ElseIf Me!B = "6-7" Then 
    Me!B.ForeColor = 16744703 
    Me!B.BackColor = 16744703 
    ElseIf Me!B = "7-8" Then 
    Me!B.ForeColor = 65535 
    Me!B.BackColor = 65535 
    ElseIf Me!B = "8-9" Then 
    Me!B.ForeColor = 32896 
    Me!B.BackColor = 32896 
    Else 
    Me!B.ForeColor = 0 
    Me!B.BackColor = 16777215 

    End If 

などやっ一緒に各ボックスを参照する場合は、Elseステートメントを入れ始めました。明らかに私のコードにはたくさんの繰り返しがあります。私は全く新しいです。コードを一度使用する方法があるのだろうかと疑問に思っていますが、73個のボックスのすべてを参照していますか?

おかげ

答えて

1

ストアデータテーブルのルックアップペア、このような何か:もちろん

KeyValue Foreground Background 
0-1   329171  329171 
1-2   33023  33023 
2-3   251574  251574 
3-4  16645487 16645487 
4-5   8453888  8453888 
5-6  12615680 12615680 
6-7  16744703 16744703 
7-8   65535  65535 
8-9   32896  32896 

が、今私は例として、このデータを編集したことを、私は気づきます前景と背景の色は同じですが、それは本当に私の答えに影響しません。あなたのコードで今すぐ

、代わりに色を決定するための試験として、次に/ ELSE IF /で、あなたはあなたがテストした値に基づいて色をルックアップするためのDLookup()を使用したい:

Dim lngForeColor As Long 
    Dim lngBackColor As Long 

    lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & Me!A & "'") 
    lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & Me!A & "'") 
    Me!A.ForeColor = lngForeColor 
    Me!A.BackColor = lngBackColor 

、コントロールをループにアーロンの提案の改善と組み合わせる:あなたの前景色と背景色が同じである

Dim ctl As Control 
    Dim lngForeColor As Long 
    Dim lngBackColor As Long 

    For Each ctl in Me.Detail.Controls 
    If DCount("*", "tblColors", "[KeyValue]='" & ctl.Value & "'") = 0 Then 
     lngForeColor = 0 
     lngBackColor = 16777215 
    Else 
     lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & ctl.Value & "'") 
     lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & ctl.Value & "'") 
    End If 
    ctl.ForeColor = lngForeColor 
    ctl.BackColor = lngBackColor 
    Next ctl 
    Set ctl = Nothing 

場合、あなたのテーブルで両方の列を必要とし、あなたではないでしょう」 dは1つの検索を行うだけです。今

、あなただけのいくつかのそれらの、あなたはそれを条件付きにするコントロールの.TAGプロパティを使用することができ、すべてのコントロールを変更していない場合:

For Each ctl in Me.Detail.Controls 
    If .Tag = "ColorGroup" Then 
     ' set the colors 
    End If 
    Next ctl 

より良い提案を変更する必要があります条件付きでレコードからのデータのコントロールのグループは、カスタムコレクションを作成し、それらのコントロールをフォームレポートのOnOpenイベントで割り当てます。これを行うには、あなたがタイプ収集のモジュールレベルの変数を作成したい:のフォーマットイベントに続いて

Dim ctl As Control 

    For Each ctl in Me.Detail.Controls 
    colColorGroup.Add ctl, ctl.Name 
    Next ctl 
    Set ctl = Nothing 

:レポートの開く時]イベントで

Dim colColorGroup As New Collection 

を、あなたはこれを行うだろう代わりに、このコレクションをループしたい、あなたのコントロールのグループ全体を歩くの詳細、:

Dim varItem As Variant 
    Dim ctl As Control 

    For Each varItem in colColorGroup 
    Set ctl = varItem 
    If DCount("*", "tblColors", "[KeyValue]='" & ctl.Value & "'") = 0 Then 
     lngForeColor = 0 
     lngBackColor = 16777215 
    Else 
     lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & ctl.Value & "'") 
     lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & ctl.Value & "'") 
    End If 
    ctl.ForeColor = lngForeColor 
    ctl.BackColor = lngBackColor 
    Next varItem 
    Set ctl = Nothing 

これは、コントロールの大きなグループをループして、Tagプロパティに基づいて選択するよりもはるかに高速になります。

+0

うわー、それは信じられないほどです。本当にありがとう、私はこの事をとても愛しているので、それは強迫観念になるかもしれません。ありがとうありがとう – Deeb74

1
Dim ctl as control 

for each ctl in me.controls 
    If me.controls(ctl.name).tag = "X" then me.controls(ctl.name).backcolor = "" 
next ctl 
+0

私は質問の誤った読み方のためにこの答えを下げましたが、それを逆にすることはできません。それは残念です。この回答には元の質問の条件付き部分は含まれていませんが、コードの量を元のサイズの73分の1に減らすことができます(このようなコントロールは73個に基づいています)ので、手順の問題を確実に解決できます大きすぎる(私は限界が64KBだと思う)。 –

関連する問題