Variable requise. Impossible de l'affecter à cette expression

Fermé
Jean-CharlesDucommun Messages postés 2 Date d'inscription jeudi 7 novembre 2013 Statut Membre Dernière intervention 8 novembre 2013 - 7 nov. 2013 à 16:07
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 8 nov. 2013 à 15:11
Bonjour,

Je fais du VBA de base et j'ai un problème pour lequel ce message d'erreur s'affiche "Variable requise. Impossible de l'affecter à cette expression."

J'ai un module de types, un module d'unités fonctionnelles et un module de test final (c'est la consigne de l'exercice qui veut tout en séparé).

mod_types:

Public Const TYPE_COURANT As Integer = 0
Public Const TYPE_EPARGNE As Integer = 1
Public Const INTERET_COURANT As Single = 0.01
Public Const INTERET_EPARGNE As Single = 0.025
Public Const IMPOT_ANTICIPE As Single = 0.33

Type compte
nom As String
typeCpte As Integer
solde As Single
End Type

Type client
nom As String
prenom As String
infoCpte() As compte
End Type

mod_unitesFonctionnelles:

'1)
Function calculMontantInteret(ByRef Cpte As compte) As Single

If Cpte.typeCpte = TYPE_COURANT Then
calculMontantInteret = Cpte.solde * INTERET_COURANT
Else: calculMontantInteret = Cpte.solde * INTERET_EPARGNE
End If

End Function

'2)
Function calculMontantImpotAnticipe(ByRef Cpte As compte) As Single

If Cpte.solde > 50 Then
calculMontantImpotAnticipe = calculMontantInteret(Cpte) * IMPOT_ANTICIPE
Else: calculMontantImpotAnticipe = 0
End If

End Function

'3)
Public Sub actualiserCompte(ByRef Cpte As compte)

Cpte.solde = Cpte.solde + calculMontantInteret(Cpte) - calculMontantImpotAnticipe(Cpte)

End Sub

'4)
Public Sub actualiserTousLesComptes(ByRef cl As client)

Dim indice As Integer

For i = 1 To UBound(cl.infoCpte)

actualiserCompte (cl.infoCpte(indice))

Next i

End Sub

'5)
Public Sub afficherCompte(ByRef Cpte As compte)

Dim affichage As String

affichage = "Nom : " & Cpte.nom & vbNewLine & "Solde : " & Cpte.solde & vbNewLine & " Type de compte : "

If (Cpte.typeCpte = TYPE_COURANT) Then
affichage = affichage & "Compte courant"
Else: affichage = affichage & "Compte épargne"
End If

MsgBox (affichage)

End Sub

'6)
Public Sub afficherComptes(ByRef c() As compte)

Dim indice As Integer

For indice = 1 To UBound(c)
afficherCompte (c(indice))
Next indice

End Sub

'7)
Public Sub afficherClient(ByRef cl As client)

Dim affiche As String
Dim indice As Integer

affiche = "Nom du client : " & cl.nom & vbNewLine & "Prénom du Client : " & cl.prenom
MsgBox (affiche)
afficherComptes (cl.infoCpte)


End Sub

mod_test:

Public Sub test()

Dim cl As client

cl.nom = "Gourmet"
cl.prenom = "Alexandre"

cl.infoCpte(1).nom = "Compte courant"
cl.infoCpte(1).typeCpte = 0 'compte courant
cl.infoCpte(1).solde = 39

cl.infoCpte(2).nom = "Compte épargne 1"
cl.infoCpte(2).typeCpte = 1 'compte épargne
cl.infoCpte(2).solde = 2033

cl.infoCpte(3).nom = "Compte épargne 2"
cl.infoCpte(3).typeCpte = 1 'compte épargne
cl.infoCpte(3).solde = 123456789


afficherClient (cl)

actualiserTousLesComptes (cl)

afficherClient (cl)

End Sub

2 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
7 nov. 2013 à 23:36
Bonjour,
Prochaine fois précise sur quel ligne tu a l'erreur, ça sera plus facile à trouver.
Public Sub test()

Dim cl As Client
ReDim cl.infoCpte(3)

cl.nom = "Gourmet"
cl.prenom = "Alexandre"
....

A+
0
Jean-CharlesDucommun Messages postés 2 Date d'inscription jeudi 7 novembre 2013 Statut Membre Dernière intervention 8 novembre 2013
8 nov. 2013 à 14:29
Bonjour,

L'erreur se situe dans le module de test (intitulé mod_test) à la fin de la procédure, à la ligne "afficherClient (cl) ". Aurais-tu une autre idée ? Car ta première solution ne résout pas problème.

Merci d'avance
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
8 nov. 2013 à 15:11
Déjà, si tu n'avais pas mis la ligne que je t'ai renseigné, l'erreur était sur la ligne
cl.infoCpte(1).nom = "Compte courant" 

Ensuite, sois plus attentif dans les transferts.
Tu met afficherComptes (cl.infoCpte) mais la procédure attend un objet Compte..
0