[VBA] [Access] Soucis de byref et conversion de type

Soucis de byref et conversion de type [VBA] [Access] - VB/VBA/VBS - Programmation

Marsh Posté le 30-04-2013 à 15:25:30    

Bonjour à tous, je suis confrontée à un problème qui dure depuis quelques jours maintenant et je ne sais comment le solutionner. jJ remercie par avance les personnes qui voudront bien se pencher sur mon cas, et m'aider à élucider ce soucis.  :wahoo:  
 
Voilà, j'ai créé une base de données où j'entre les réponses des individus à un formulaire de 10 questions dans la table Suivi Aidant. (Les variables contenant les réponses aux 10 questions s'appelant SFQ31 SFQ32 SFQ33 [...] SFQ39 SFQ310)
En fonction de leurs réponses, apportées aux dix questions, j'obtiens un score (variable SFPF).
Ce score est calculé de la manière suivante :  
 
Par question,
si la réponse est 1, cela vaut 0 point
si la réponse est 2, 50 points
si la réponse est 3, 100 points
si la réponse est 9, valeur manquante
 
On fait la somme des points cummulés par question, le tout étant divisé par 10, pour obtenir le score,
Remarque : si une valeur manquante figure parmi les réponses, ou une case n'est pas complétée, on n'exécute aucun calcul.
 
exemple :  
réponses : 1 1 1 1 1 2 2 2 2 2
score : (0 +0 +0 +0 +0 +50 +50 +50 +50 +50)/10 = 25
 
Voici les codes VBA :  
 
Public Function CalculScore(prmSFQ31 As Variant, prmSFQ32 As Variant, prmSFQ33 As Variant, prmSFQ34 As Variant, prmSFQ35 As Variant, prmSFQ36 As Variant, prmSFQ37 As Variant, prmSFQ38 As Variant, prmSFQ39 As Variant, prmSFQ310 As Variant) As Double
   Dim result As Double
   Const CALCUL_IMPOSSIBLE As Long = 99999
 
   If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
        result = CALCUL_IMPOSSIBLE
   ElseIf prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
        result = CALCUL_IMPOSSIBLE
      Else
         result = result + CalculScoreQuestion(prmSFQ31)
         result = result + CalculScoreQuestion(prmSFQ32)
         result = result + CalculScoreQuestion(prmSFQ33)
         result = result + CalculScoreQuestion(prmSFQ34)
         result = result + CalculScoreQuestion(prmSFQ35)
         result = result + CalculScoreQuestion(prmSFQ36)
         result = result + CalculScoreQuestion(prmSFQ37)
         result = result + CalculScoreQuestion(prmSFQ38)
         result = result + CalculScoreQuestion(prmSFQ39)
         result = result + CalculScoreQuestion(prmSFQ310)
         result = result / 10
   End If
CalculScore = result
End Function
 
-------------------------------------------------------------
 
Private Function CalculScoreQuestion(prmSFPF As Long) As Double
   Select Case prmSFPF
       Case 1: result = 0
       Case 2: result = 50
       Case 3: result = 100
       Case Else
           'Cas impossible
           ' Error 5
   End Select
   CalculScoreQuestion = CalculScoreQuestion + result
End Sub
-----------------------------------------------------------
 
et la requête SQL :  
 
UPDATE [Suivi Aidant] SET [Suivi Aidant].SFPF = CalculScore([Suivi Aidant].SFQ31,[Suivi Aidant].SFQ32,[Suivi Aidant].SFQ33,[Suivi Aidant].SFQ34,[Suivi Aidant].SFQ35,[Suivi Aidant].SFQ36,[Suivi Aidant].SFQ37,[Suivi Aidant].SFQ38,[Suivi Aidant].SFQ39,[Suivi Aidant].SFQ310);
 
Mon problème est le suivant : lorsque j'exécute la macro, on me dit  
erreur de compilation, type d'argument byref incompatible
 
En magouillant un peu, j'ai vu qu'avec l'inclussion d'un db as database dans calculscore() le problème disparaissait mais laissait place à un nouveau : une fois sur deux la requête n'est pas possible : nombre d'arguments incorrects (surement à cause de db as database.  Et quand bien même elle s'exécuterait, elle trouve un TROISIEME PROBLEME : erreur de conversion de type, alors que mes variables SFQ31 jusqu'à SFQ310 sont définies comme numériques et entiers longs (ce sont cependant des listes déroulantes, le problème vient-il de là?)
et SFPF comme numérique et réel double.
 
En espérant que quelqu'un voudra bien m'aider à sortir de ce soucis ... merci

Message cité 1 fois
Message édité par sephiree le 30-04-2013 à 15:37:16
Reply

Marsh Posté le 30-04-2013 à 15:25:30   

Reply

Marsh Posté le 30-04-2013 à 15:39:46    

sephiree a écrit :

[…] Mon problème est le suivant : lorsque j'exécute la macro, on me dit  
erreur de compilation, type d'argument byref incompatible

            Bonjour.   Curseur sur Function puis touchehttp://www.developpez.net/forums/images/smilies/f1.gif !           Déjà en lisant l'aide du message d'erreur …
 
            Tu verras qu'à la place de l'option par défaut  ByRef  un argument peut être passé par valeur via  ByVal
 

Reply

Marsh Posté le 30-04-2013 à 15:46:50    

J'ai déjà tenté byval, ça ne solutionne pas.
L'aide du message d'erreur n'apporte pas toujours la solution sinon il n'y aurait pas des fora d'entre-aide.
 
edit : quelle gourde je viens de me rendre compte que je n'avais pas mis byval dans ma seconde fonction -_-, autant pour moi
Toutefois il me reste à solutionner la "troisième" erreur qui est erreur de conversion de type...


Message édité par sephiree le 30-04-2013 à 16:02:29
Reply

Marsh Posté le 30-04-2013 à 22:42:36    

Par hasard, le type de ta colonne "[Suivi Aidant].SFPF" c'est bien un double et non un long integer?
 
Edit :  
En exécutant ton vb, il s’arrête sur la ligne :  

result = result + CalculScoreQuestion(prmSFQ31)

 (information qu'il peut être utile de mentionner BTW)
Pcq prmSFQ31 est un variant alors que la fonction attend un long > type différent > erreur 13
 
Si tu veux déclarer et typer tes variables je t'invite à placer "Option Explicit" en entête de tes modules. cela impose de déclarer toute les variables et de les typer (même un typage en variant est autorisé)
Tu as ensuite une option Run > compile [project name] (cela t'aurai indiqué que "result" dans ta seconde fonction n'existe pas et je ne suis pas sur que tu ais le droit de faire " CalculScoreQuestion = CalculScoreQuestion " car cela correspondrais à un espèce d'appel de fonction sans paramètres)
Même sans option explicit, faire le "compile" permet de vérifier si le VB est cohérent avant de lui donner des données à traiter.
 
Les fonctions qui fonctionnent un peu retravaillée des fois qu'un jour tu ai une 11ème question:
avec la même query

Option Compare Database
Option Explicit
 
Const CALCUL_IMPOSSIBLE As Long = 99999
 
Public Function CalculScore(ParamArray p() As Variant) As Double
    Dim result As Double
    Dim i As Long
    Dim t As Double
    For i = LBound(p()) To UBound(p)
        If IsNull(p(i)) Or p(i) = 9 Then
            CalculScore = CDbl(CALCUL_IMPOSSIBLE)
            Exit Function
        Else
            t = CalculScoreQuestion(CLng(p(i)))
            If t < 0 Then
                CalculScore = CDbl(CALCUL_IMPOSSIBLE)
                Exit Function
            Else
                result = result + t
            End If
        End If
    Next i
     
    CalculScore = result / 10
End Function
   
Private Function CalculScoreQuestion(prmSFPF As Long) As Double
   Dim result As Double
   result = -1
   Select Case prmSFPF
       Case 1: result = 0
       Case 2: result = 50
       Case 3: result = 100
       Case Else
           'Cas impossible
           ' Error 5
   End Select
   CalculScoreQuestion = result
End Function


Message édité par Arl Guhr le 01-05-2013 à 00:01:28

---------------
il s'appel le ronge me doute
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed