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 :

appel d'une fonction ayant comme argument l'objet Range


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut appel d'une fonction ayant comme argument l'objet Range
    Salut j'ai voulu faire un appel d'une fonction qui utilise comme argument deux variables de type range, le problème c'est que j'ai ce message:
    " Type d'argument ByRef incompatible"

    En voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub test(X As range, Y As range)
     
    A = range("X" & 1).Value
    B = range("Y" & 1).Value
     
    MsgBox "les valeurs demandées sont" & A & B
     
    End Sub
    -----------------------------------------------
    Private Sub CommandButton1_Click()
    test A, B
    End Sub
    Est ce que la syntaxe est bonne ou y a-t-il quelque qui manque ?

    je vous remercie de votre aide ?

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un objet Range est une cellule
    Un exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test(x As Range, y As Range)
     x.Value = "Toto"
     y.Value = "Tutu"
    End Sub
    Sub r()
     Test Range("A1"), Range("A2")
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Si tu utilises des variables de type Range en paramètre d'une procedure (ou d'une fonction), il faut lui transmettre ce type de variable.

    dans ton cas A et B du commandButton doivent être de type range
    Est ce le cas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
    test A, B
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut
    @corona : Merci pour l'explication fournie, j'ignorais complètement que le range était une cellule, c'est normal je débute

    @jfontaine: peut être que j'ai mal choisi le type des arguments de ma fonction, en faite je veux créer une fonction "comparer (X, Y)" qui compare deux colonnes X et Y ligne par ligne pour l'utiliser dans la suite dans une boucle dans un autre module.

    Quelqu'un a une idée ?

  5. #5
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    en faite je veux créer une fonction "comparer (X, Y)" qui compare deux colonnes X et Y ligne par ligne pour l'utiliser dans la suite dans une boucle dans un autre module.
    Peux tu developper.

    On compare les memes lignes? Que retourne la fonction?

  6. #6
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut
    l".a fonction retourne un "string" si dans le cas d'égalité on met "OK" dans une autre colonne sinon "KO"
    Autremant dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if cells(i,j).value=cells(i,k) then
       cells (i,y) ="OK"
    J, K les indices des colonnes mis en entrées de la fonction en question, le y est l'indice de la colonne ou sera stocké le résultat de la comparaison.

  7. #7
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    A essayer (code non testé)

    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
     
     
    Function comparer(x as integer, y as integer) as String
     
    dim i as long
    dim strTemp as string
     
    strTemp="KO"
     
    for i = 2 to Cells(1, x).End(xlDown).Row
     
        if cells(i,x).value = cells(i,y).value then strtemp="OK"
     
    next i
     
    comparer = strTemp
     
    end function

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    on en revient au même problème d’où viennent tes variables A et B ?

    Citation Envoyé par jfontaine Voir le message
    ....

    dans ton cas A et B du commandButton doivent être de type range
    Est ce le cas?
    ..

  9. #9
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut
    Citation Envoyé par bbil Voir le message
    on en revient au même problème d’où viennent tes variables A et B ?
    j'ai changé l'appel de la fonction comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test Range("A1"), Range("B1")
    ça passé mais à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = 1 To Range("X1").End(xlDown).Row
    ça indique un "dépassement de capacité", le row prend la valeur max de 65535 !! donc il faut en trouver une autre méthode pour détecter la dernière ligne nn ?

  10. #10
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,déjà sélectionner Integer puis F1
    mais aussi lire et assimiler http://silkyroad.developpez.com/vba/fonctions/

  11. #11
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    Salut,déjà sélectionner Integer puis F1
    mais aussi lire et assimiler http://silkyroad.developpez.com/vba/fonctions/
    loool oui parfois on arrive à faire rentrer un tigre dans un sac de voyage

    de toute façon sur l'exemple sur lequel j’exécute mon code je suis sure de ne pas dépasser la taille max d'un integer, donc j'ai changé le "X1" en "X", ça marché :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To Range("X").End(xlDown).Row
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("X" & i).Value = Range("Y" & i).Value
    la valeur est toujours vide du coup le résultat est toujours OK !!!

  12. #12
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par boguista1985 Voir le message
    j'ai changé l'appel de la fonction comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test Range("A1"), Range("B1")
    ça passé mais à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = 1 To Range("X1").End(xlDown).Row
    ça indique un "dépassement de capacité", le row prend la valeur max de 65535 !! donc il faut en trouver une autre méthode pour détecter la dernière ligne nn ?
    .. attention de bien relire ton code avant de re-poster une question ..

    pour
    For i = 1 To Range("X").End(xlDown).Rowje ne crois pas au :
    donc j'ai changé le "X1" en "X", ça marché

  13. #13
    Membre averti
    Homme Profil pro
    BOGA
    Inscrit en
    Avril 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BOGA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 24
    Par défaut
    Citation Envoyé par bbil Voir le message
    .. attention de bien relire ton code avant de re-poster une question ..

    pour
    For i = 1 To Range("X").End(xlDown).Rowje ne crois pas au :
    si si voila un imprim écran :

    By boguista at 2011-07-24

    En faite, c'est que je tiens aux range c'est que j'ai un tableau Excel de plusieurs colonnes, sur lesquelles je ferais des comparaisons.
    j'ai pensé:
    1/ à définir les colonnes de données dans des ranges
    Exemple : range("A1:A10").name="DATA_1"
    2/ faire une procédure pour la comparaison entre 2 colonnes qui fait retourner un string "ok" ou "KO"
    Exemple:
    Compare(DATA_1, DATA_2)

    Si vous avez d'autres idées que la mienne, j'en serais ravi
    merci

Discussions similaires

  1. Bouton avec une fonction ayant en argument une autre fonction
    Par Serratonique dans le forum Général Python
    Réponses: 8
    Dernier message: 28/02/2014, 18h53
  2. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  3. [JavaScript] [FAQ] Appeler dynamiquement une fonction et passer une fonction en argument
    Par SpaceFrog dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/05/2008, 14h48
  4. [PHP-JS] Variable PHP comme argument dans l'appel d'une fonction Javascript
    Par The Molo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/04/2007, 09h00
  5. Réponses: 14
    Dernier message: 16/05/2006, 11h26

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