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

Macros et VBA Excel Discussion :

Type d'argument ByRef incompatible


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Par défaut Type d'argument ByRef incompatible
    Bonjour,

    j'ai un message d'erreur à l'exécution de mon code mais je ne comprends pas pourquoi. Est-ce que quelqu'un a une idée pour résoudre ce problème ?

    Merci d'avance.

    Voici l'erreur que j'ai à l'exécution de mon code :
    "Erreur de compilation:
    Type d'argument ByRef incompatible"

    Et voici mon code qui est assez simple :

    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
    39
    40
    41
    42
    43
    44
    45
    46
     
    Option Explicit
     
    Type RF
        site As String
        tranche As String
    End Type
     
    Type Action
        equipement As RF
        position As String
    End Type
     
    Sub Export(ByRef config As Action)
        'Ecrit dans le fichier txt
        Dim chemin As String
        Dim ligne As Integer
     
        chemin = "C:\Users\utilisateur\Desktop\Export.csv"
        Open chemin For Output As #1
        For ligne = 0 To UBound(config)
            Print #1, config(ligne).position,
        Next ligne
        Close #1
        MsgBox ("Export effectué avec succès !")
    End Sub
     
    Sub main()
        Dim equipement1 As RF
        Dim equipement2 As RF
        Dim config(2) As Action
     
        equipement1.site = "SITE1"
        equipement1.tranche = "TRANCHE1"
     
        equipement2.site = "SITE2"
        equipement2.tranche = "TRANCHE2"
     
        config(0).equipement = equipement1
        config(0).position = "POSITION1"
     
        config(1).equipement = equipement2
        config(1).position = "POSITION2"
     
        Call Export(config)
    End Sub

  2. #2
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut type d'argument byref incompatible
    Bonsoir,

    C'est quoi "config" nul part défini ?

    EDIT: autant pour moi, je n'avais pas vu que sub meain etait exécuté en premier.

    Cordialement.

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    normalement rien qu'en lisant l'aide du message d'erreur (tout dépend de la version) …

    Ou encore curseur sur ByRef (sinon Sub) puis touche puis lire, solution dans l'aide intégrée !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je vais peut être dire une bétise, mais en principe, dans les Sub/fonctions les " Types Personnels " doivent toujours être passer en ByVal, jamais en ByRef dans les fonctions.

    Mais à confirmer cependant. C'est en tout cas valable pour les API (Byref pour les Type ) alors c'est surement pareil à l'inverse pour les sub/fonctions.

    EDIT:
    Dernière modification par Invité ; 20/09/2013 à 22h30.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 161
    Par défaut
    Bonjour à tous,
    Marc-L je regardais moi aussi ce poste mais mon niveau ne me permet pas de comprendre comment résoudre cette difficulté j'ai suivie tes conseils mais l'aide non plus je ne la comprend pas ce serait bien si tu pouvais développer un peu sur ce problème et nous mettre sur la voie cordialement

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Maintenant Nouveau2 a donné la réponse …

    Pourtant c'est indiqué en clair dans l'aide, deux types de passages d'argument, donc quand c'est pas l'un, c'est l'autre …

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 161
    Par défaut
    Bonjour à tous,
    J'avais suivi les conseils de Nouveau2 avant de relancer le post mais je reçois un message d'erreur
    Un type défini par l'utilisateur ne peut être passé par valeur (ByVal)
    j'ai essayé de suivre l'aide et de déclarer en dim "config" mais rien n'y fait
    Les types définis par l'utilisateur peuvent être passés uniquement par référence (par défaut), et non par valeur. L'erreur n'est signalée que lors de l'appel. Cause et solution de cette erreur :

    Vous avez utilisé un mot clé ByVal dans la définition d'un paramètre représentant un type défini par l'utilisateur.
    Retirez le mot clé ByVal. Pour éviter que des modifications soient répercutées au demandeur, déclarez (Dim) une variable temporaire du type et passez-la dans la procédure.
    cordialement

  8. #8
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ah donc c'est comme pour les décalation d'API, toujours en ByRef, je croyais que c'était l'inverse pour les fonctions/sub (je ne sais pourquoi).

    Par contre, je vois un tableau au niveau du "Config" en sortie du sub Main, mais une variable basique en entrée de sub Export ?

  9. #9
    Invité
    Invité(e)
    Par défaut Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim config(2) As Action
    Call Export(config)
    ça ne te gènes pas de passer un tableau en paramètre alors que la variable de la fonction n'est pas un tableau?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Export(ByRef config As Action)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Export(ByRef config As Variant)

  10. #10
    Invité
    Invité(e)
    Par défaut
    Un début de réponse ici, mais il faudra enlever l'erreur à Ubound et autre.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
     
    Type RF
        site As String
        tranche As String
    End Type
     
    Type Action
        equipement() As RF
        position() As String
    End Type
     
    Sub Export(ByRef config As Action)
        'Ecrit dans le fichier txt
        Dim chemin As String
        Dim ligne As Integer
     
        chemin = "C:\Users\utilisateur\Desktop\Export.csv"
        'Open chemin For Output As #1
        'For ligne = 0 To UBound(config.position)
            'Print #1, config(ligne.position(1))
        'Next ligne
        Close #1
        MsgBox ("Export effectué avec succès !")
    End Sub
     
    Sub main()
        Dim equipement1 As RF
        Dim equipement2 As RF
        Dim config As Action
     
     
        equipement1.site = "SITE1"
        equipement1.tranche = "TRANCHE1"
     
        equipement2.site = "SITE2"
        equipement2.tranche = "TRANCHE2"
     
        ReDim config.equipement(1 To 2)
        ReDim config.position(1 To 2)
     
        config.equipement(1) = equipement1
        config.position(1) = "POSITION1"
     
        config.equipement(2) = equipement2
        config.position(2) = "POSITION2"
     
        Export config
    End Sub
    Tu as le droit de faire passer des tableaux, mais pas au niveau du Type de données. On peut comparer à une variable Range, cette variable possède un tableau en elle au niveau du .Value2 en 2 dimensions.

    Pour les fichier csv, les autres t'aideront, je n'y comprends rien.
    Les données passe comme ça:
    Images attachées Images attachées  
    Dernière modification par Invité ; 21/09/2013 à 12h51.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Essayez avec votre code modifié
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Type RF
      site As String
      tranche As String
    End Type
     
    Type Action
      equipement As RF
      position As String
    End Type
     
     
     
    Sub Export(config() As Action)    '///le paramètre étant un tableau, il faut spécifier l'argument comme tel avec des ()
    MsgBox "Limite basse : " & LBound(config)
    MsgBox "Limite haute : " & UBound(config)
    '---
    MsgBox config(0).equipement.site
    MsgBox config(0).equipement.tranche
    MsgBox config(0).position
    '---
    MsgBox config(1).equipement.site
    MsgBox config(1).equipement.tranche
    MsgBox config(1).position
     
    '### suite de votre traitement à adapter selon ci-dessus ###
    '    'Ecrit dans le fichier txt
    '    Dim chemin As String
    '    Dim ligne As Integer
    '
    '    chemin = "C:\Users\utilisateur\Desktop\Export.csv"
    '    Open chemin For Output As #1
    '    For ligne = 0 To UBound(config)
    '        Print #1, config(ligne).position,
    '    Next ligne
    '    Close #1
    '    MsgBox ("Export effectué avec succès !")
    End Sub
     
    Sub main()
    Dim equipement1 As RF
    Dim equipement2 As RF
    Dim config(1) As Action 'config(1) contient 2 éléments (Option base n'étant pas spécifié)
     
    equipement1.site = "SITE1"
    equipement1.tranche = "TRANCHE1"
     
    equipement2.site = "SITE2"
    equipement2.tranche = "TRANCHE2"
     
    config(0).equipement.site = equipement1.site
    config(0).equipement.tranche = equipement1.tranche
    config(0).position = "POSITION1"
     
    config(1).equipement.site = equipement2.site
    config(1).equipement.tranche = equipement2.tranche
    config(1).position = "POSITION2"
     
    Call Export(config)
    End Sub
    Si cela vous convient, il faudra extrapoler la suite du traitement.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Intéressant, je pensant que seul le variant permettait de transmettre un tableau au niveau du type de la variable.

    EDIT: J'ai confondu avec les fonctions ParamArray pour le passage des Tableaux Variant obligatoire.

    Sinon un code équivalent qui permet de ne pas déclarer inutilement des variable tel que equipement qui sont déjà un sous-type de Action, le redim et les tableaux dynamique finalement sont inutile si la taille des sous-type doivent être la même à chaque fois :
    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
    39
    40
    Option Explicit
     
    Type RF
        site As String
        tranche As String
    End Type
     
    Type Action
        equipement(1 To 2) As RF 'Sous type de taille Fixe
        position(1 To 2) As String 'Sous type de taille Fixe
    End Type
     
    Sub Export(ByRef config As Action)
        'Ecrit dans le fichier txt
        Dim chemin As String
        Dim ligne As Integer
     
        chemin = "C:\Users\utilisateur\Desktop\Export.csv"
        'Open chemin For Output As #1
        'For ligne = 0 To UBound(config.position)
        '    Print #1, config.position(ligne)
        'Next ligne
        'Close #1
        MsgBox ("Export effectué avec succès !")
    End Sub
     
    Sub main()
        Dim config As Action
     
        config.equipement(1).site = "SITE1"
        config.equipement(1).tranche = "TRANCHE1"
     
        config.equipement(2).site = "SITE2"
        config.equipement(2).tranche = "TRANCHE2"
     
        config.position(1) = "POSITION1"
        config.position(2) = "POSITION2"
     
        Export config
    End Sub
    Cela revient au même, mais il n'y a pas à se soucier de déclarer des variable ou même des tableaux, c'est le type qui s'en occupe.



    ----------------------------------------------------------------------------------

    Apparemment, c'est pas le cas pour la taille fixe, donc (ce qui revient au même que le code de PMO2017 finalement):
    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
    39
    Option Explicit
     
    Type RF
        site As String
        tranche As String
    End Type
     
    Type Action
        equipement As RF
        position As String
    End Type
     
    Sub Export(ByRef config() As Action)
        'Ecrit dans le fichier txt
        Dim chemin As String
        Dim ligne As Integer
     
        chemin = "C:\Users\utilisateur\Desktop\Export.csv"
        'Open chemin For Output As #1
        'For ligne = 0 To UBound(config.position)
        '    Print #1, config.position(ligne)
        'Next ligne
        'Close #1
        MsgBox ("Export effectué avec succès !")
    End Sub
     
    Sub main()
        Dim config(1 To 2) As Action
     
        config(1).equipement.site = "SITE1"
        config(1).equipement.tranche = "TRANCHE1"
        config(1).position = "POSITION1"
     
        config(2).equipement.site = "SITE2"
        config(2).equipement.tranche = "TRANCHE2"
        config(2).position = "POSITION2"
     
        Export config
    End Sub
    Images attachées Images attachées   
    Dernière modification par Invité ; 22/09/2013 à 05h26.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 161
    Par défaut
    Bonjour à tous,
    ce n'est pas moi qui ai postée cette question mais ça me fait progresser et apprendre alors merci a ceux qui avec humilité et pertinence on sut apporter une aide concrète et constructive

Discussions similaires

  1. [XL-2007] type d'arguments ByRef incompatible
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 14/04/2019, 19h31
  2. [XL-2010] Erreur de compilation; Type d'argument ByRef incompatible
    Par Toug19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/05/2015, 16h01
  3. Type d'argument Byref incompatible
    Par Glherbier dans le forum VBA Access
    Réponses: 13
    Dernier message: 02/11/2010, 10h30
  4. [AC-2007] Type d'argument ByRef incompatible dans un module
    Par KIK83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/12/2009, 15h01
  5. [VB]type d'arguments byref incompatibles
    Par kantelise dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/04/2006, 08h56

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