IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Erreur "ByRef" pour un calcul de Médiane [AC-2000]


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut Erreur "ByRef" pour un calcul de Médiane
    Bonjour à tous.

    C'est toujours avec plaisir que je trouve sur developpez.com des réponses précises à mes questions de néophyte.

    Ce matin c'est une méchante histoire de calcul de Médiane dans un état dont la solution est proposée par Tofalu

    http://access.developpez.com/sources/?page=Conv#Mediane

    J'ai donc copié cette fonction dans ma base, mais lorsque je l'appelle, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Report_Open(Cancel As Integer)
    MedianeMO = fMediane(T_ISB, MO)
    End Sub
    ... j'ai un message d'erreur "type d'argument ByRef incompatible" avec le nom de la table (T_ISB) surligné.

    Quelqu'un a-t'il une idée de mon erreur ?

    Merci

  2. #2
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Bonjour :

    T_ISB

    n'est il pas NULL ?

  3. #3
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    non,

    pour l'instant dans ma base test, j'ai 2 enregistrements dans cette table, et donc 2 valeurs pour MO

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    vérifie que les types de données que tu passes en paramètres sont bien ceux attendus dans la définition de la fonction
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    de retour sur ce sujet ...

    merci de vos aides respectives.

    Je n'ai toujours pas de solution.

    Les données que je passe en paramètre quand j'appelle la fonction lors de l'ouverture de l'état sont le nom de la table et le nom du champ (sauf si j'ai mal compris la fonction de Tofalu). Je ne sais pas comment vérifier le type de ces données, mais il me parait naturel que ce soit des string. non ???

    Où auriez-vous placé cette fonction? dans un module ou dans l'état ?

    J'ai tenté les 2 sans différence.

    J'aurai voulu appeler cette fonction depuis une requête pour pouvoir visualiser les médianes à côtés des moyennes des mini et maxi, ... et pouvoir faire des graph avec tout ça . Y a t il une astuce particulière à savoir ?


    @+

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    mais ta table s'appelle T_ISB ou bien est-ce la variable qui contient le nom de la table ?

    attention ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MedianeMO = fMediane(T_ISB, MO)
    n'est pas la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MedianeMO = fMediane("T_ISB", "MO")
    En es-tu conscient ?

    que valent tes variables T_ISB et MO ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    J'avoue humblement ne pas être un cador du VB et les subtilités des " sont souvent assez hermétiques pour moi (mais je ne demande qu'a apprendre -dans la mesure de mon temps disponible- )

    Alors:

    T_ISB est bien le nom de ma table
    et
    MO est bien le nom du champ dans la table T_ISB (champ pour lequel j'aimerai calculer la médiane ...)

    dans le doute, je viens de mettre des "" effectivement le résultat est un peu différent maintenant le message d'erreur est :

    erreur d'exécution -2147352567 (80020009)
    impossible d'attribuer une valeur à cet objet

    et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MedianeMO = fMediane(T_ISB, MO)
    est surlignée en jaune

    Est-ce que j'aurai oublié de déclarer des variables ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Ok,
    de quel type de variable est ton MedianeMO ?

    as-tu passé tes paramètres sous forme de chaînes de caractères ?

    peux-tu nous copier la fonction fMediane dans ton module stp ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    MedianeMO est une zone de texte (Textbox) indépendante, de mon état. Quand je jette un oeil sur les propriétés, je ne vois pas où on précise le type de variable (Format ?? : il est vierge)

    ... passer les paramètres sous forme de chaine de caractères heu .... c'est quoi ? c'est comment ?

    La fonction fMediane qui est dans mon module est exactement celle de Tofalu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Public Function fMediane(strTable As String, strField As String) As Variant
     
    Dim oDBS As DAO.Database
    Dim oRST As DAO.Recordset
    Dim blnEven As Boolean
    Dim vntMedian As Variant
     
      Set oDBS = CurrentDb()
      Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " ORDER BY " & strField)
     
      If oRST.EOF = False Then
         oRST.MoveLast
         'Y a-t'il un nombre pair d'enreistrements ?
         blnEven = (oRST.RecordCount Mod 2 = 0)
         'Classer en décroissant si on a un nombre pair
         oRST.PercentPosition = 50
         vntMedian = oRST.Fields(strField)
         If blnEven Then
             oRST.MoveNext
             'faire la moyenne entre cet enregistrement et le précédent
             vntMedian = (vntMedian + oRST.Fields(strField)) / 2
         End If
      End If
     
      fMediane = vntMedian
      oRST.Close
      Set oRST = Nothing
      Set oDBS = Nothing
     
    End Function

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Ok,
    et donc lorsque tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Report_Open(Cancel As Integer)
    MedianeMO = fMediane("T_ISB", "MO")
    End Sub
    tu as une erreur ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    Oui

    erreur d'exécution -2147352567 (80020009)
    impossible d'attribuer une valeur à cet objet

  12. #12
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 040
    Par défaut
    ...erreur d'exécution -2147352567 (80020009)
    impossible d'attribuer une valeur à cet objet

    et la ligne
    Code :

    MedianeMO = fMediane(T_ISB, MO)

    est surlignée en jaune ...
    Quand tu as cette ligne surlignée en jaune, presse plusieurs fois la touche F8, jusqu'à trouver la ligne qui déclenche cette erreur

  13. #13
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    C'est toujours au niveau de la ligne
    "MedianeMO = fMediane("T_ISB", "MO")" que le message
    "erreur d'exécution -2147352567 (80020009)
    impossible d'attribuer une valeur à cet objet" apparait.

    La fonction marche bien. Le résultat est bien calculé, et je peux d'ailleurs la reprendre dans ma requête comme souhaité. (cf image)

    Le problème c'est que j'aurais voulu afficher ça dans un contrôle de mon état et que je n'arrive pas à lui faire prendre cette valeur.

    Si c'est pas possible comme ça, et bien tant pis, je passerai par une requête qui calculera la Médiane avec la fonction qui va bien et je ferai mon état à partir de cette requête.
    Images attachées Images attachées  

  14. #14
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    mais si tu mets le code non pas dans Report_Open, mais dans Detail_Print, tu dois pouvoir modifier la valeur de ton objet...
    ou alors tu essaies d'attribuer une valeur à un contrôle lié à un champs...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  15. #15
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    Vous êtes fabuleux !!

    j'ai changé mon code en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
    Me.MedianeMO = fMediane("T_ISB", "MO")
    End Sub
    Et ça marche !

    Je vais maintenant juste légèrement modifier la fonction Médiane de Tofalu car il semble qu'elle ne renvoi rien quand le champ ne contient qu'un enregistrement. Il vaudrai mieux qu'elle renvoi la valeur de cet enregistrement.

    Merci encore à tous !

  16. #16
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    Bonjour,

    Pour info : j'ai retiré le tag "résolu" car la fonction "médiane" me pose encore quelques soucis : Quand je l'appelle dans une requête au lieu de calculer la médiane pour chaque catégorie regroupée, elle renvoi partout le même résultat qui est la médiane de toute la table.

    Comme ça concerne sans doute plus une question de requête, j'ai créé un post principal sur ce sujet dans le forum requête.

    http://www.developpez.net/forums/d83...e/#post4794771

  17. #17
    Membre confirmé
    Profil pro
    autre
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Par défaut
    Pour corriger le problème évoqué ci-dessus, voici le code proposé par Muhad'hib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     Public Function fMediane(strTable As String, strField As String, Optional Arg_Champ_Regroupement As String, Optional Arg_Valeur_Regroupement) As Variant
     
    Dim oDBS As DAO.Database
    Dim oRST As DAO.Recordset
    Dim blnEven As Boolean
    Dim vntMedian As Variant
     
      Set oDBS = CurrentDb()
        If IsMissing(Arg_Regroupement) Then
        Sql = "SELECT " & strTable & ".* FROM " & strTable & " ORDER BY " & strTable & "." & strField & ";"
      Else
        Sql = "SELECT " & strTable & ".* FROM " & strTable & " WHERE " & strTable & ".[" & Arg_Champ_Regroupement & "]=" & Arg_Valeur_Regroupement & " ORDER BY " & strTable & "." & strField & ";"
     
      End If
     
      Set oRST = oDBS.OpenRecordset(Sql, dbOpenDynaset)
     
     
      If oRST.EOF = False Then
         oRST.MoveLast
         'Y a-t'il un nombre pair d'enreistrements ?
         blnEven = (oRST.RecordCount Mod 2 = 0)
         'Classer en décroissant si on a un nombre pair
         oRST.PercentPosition = 50
         vntMedian = oRST.Fields(strField)
         If blnEven Then
             oRST.MoveNext
             'faire la moyenne entre cet enregistrement et le précédent
             vntMedian = (vntMedian + oRST.Fields(strField)) / 2
         End If
      End If
     
      fMediane = vntMedian
      oRST.Close
      Set oRST = Nothing
      Set oDBS = Nothing
     
    End Function
    Ça marche parfaitement si on prends la précaution de faire une requête intermédiaire pour rassembler le champ de regroupement et les valeurs à intégrer dans le calcul de la Médiane.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo