代码之家  ›  专栏  ›  技术社区  ›  spinjector

在Access 2007 VBA中,未保存的窗体和报表是否可以键入“AccessObject”…?

  •  0
  • spinjector  · 技术社区  · 6 年前

    我在access 2007 vba中,正在创建代码,用于在“设计”视图中自动设置窗体和报表控件的布局和格式。

    为了简化我的代码,我尝试将表单和报表引用为一个通用的根类型,这样单个变量“thisdoc”就可以引用它们。我以为那是“accessobject”,但似乎不是。我得到运行时错误13,类型不匹配。

    表单和报表是否有共同的根类型…?如果是,那是什么?

    类型“object”当然是可能的,但我更希望更接近访问对象层次结构中的子对象。这是为了避免后期绑定,满足我的强迫症,但主要是为了让智能感知工作正常。

    这里的问题是:我的代码访问当前屏幕上的活动窗体或报表,这些窗体或报表可能尚未保存。因此,它们还没有以所有形式或所有报告出现。对于动态表单/报表,它们永远不会。

    下面是封装该问题的示例代码:

    dim app      as Access.Application
    dim scr      as Access.Screen
    dim thisDoc  as Access.AccessObject 'but "As Object" works ok.
    set app       = Access.Application
    set scr       = app.Screen
    set thisDoc   = scr.ActiveReport     'or .ActiveForm       
    'Runtime error #13: Type Mismatch.
    

    如前所述,vartype“object”可以工作,但如前所述,我希望至少得到一个位于访问对象层次结构中的类型。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Erik A    6 年前

    不,在 Report 以及 Form 对象(除了 Object ,当然,它可以用于任何对象。

    这个 AccessObject 接口是 用于窗体和报表,就像您通常使用它们一样。你不能通过它访问控件之类的东西。它主要用于遍历数据库对象(因为您可以使用公共接口遍历表单、宏、模块和报表)。

    如果要修改动态创建的窗体和报表,并将它们存储在同一变量中,则仅限于 对象 类型(或) Variant ,但这更不具体)。

        2
  •  0
  •   Nick SamSmith1986    5 年前

    使用vba获得在ms access模块中使用intellisense(正式称为picklist)的能力,以引用任何现有对象(表、查询、窗体、报表)的控件。

    我曾经非常依赖“我”,觉得它非常方便和有用,但从不喜欢它的局限性。

    下面的解决方案是我开发的,并在我工作过的多个应用程序中实现的,作为“我”的替代方案。

    'Function Declaration to use 'this.':
    Dim this As Form_myFormName
    Set this = Mee
    
    'Function Declaration to use 'Mee.':
    Dim Mee As Form_myFormName
    Set Mee = this
    
    'Function Code Module:
    
    Public Property Get Mee() As Object
    On Error Resume Next
    Dim dbApp As ezGetElementBy
    Set dbApp = New ezGetElementBy
      Set Mee = dbApp.obj
    End Property
    
    Public Property Get this() As Object
    On Error Resume Next
    Set this = Mee
    End Property
    
    
    'Class Module: ezGetElementBy
    
    Public Function obj() As Object
    On Error GoTo ErrHandler
    Dim APP_OBJECT_NAME As String
    Dim APP_OBJECT_TYPE As Integer
    Dim dbObjectDesc As Variant
    
     APP_OBJECT_NAME = Application.CurrentObjectName
     APP_OBJECT_TYPE = Application.CurrentObjectType dbObjectDesc = Array("Table", "Query", "Form", "Report", "Macro", "Module")
    
      AsObjectType = IIf( _
        APP_OBJECT_TYPE = 2 Or APP_OBJECT_TYPE = 3, _
        dbObjectDesc(APP_OBJECT_TYPE), Object _
      )
    
      Select Case APP_OBJECT_TYPE
        Case 0 ' "Table"
          Set obj = Screen.ActiveDatasheet
        Case 1 ' "Query"
          Set obj = Screen.ActiveDatasheet
        Case 2 ' "Form"
          Set obj = Forms(APP_OBJECT_NAME)
        Case 3 ' "Report"
          Set obj = Reports(APP_OBJECT_NAME)
        Case Else
      End Select
    
    Exit Function
    ErrHandler:
    On Error Resume Next
    
      Select Case APP_OBJECT_TYPE
        Case 0 ' "Table"
    APP_OBJECT_NAME=Screen.ActiveDatasheet.Name
    DoCmd.SelectObject acTable,APP_OBJECT_NAME, True
    
    DoCmd.OpenTable APP_OBJECT_NAME, acViewNormal
    Set obj = Screen.ActiveDatasheet
    
        Case 1 ' "Query"
    APP_OBJECT_NAME=Screen.ActiveDatasheet.Name
    
    DoCmd.SelectObject acQuery,APP_OBJECT_NAME, True
    
    DoCmd.OpenQuery APP_OBJECT_NAME, acViewNormal
    
    Set obj = Screen.ActiveDatasheet
    
        Case 2 ' "Form"
    APP_OBJECT_NAME =Screen.ActiveForm.Name
    DoCmd.SelectObject acForm,APP_OBJECT_NAME, True
    
    DoCmd.OpenForm APP_OBJECT_NAME, acNormal, , , , acWindowNormal
    
    Set obj = Screen.ActiveForm
    
        Case 3 ' "Report"
    APP_OBJECT_NAME=Screen.ActiveReport.Name
    
    DoCmd.SelectObject acReport, APP_OBJECT_NAME, True
    
    DoCmd.OpenReport APP_OBJECT_NAME, acNormal, , , acWindowNormal
    Set obj = Screen.ActiveReport
    
    Case Else
    End Select
    Exit Function
    End Function
    
    推荐文章