3

Access 2010 データベースのフォームに表示されるサブフォーム/サブレポート コントロールがあり、それを使用してフォームとレポートの両方を表示します。Report が現在 Subform/Subreport コントロールにロードされているかどうか、またはロードされている Form であるかどうかを知る必要があるイベント ハンドラーがいくつかあります。以下のすべてを試してみましたが、役に立ちませんでした。

以下のいずれかの条件

If IsEmpty(NavigationSubform.Form) Then '...
If IsNull(NavigationSubform.Form) Then '...
If IsOject(NavigationSubform.Form) Then '...
If NavigationSubform.Form Is Nothing Then '...
If NavigationSubform.Form Is Null Then '...
If Nz(NavigationSubform.Form) Then '...
If (Not NavigationSubform.Form) = -1 Then '... This is a trick I use to check for uninitialized arrays

結果は

実行時エラー '2467':

入力した式は、閉じているか存在しないオブジェクトを参照しています。

意図的にエラーを発生させずに、現在サブフォーム/サブレポート コントロールにフォームまたはレポートが読み込まれているかどうかを確認する方法はありますか?

4

2 に答える 2

-1

名前がレポートかフォームかを判断するために Access 2013 で機能する 2 つの関数を次に示します。それが決定されると、AllForms または AllReports の IsLoaded 関数を使用できます。dbs はオブジェクトであり、rpt または frm は AccessObjects であり、フォームやレポートではないことに注意してください。

Public Function IsForm(FormName As String) As Boolean
    Dim dbs As Object
    Dim frm As AccessObject
    Set dbs = Application.CurrentProject
    IsForm = False
    For Each frm In Application.CurrentProject.AllForms
        If frm.Name = FormName Then
            IsForm = True
            Exit For
        End If
    Next frm
    Set frm = Nothing
    Set dbs = Nothing
End Function
Public Function IsReport(ReportName As String) As Boolean
    Dim dbs As Object
    Dim rpt As AccessObject
    Set dbs = Application.CurrentProject
    IsReport = False
    For Each rpt In Application.CurrentProject.AllReports
        If rpt.Name = ReportName Then
            IsReport = True
            Exit For
        End If
    Next rpt
    Set rpt = Nothing
    Set dbs = Nothing
End Function

上記の関数を使用するプログラムは次のとおりです。

Public Sub EnumerateTaggedControls(ReportName As String, MyTag As String) Dim dbs As Object Dim rpt As Report Dim frm As Form Dim col コントロールとして Dim ctl As Control Dim left As Integer Dim top As Integer Dim width As Integer Dim height As Integer Dim tag As String Dim i As Integer Const format1 As String = "0000 "

Set dbs = Application.CurrentProject
If IsForm(ReportName) Then
    If dbs.AllForms(ReportName).IsLoaded Then
        DoCmd.OpenForm ReportName, acViewDesign
        Set frm = Forms(ReportName)
        Set col = frm.Controls
    End If
Else
    If dbs.AllReports(ReportName).IsLoaded Then
        DoCmd.OpenReport ReportName, acViewDesign
        Set rpt = Reports(ReportName)
        Set col = rpt.Controls
    Else
        Debug.Print ReportName & " is not a loaded form or report."
        Exit Sub
    End If
End If
Set dbs = Nothing
Debug.Print Tab(53); "Left   Top    Width  Height"
For Each ctl In col
    With ctl
    left = .Properties("Left")
    top = .Properties("Top")
    width = .Properties("Width")
    height = .Properties("Height")
    tag = Nz(.Properties("Tag"), vbNullString)
    If MyTag = "" Then
        i = 1
    Else
        i = InStr(1, tag, MyTag)
    End If
    If i > 0 Then
        Debug.Print .Name & ">"; Tab(33); tag; Tab(53); Format(left, format1) &         Format(top, format1) & Format(width, format1) & Format(height, format1)
    End If
    End With
Next ctl
Debug.Print "====================================================="
Set ctl = Nothing
Set rpt = Nothing
Set col = Nothing
Set frm = Nothing

サブ終了

これがあなたの要件を満たすことを願っています。

于 2013-07-04T07:59:42.353 に答える