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'arguments ByRef incompatible [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut type d'arguments ByRef incompatible
    Bonjour,

    J'ai une fonction que je déclare ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function ma_fonction(feuille As Worksheet) As Object
    ...
    End Function
    que j'appelle ensuite avec une WorkSheet en arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Noms_Feuille As Object
    Dim feuille As Worksheet
    Set feuille = Worksheets("feuille")
    Noms_Feuille = ma_fonction(feuille)
    cela me génère l'erreur type d'arguments ByRef incompatible

    Je n'ai aucune idée de pourquoi, j'appelle bien ma fonction avec le bon type d'argument et c'est bien du Byref

    Merci pour vos réponses.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut

    j'ignore ce que tu cherches à faire dans ta fonction et crains le pire car le nom Noms_Feuille laisser penser que tu attends un string et non un objet.

    Mais je veux croire qu'en dépit de son nom, tu attends que cette variable représente vraiment objet (ce que ta fonction semble vouloir retourner)...Je te rappelle alors simplement que la valeur d'une variable objet ne s'établit que par un Set
    Ainsi donc ===>>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Noms_Feuille = ma_fonction(feuille)
    (je reste cependant dubitatif sur ce que tu cherches à faire !)

  3. #3
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Ce n'est pas la question... mais oui ma fonction renvoie bien un objet de type dictionnaire contenant les noms des différentes feuilles de mon classeur identifiées par des clefs. (une table de hash)

    le fait de mettre set ne change rien.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Bon.
    Nous allons voir cela.
    Montre l'intégralité de ta fonction. Nous serons alors à même d'en parler en parfaite connaissance de cause

    EDIT :

    et il te suffit de faire cette petite expérience :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    Private Sub CommandButton1_Click()
      Dim Noms_Feuille As Object
      Dim feuille As Worksheet
      Set feuille = Worksheets("feuille")
      Set Noms_Feuille = ma_fonction(feuille) ' ne provoque pas d'erreur
      'Noms_Feuille = ma_fonction(feuille) ' <<=== ceci provoquera une erreur
    End Sub
    Function ma_fonction(feuille As Worksheet) As Object
    '
    End Function
    pour constater :
    - qu'on attribue par Set un objet à une variable (erreur si non)
    - que la connaissance du code de ta fonction est essentielle (sans rien dans la fonction : aucune erreur avec Set)

  5. #5
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Ca ne vient pas du set (c'était juste un oubli) ce que je voulais dire c'est que même la plus simple des fonctions me génère la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function ma_fonction(feuille As Worksheet) As String
    ma_fonction = feuille.Name
    End Function
    qd je teste: c'est toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
        Dim nom_feuille As String
        Dim Feuille As Worksheet
        Set Feuille = Worksheets("feuille")
        nom_feuille = ma_fonction(Feuille)
        Debug.Print nom_feuille
     
    End Sub
    Il doit y'avoir un truc que je ne vois pas!

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par issoram Voir le message
    Ca ne vient pas du set (c'était juste un oubli) ce que je voulais dire c'est que même la plus simple des fonctions me génère la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function ma_fonction(feuille As Worksheet) As String
    ma_fonction = feuille.Name
    End Function
    qd je teste: c'est toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
        Dim nom_feuille As String
        Dim Feuille As Worksheet
        Set Feuille = Worksheets("feuille")
        nom_feuille = ma_fonction(Feuille)
        Debug.Print nom_feuille
     
    End Sub
    Il doit y'avoir un truc que je ne vois pas!
    ce code là ne peut que marcher et marche parfaitement (je viens de l'essayer) !
    Encore faut-il qu'existe la feuille nommée "feuille" dans ton classeur actif !
    Question : dans quoi as-tu placé ton code ?

  7. #7
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Effectivement, le code précédent marche. Je viens de trouver ce qui faisait buguer le truc (mais je ne comprends absolument pas pourquoi). Je serais vraiment curieux d'avoir une explication.

    ça vient du fait que je déclare 2 variables de type WorkSheet sur la même ligne (allez savoir pourquoi?).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Feuille, Toto As Worksheet
    Y'a t'il une erreur de syntaxe?
    Alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Feuille As Worksheet
    Dim Toto As Worksheet
    fonctionne

    dans quoi as-tu placé ton code ?
    je ne vois pas trop ce que tu veux dire?
    il est dans un module vba...?

    Au fait, merci de tes réponses

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par issoram Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function ma_fonction(feuille As Worksheet) As String
    ma_fonction = feuille.Name
    End Function
    qd je teste: c'est toujours la même erreur:

    Il doit y'avoir un truc que je ne vois pas!
    et :

    La feuille existe bien et un


    Debug.Print Feuille.Name

    me renvoie bien feuille.

    et qu'est-ce qui ne va alors pas ?
    Si tu as un message d'erreur, il n'est certes pas provoqué par ce seul code-là, mais par d'autres instructions, ailleurs !

  9. #9
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Cf message modifié ci dessus

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    rappelé plusieurs fois par semaine :
    en VB :
    (exemple)
    ne type que b en string (a reste non typé et donc un Variant) !

    EDIT :
    lu dans l'aide VBA pour l'argument type :
    Facultatif. Type de données de la variable ; elle peut être de type Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (non pris en charge actuellement), Date, String (pour les chaînes de longueur variable), String * length (pour les chaînes de longueur fixe), Object, Variant, un type défini par l'utilisateur ou un type objet. Utilisez une locution As type distincte pour chaque variable que vous déclarez.

  11. #11
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Pour info:

    type bien a et b en String
    renvoie String

    Pour des objets:
    ne type ni a ni b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typename(a)
    typename(b)
    renvoient Nothing

    Et c'est ensuite quand on affecte qqch à l'objet (au niveau du Set) que ça plante

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    j'ignore comment tu fais tes "tests" !!!
    en voilà un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub CommandButton1_Click()
       Dim a, b As String
       MsgBox "a ===> " & TypeName(a) & vbCrLf & "b ===> " & TypeName(b)
       Dim c, d As Object
       MsgBox "c ===> " & TypeName(c) & vbCrLf & "d ===> " & TypeName(d)
    End Sub
    seuls b et d sont typés (b en string et d en object (Nothing pour objet non encore existant.
    a et c ne le sont pas (Empty retourné).

  13. #13
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Tu as parfaitement raison.
    désolé, il devait être tard...

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Type d'arguments ByRef incompatible, une réponse
    Bonsoir,
    Étant programmeur en vba excel épisodique j'oublie parfois la réponse trouvée à un butoir deux ans plus tôt.
    Je programme souvent en option explicit. Je pensais que cela suffisait mais aujourd'hui blocage.
    En déclaration de variables je viens de remarquer que parfois déclarer 2 variables de même type sur la même ligne génère le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Ip01, Dl01, Dc01 As Integer
    En déclarant chaque variable sur une ligne différente le message disparaît lors de l'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Ip01 As Integer
    Dim Dl01 As Integer
    Dim Dc01 As Integer
    Les arcanes de la programmation sont parfois impénétrables!

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour genets34
    il ne s'agit pas de la nécessité de déclarer sur plusieurs lignes, mais de celle de typer expressément chaque variable (que ce soit sur une ligne ou plusieurs).
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim Ip01 As Integer, Dl01 As Integer, Dc01 As Integer
    Aide interne VBA (rubrique Dim, instruction) --->>
    Utilisez une locution As type distincte pour chaque variable que vous déclarez.

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

Discussions similaires

  1. [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, 17h01
  2. Type d'argument ByRef incompatible
    Par caroto dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/09/2013, 14h45
  3. Type d'argument Byref incompatible
    Par Glherbier dans le forum VBA Access
    Réponses: 13
    Dernier message: 02/11/2010, 11h30
  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, 16h01
  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, 09h56

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