VBA类模块:运行时错误438对象不支持此属性或方法

时间:2018-04-23 12:50:08

标签: vba access-vba

我的Access数据库中有以下类模块BlSecurity

Option Compare Database
Option Explicit

Private tiendaRepo As ITiendaRepository

Public Sub Init(ptiendaRepo As ITiendaRepository)
    tiendaRepo = ptiendaRepo
End Sub

Public Sub Login(code As String)
    If tiendaRepo.CheckIfCodeExists(code) = "" Then
        Err.Raise Number:=CustomErrors.CenterCodeNotExisting
    End If
    Exit Sub
End Sub

Private Sub Class_Terminate()
    Set tiendaRepo = Nothing
End Sub

这是TiendaRepository代码:

Option Compare Database
Option Explicit
Implements ITiendaRepository


Public Function ITiendaRepository_CheckIfCodeExists(ByVal code As String) As String
    Err.Raise vbObjectError, "CheckCode", "Not implemented"
    Exit Function
End Function

这是"界面" ITiendaRepository我正在实施:

Option Compare Database
Option Explicit


Public Function CheckIfCodeExists(ByVal code As String) As String
End Function

然后,在按钮处理程序中:

Private Sub btnLogin_Click()
    Dim bl As blSecurity
    Set bl = New blSecurity
    bl.Init (New TiendaRepository)
    bl.Login (txtUsuario.Value)
End Sub

但是当我点击按钮时,我会收到消息:

  

对象不支持此属性或方法

bl.Init (New TiendaRepository)

。它有什么问题?

2 个答案:

答案 0 :(得分:2)

也许

1)设置关键字

的注意事项

2)删除呼叫中的()

3)BlSecurity还必须实现ITiendaRepository_CheckIfCodeExists

BlSecurity

Option Compare Database
Option Explicit
Implements iTiendaRepository

Private tiendaRepo As iTiendaRepository

Public Sub Init(ptiendaRepo As iTiendaRepository)
   Set tiendaRepo = ptiendaRepo     '*1
End Sub

Public Sub Login(code As String)
    If tiendaRepo.CheckIfCodeExists(code) = "" Then
       Err.Raise Number:=CustomErrors.CenterCodeNotExisting
    End If
    Exit Sub
End Sub

Private Sub Class_Terminate()
    Set tiendaRepo = Nothing
End Sub

Public Function ITiendaRepository_CheckIfCodeExists(ByVal code As String) As String '*3
    Err.Raise vbObjectError, "CheckCode", "Not implemented"
    Exit Function
End Function

模块

Option Compare Database
Option Explicit

Private Sub btnLogin_Click()
    Dim bl As BlSecurity
    Set bl = New BlSecurity
    bl.Init New TiendaRepository '*2
    bl.Login txtUsuario.Value '<=== Not sure where declare and should remove () 
End Sub

虽然我不确定你在哪里声明了txtUsuario

答案 1 :(得分:2)

它在我的测试系统上运行(即,引发“未实现”消息)并进行以下两项更改:

  1. 在按钮单击模块中,删除New TiendaRepository周围的括号。

    Private Sub btnLogin_Click()
        Dim bl As BlSecurity
        Set bl = New BlSecurity
        bl.Init New TiendaRepository  ' <=== here
        bl.Login txtUsuario.Value
    End Sub
    

    这是因为VBA在调用子例程时不使用括号而不是收集返回值。如果添加括号they actually cause evaluation of the default property。因此,不是将New TiendaRepository对象传递给bl.Init,而是传递VBA认为默认值的任何内容。

    请注意,VBA编辑器会在代码中的左括号前放置一个空格。这是一个直观的线索,它没有做出你可能期望的语言总是在电话中使用parens。

  2. BlSecurity.Init中,添加Set

    Public Sub Init(ptiendaRepo As ITiendaRepository)
        Set tiendaRepo = ptiendaRepo
    End Sub
    

    这是因为在分配对象时(在内部,对象的引用),你总是(据我所知)需要Set

  3. 如果要在VBA中使用方法调用(而不是函数调用)附近的括号,请使用Call关键字。也就是说,

    Call bl.Init(New TiendaRepository)
    

    相同
    bl.Init New TiendaRepository
    

    无论参数数量多少都是如此 - Call foo(a,b,c)foo a, b, c相同。