Oscar
Oscar

Reputation: 13960

VBA Class Module: Runtime error 438 Object doesn't support this property or method

I have the following class module BlSecurity in my Access database:

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

This is TiendaRepository code:

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

And this is the "interface" ITiendaRepository I'm implementing:

Option Compare Database
Option Explicit


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

Then, inside a button handler:

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

But when I click the button, I receive message:

Object doesn't support this property or method

in line bl.Init (New TiendaRepository)

. What's wrong with it?

Upvotes: 2

Views: 1264

Answers (2)

QHarr
QHarr

Reputation: 84465

Maybe

1) Note of set keyword

2) Removal of () in call

3) BlSecurity must also implement 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

Module

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

Though I am unsure where you have declared txtUsuario

Upvotes: 2

cxw
cxw

Reputation: 17041

It runs (i.e., raises the "Not implemented" message) on my test system with these two changes:

  1. In your button-click module, remove the parentheses around 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
    

    This is because VBA doesn't use parentheses when calling subroutines and not collecting a return value. If you add the parentheses, they actually cause evaluation of the default property. Therefore, instead of passing the New TiendaRepository object to bl.Init, you are passing whatever VBA thinks the default value is.

    Note that the VBA editor put a space before the opening parenthesis in your code. That's a visual clue that it's not doing what you might expect coming from languages that always use parens on calls.

  2. In BlSecurity.Init, add a Set:

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

    That is because you always (as far as I know) need Set when you are assigning objects (internally, references to objects).

If you want to use parentheses around method calls (not function calls) in VBA, you use the Call keyword. That is,

Call bl.Init(New TiendaRepository)

is the same as

bl.Init New TiendaRepository

This is true regardless of the number of parameters — Call foo(a,b,c) is the same as foo a, b, c.

Upvotes: 2

Related Questions