私は状況を理解しているControlTipText
ので、フォームが読み込まれるたびにプロパティを動的に設定する必要があります。このアプリケーションはタブレットデバイスを対象としていることをコメントで示したので、フォームを開くときにプロセッサの負荷を制限することをお勧めします。ControlTipText
フォームのデザインでプロパティを保存することで、これを行うことができます。
次のようなフォームの名前で次の手順を試してください。
SetControlTipText "YourFormName"
手順は次のとおりです。限られたテストでは問題は見つかりませんでした。ControlTipText
チェックボックス、コンボ、リストボックス、テキストボックスを設定します。最初のCase
行を変更して、別のコントロールのセットをターゲットにします。
Public Sub SetControlTipText(ByVal pFormName As String)
Dim ctl As Control
Dim db As DAO.Database
Dim frm As Form
Dim rs As DAO.Recordset
DoCmd.OpenForm pFormName, acDesign
Set frm = Forms(pFormName)
If Len(frm.RecordSource) > 0 Then
Set db = CurrentDb
Set rs = db.OpenRecordset(frm.RecordSource)
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acCheckBox, acComboBox, acListBox, acTextBox
If Len(ctl.ControlSource) > 0 _
And Not ctl.ControlSource Like "=*" Then
ctl.ControlTipText = _
GetDescription(rs.Fields(ctl.ControlSource))
End If
Case Else
' pass '
End Select
Next ctl
rs.Close
End If
Set ctl = Nothing
Set rs = Nothing
Set db = Nothing
Set frm = Nothing
DoCmd.Close acForm, pFormName, acSaveYes
End Sub
SetControlTipText
この関数を呼び出します:
Public Function GetDescription(ByRef pObject As Object) As String
Dim strReturn As String
On Error GoTo ErrorHandler
strReturn = pObject.Properties("Description")
ExitHere:
GetDescription = strReturn
On Error GoTo 0
Exit Function
ErrorHandler:
strReturn = vbNullString ' make it explicit '
GoTo ExitHere
End Function
このSetControlTipText
手順では、バインドされていないフォームは無視されます。Description
バインドされたフィールドの制御ソースにプロパティが割り当てられていない場合、そのプロパティControlTipText
は空の文字列に設定されます。
このアプローチでは、フォームが読み込まれるたびに他のプロシージャを実行するのではなく、フォームに対してプロシージャを1回実行する必要があります。後でDescription
フォームのレコードソースフィールドのいずれかのプロパティを変更した場合は、再実行SetControlTipText
してを更新できますControlTipText
。
または、アプリケーションの新しいバージョンをリリースするための準備の一環として、すべてのアプリケーションのフォームに対してプロシージャを実行することもできます。
Dim frm As Object
For Each frm in CurrentProject.AllForms
SetControlTipText frm.Name
Next frm