2016-10-11 30 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

您可以直接在您的sub中直接使用文本框參數。

甚至不需要傳遞表單作爲參數。

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

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

注意調用它時,你需要或者Call或刪除括號。

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

的事實。我猜對錶單的引用必須包含在文本框對象中......? –

+0

@RickDawson,正確的文本框objet知道它已經是完整的層次結構。 – Brad

0

CurrentForm.name是一個字符串。它是CurrentForm對象的Name屬性。 CurrentForm對象還有一個控件集合,其中存在texboxes。你可以通過名字在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()是爲空或零長度字符串檢查功能:

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

感謝所有幫助,我希望這是有用的人。