2016-10-11 11 views
1

私はvbaに若干の変更がありました。2013年の条件付き書式設定メニューよりも幾分複雑な条件付き書式を作成しようとしています。私は22の目標日付と実際の日付フィールドを持つフォームを持っています。各ペアのために、私はする必要があります:アクセスフォームの書式設定をグローバルサブから変更する

将来の目標日が7日以上の場合、緑色に着色します。 対象日が将来7日以内または今日の場合、黄色に着色します。 過去の対象日付が赤色になっています。

それが達成された実際の日付がない限り、その場合:

実際の日付が目標日より前である場合、色緑色両方の日付 実際の日付が目標日より後であれば、色両方の日付赤。

フォームの読み込みや日付フィールドの変更(対象の日付は計算されますが、他のデータがフォームで変更された場合は変更されます)でこれを行う必要があるため、フォーム名、ターゲット日付、および実際の日付を変数として取ります。私は 'Me.txtbox'のローカルフォームモジュールでこれを行うために各ボックスをコーディングすることができました しかし、フォームとテキストボックスをパブリックサブから参照しようとすると、テキストを正しく参照していないようですフォーム上のボックス。フォームモジュールで

を望むように動作

コードを、私はこれを行うための3つのまたは4種類の方法(文字列、textbox.nameなど)を試みたと私は近いんだような気がしますが、...

Private Sub txtFreqReqDate_AfterUpdate() 
    If Me.txtFreqReqDate <= Me.txtFreqReq Then 
    Me.txtFreqReq.Format = "mm/dd/yyyy[green]" 
    Me.txtFreqReqDate.Format = "mm/dd/yyyy[green]" 
    ElseIf Me.txtFreqReqDate > Me.txtFreqReq Then 
    Me.txtFreqReq.Format = "mm/dd/yyyy[red]" 
    Me.txtFreqReqDate.Format = "mm/dd/yyyy[red]" 
    ElseIf IsNull(Me.txtFreReqDate) = True Then 
    If Me.txtFreqReq < Now() Then 
     Me.txtFreqReq.Format = "mm/dd/yyyy[red]" 
    ElseIf Me.txtFreqReq >= (Now()+7) Then 
     Me.txtFreqReq.Format = "mm/dd/yyyy[yellow]" 
    ElseIf Me.txtFreqReq > (Now()+7) Then 
     Me.txtFreqReq.Format = "mm/dd/yyyy[green]" 
    Else 
     Me.txtFreqReq.Format = "mm/dd/yyyy[black]" 
    End If 
    Else 
    Exit Sub 
    End If 
End Sub 

おそらく、最も美しいものではありませんが、私はいつも建設的な批判に開放されています。私は毎回、テキストボックスの名前を変更し、このペアを22回以上書く必要があります。私は、テキストボックスの名前を取り、公共のサブを書きたいが、私は適切な組み合わせを見つけるように見えることはできません。

Private Sub txtFreqReqDate_AfterUpdate() 
    FormatBoxes(Me, me.txtFreqReqDate, me.txtFreqReq) 
End Sub 

、別のモジュールで:

Public Sub FormatBoxes(CurrentForm As Form, txtActual as Textbox, txtTarget as Textbox) 

frmName = CurrentForm.name 
tbActual = txtActual.Name 
tbTarget = txtTarget.Name 


    If frmName.tbActual <= frmName.tbTarget Then 
    frmName.tbTarget.Format = "mm/dd/yyyy[green]" 
    frmName.tbActual.Format = "mm/dd/yyyy[green]" 
    ElseIf frmName.tbActual > frmName.tbTarget Then 
    frmName.tbTarget.Format = "mm/dd/yyyy[red]" 
    frmName.tbActual.Format = "mm/dd/yyyy[red]" 
    ElseIf IsNull(frmName.tbActual) = True Then 
    If frmName.tbTarget < Now() Then 
     frmName.tbTarget.Format = "mm/dd/yyyy[red]" 
    ElseIf frmName.tbTarget >= (Now()+7) Then 
     frmName.tbTarget.Format = "mm/dd/yyyy[yellow]" 
    ElseIf frmName.tbTarget > (Now()+7) Then 
     frmName.tbTarget.Format = "mm/dd/yyyy[green]" 
    Else 
     frmName.tbTarget.Format = "mm/dd/yyyy[black]" 
    End If 
    Else 
    Exit Sub 
    End If 
End Sub 

場合は申し訳ありませんこれはちょっと長いです、私はちょうど私の知恵の終わりです...

また、すべてのタイプミスのお詫び。私は別のマシンからこれを再入力しなければなりませんでした。

答えて

0

サブボックスで直接テキストボックスのパラメータを使用することができます。

パラメータとしてフォームを渡す必要はありません。それを呼び出すとき、あなたはCallや括弧を削除のいずれかが必要であることを

Public Sub FormatBoxes(txtActual as Textbox, txtTarget as Textbox) 

    If txtActual.Value <= txtTarget.Value Then 
     txtTarget.Format = "mm/dd/yyyy[green]" 

など

注意。

Private Sub txtFreqReqDate_AfterUpdate() 
    Call FormatBoxes(me.txtFreqReqDate, me.txtFreqReq) 
    ' or 
    ' FormatBoxes me.txtFreqReqDate, me.txtFreqReq 
End Sub 
+0

フォーム名を渡さないと、実際にはトリックは実行されませんでした。私はフォームへの参照を既にテキストボックスオブジェクトに含まれている必要があります推測しています...? –

+0

@RickDawson、右のテキストボックスオブジェクトは、完全な階層が既にどこにあるかを知っています。 – Brad

0

CurrentForm.nameは文字列です。 CurrentFormオブジェクトのNameプロパティです。 CurrentFormオブジェクトには、コントロールコレクションがあり、そこにはテクスチャボックスが存在します。そこにはCurrentForm.Controls("tbTarget")のような名前で参照できますが、CurrentForm.tbTargetと言うこともできます。あなたはとても近く、正しい道を歩いています。

変更

frmName = CurrentForm.name 
tbActual = txtActual.Name 
tbTarget = txtTarget.Name 

また

set frmName = CurrentForm 
if frmName is not nothing then  
    set tbActual = txtActual 
    set tbTarget = txtTarget 
end if 

にあなたの方法上のあなたの署名が

Public Sub FormatBoxes(CurrentForm As string, txtActual as string, txtTarget as string) 

であれば、あなたのセットアップは

set frmName = forms(CurrentForm) 
if frmName is not nothing then  
    set tbActual = frmName.controls(txtActual) 
    set tbTarget = frmName.controls(txtTarget) 
end if 
のようになります。

しかし、最初の方がうまくいくと思います。

+0

何らかの理由で、Access 2013で動作しませんでしたが、残りの回答は非常に役に立ちます。 –

+0

おっと、キーボードの猫。私は '何もない部分'を 'isnull()= false'に変更しなければならなかった。問題は、フォーム自体を渡し、コントロール名を渡すことで、どういうわけか論理的に 'me.me.txtbox'のようなものが得られたと思います。 –

0

私は、この件名を検索する他の誰かを助けるために完成したコードを投稿したかったのです。このサブをより普遍的なものにするために、私は数回微笑んだ。 最初に、日付書式を使用する代わりに、.ForeColorを変更しただけで、このサブを任意のタイプのテキストボックスに使用できるようになりました。

あなたが思っていた場合には
Public Sub FormatBoxes(txtActual As TextBox, txtTarget As TextBox, chkRequired As CheckBox, _ 
Optional intOption as Integer) 
Dim intRed As Long, intYellow As Long, intGreen As Long, inBlack As Long, intGray As Long 
intBlack = RGB(0, 0, 0) 
intGray = RGB(180, 180, 180) 
intGreen = RGB (30, 120, 30) 
intYellow = RGB(217, 167, 25) 
intRed = RGB(255, 0, 0) 

If (chkRequired = False) Then 
    txtTarget.ForeColor = intGray 
    txtActual.ForeColor = intGray 
    If intOption <> 1 Then 
    txtTarget.Enabled = False 
    txtActual.Enabled = False 
    txtTarget.TabStop = False 
    txtActual.TabStop = False 
    End If 
Else 
    If intOption <> 1 Then 
    txtTarget.Enabled = True 
    txtActual.Enabled = True 
    txtTarget.Locked = True 
    txtActual.Locked = False 
    txtTarget.TabStop = False 
    txtActual.TabStop = True 
    End If 
    If IsBlank(txtActual) = True Then 
    If txtTarget < Now() Then 
    txtTarget.ForeColor = intRed 
    ElseIf txtTarget > (Now() + 7) Then 
    txtTarget.ForeColor = intGreen 
    ElseIf txtTarget >= Now() And txtTarget <= (Now() +7) Then 
    txtTarget.ForeColor = intYellow 
    Else 
    txtTarget.ForeColor = intBlack 
    End If 
    ElseIf intOption - 1 Then 
    txtTarget.ForeColor = intBlack 
    txtActual.ForeColor = intBlack 
    ElseIf txtActual <= txtTarget Then 
    txtTarget.ForeColor = intGreen 
    txtActual.ForeColor = intGreen 
    ElseIf txtActual > txtTarget Then 
    txtTarget.ForeColor = intRed 
    txtActual.ForeColor = intRed 
    End If 
End If 
End Sub 

IsBlank()はnullまたは長さゼロの文字列をチェックする機能です。すべての助けを

Public Function IsBlank(str_in As Variant) As Long 
If Len(str_in & "") = 0 Then 
    IsBlank = -1 
Else 
IsBlank = 0 
End If 
End Function 

おかげで、私はこれが誰かのために有用であると思います。

関連する問題