Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
851 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2188221
sephiree
Posté le 30-04-2013 à 15:25:30  profilanswer
 

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
mood
Publicité
Posté le 30-04-2013 à 15:25:30  profilanswer
 

n°2188227
Marc L
Posté le 30-04-2013 à 15:39:46  profilanswer
 

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
 

n°2188230
sephiree
Posté le 30-04-2013 à 15:46:50  profilanswer
 

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
n°2188283
Arl Guhr
Posté le 30-04-2013 à 22:42:36  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[VBA][Excel] modif- selection onglet source.[résolu]S.O.S excel/access VBA
classe generique et Type generique[VBA-Macros][Excel]Comparaison de deux dates
création d'une base de donnée avec accessAccess: relation entre 3 tables
Attribut readonly pas actif pour un input type checkbox[access 2003] - Incrémentation de Dates
VBA Gestion de Portefeuille, portefeuille optimal 
Plus de sujets relatifs à : [VBA] [Access] Soucis de byref et conversion de type


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR