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 :

Passage arguments entre fonction et procédure [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Méthode
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Méthode

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Par défaut Passage arguments entre fonction et procédure
    Bonjour,
    Je développe actuellement des petites fonctions basiques dans un module que je pourrais réutiliser à loisir dans mes prochains développements. Une de ces fonctions « compte_ligne » me permet de compter les lignes dans la colonne « A » de la feuille active. La fonction est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function compte_ligne()
    i = Range("A65536").End(xlUp).Row + 1  '--> Compte le nombre de ligne dans la colonne A
    End Function
    En testant cette fonction seule, après avoir ajouté une msgbox pour me renvoyer le résultat, pas de problème. Si j’ai 10 lignes dans la colonne, la msgbox me dit de me positionner sur la 11eme ligne.
    Cela se complique lorsque j’appelle cette fonction via une procédure « test_compte_ligne » .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test_compte_ligne()
    Dim i  As Integer
    i = compte_ligne
    MsgBox i
    End Sub
    La msgbox me renvoie le résultat 0.

    1) Comment puis-je renvoyer le résultat de la fonction « compte_ligne » à la procédure «test_compte_ligne » ? Pour faire un traitement supplémentaire par exemple.

    2) Quelle différence entre fonction et procédure ?

    Je compte améliorer cette fonction en lui passant en argument, la feuille et la colonne.
    Je vous remercie par avance pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function compte_ligne() as integer
     compte_ligne  = Range("A65536").End(xlUp).Row + 1 '--> Compte le nombre de ligne dans la colonne A
     End Function

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut HEU
    bonjour
    65536 c'est pour excel 2003

    afin de la rendre compatible avec toutes les versions d'excel utilise plutot le rows.count
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function compte_ligne() as integer
     compte_ligne  = Range("A"& Rows.Count).End(xlUp).Row + 1 '--> Compte le nombre de ligne dans la colonne A
     End Function
    mais ta comprehention de ton environnement limite les possibilités

    afin de ne pas réécrire la fonction pour changer de colonne et afin de pouvoir utiliser la colonne en chiffre ou en lettre selon le besoins
    je fairais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function compte_ligne(col) as integer
     
    if isnumeric(col) then plage =cells(rows.count,col) 
    else
    plage=Range(col & rows.count)
    end if 
    compte_ligne  = plage.End(xlUp).Row + 1 '--> Compte le nombre de ligne dans la colonne A
    End Function
    exemple d'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub testenchiffre ()
    msgbox  compte_ligne(1)
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub testenlettre()
    msgbox compte_ligne ("A")
    end sub
    on pourrais meme ajouter le sheets mais comprends deja ca et on verra
    a faire des macro pret a l'emploi pour des multiple utilisation diverses autant les faire bien

    A bon entendeur
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re
    pour le sheets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function compte_ligne(sh as worksheet,col as variant ) as integer
     
    with sh
    if isnumeric(col) then plage =.cells(rows.count,col) 
    else
    plage=.Range(col & rows.count)
    end if 
    compte_ligne  = plage.End(xlUp).Row + 1 '--> Compte le nombre de ligne dans la colonne A
    end with
    End Function
    le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub test()
    msgbox compte_ligne(sheets("toto"), "A") ' colonne en lettre 
    msgbox compte_ligne(sheets("toto"), 1) ' colonne en numeric 
    end sub


    oupsss!!!
    j'ai oublié le set devant plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function compte_ligne(sh as worksheet,col as variant ) as integer
     
    with sh
    if isnumeric(col) then set plage =.cells(rows.count,col) 
    else
    set plage=.Range(col & rows.count)
    end if 
    compte_ligne  = plage.End(xlUp).Row + 1 '--> Compte le nombre de ligne dans la colonne A
    end with
    End Function
    
    
    pourquoi je t'ai donné la possibilité de te servir de la lettre ou du chiffre de la colonne
    et bien c'est parce que tu pourrais avoir a trouver la derniere ligne de la colonne d'une cellule en parametre

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub test4()
    msgbox compte_ligne (sheets"toto"),activecell.column)
     
    end sub
    voila la on deja pas mal
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre à l'essai
    Homme Profil pro
    Méthode
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Méthode

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Par défaut Merci - Ca fonctionne
    Merci pour votre réponse. J'ai testé, ça fonctionne.
    Ci-joint le récapitulatif de la fonction et des procédures:
    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
     
    '----------------------------------------------------------------------------
    '-- Cette fonction renvoie le nombre de ligne contenues dans une colonne   --
    '-- Vous devez lui passer en arguments la (Sheet: sh) et la (colonne: col) --
    '--                                                                        --
    '-- ATTENTION : Pas de test sur l'existence de la Sheet !!!!               --
    '----------------------------------------------------------------------------
    Function compte_ligne(sh As Worksheet, col As Variant) As Integer
    With sh
    If IsNumeric(col) Then
        '--> Gere un argument numérique (1,2,3....)
        Set plage = .Cells(Rows.Count, col)
    Else
        '--> Gere un argument alpha (A,B,C......)
        Set plage = .Range(col & Rows.Count)
    End If
        '--> Compte le nombre de lignes dans la colonne
        compte_ligne = plage.End(xlUp).Row
    End With
    End Function
    Procédure N°1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    '---------------------------------------------------------------------------------------
    '-- Cette procédure teste la fonction "compte_ligne" avec un argument alpha           --
    '-- Au préalable:                                                                     --
    '-- Veuillez créer une Sheet nommée "toto" et insérer des valeurs dans la colonne "D" --
    '---------------------------------------------------------------------------------------
    Sub test_compte_ligne_1()
    MsgBox compte_ligne(Sheets("toto"), "D") & " lignes" ' Argument colonne en lettre
    End Sub
    Procédure N°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    '---------------------------------------------------------------------------------------
    '-- Cette procédure teste la fonction "compte_ligne" avec un argument numérique       --
    '-- Au préalable:                                                                     --
    '-- Veuillez créer une Sheet nommée "titi" et insérer des valeurs dans la colonne "3" --
    '---------------------------------------------------------------------------------------
    Sub test_compte_ligne_2()
    MsgBox compte_ligne(Sheets("titi"), 3) & " lignes" ' Argument colonne numerique
    End Sub
    Une autre procédure pour exemple d'utilisation:
    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
     
    '---------------------------------------------------------------------------------
    '-- Exemple utilisation de la fonction compte_ligne                             --
    '-- '-----------------------------------------------------------------------------
    Sub maprocedure()
    '--> Déclaration des variables
    Dim ma_feuille As String
    Dim colonne As String
    Dim mon_text As String
    Dim num_ligne As Integer
    '--> Attribution des valeurs
    ma_feuille = "toto"
    colonne = "D"
    mon_texte = "Nouveau texte"
    '--> Appel de la fonction compte_ligne
    num_ligne = compte_ligne(Sheets(ma_feuille), colonne)
    '--> Selection de la feuille
        Sheets(ma_feuille).Select
    '--> Selection de la cellule
        Range((colonne) & (num_ligne + 1)).Select
    '--> Affectation de la valeur texte à la cellule active
        ActiveCell.Value = mon_texte
    '--> Boxe confirmant l'opération
    MsgBox "Insertion texte : " & mon_texte & Chr(13) & ma_feuille & ":" & colonne & (num_ligne + 1)
    End Sub
    Encore merci a tous !!!!!

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    non tu a rien compris !!
    dans ton dernier exemple tu fait tout ce qu'il faut pas faire
    en general une fonction comme celle la est faite pour t'alleger le travail tout du moins du pc
    toi tu activate ,select a gogo alors qu'il ny en a pas besoins
    ca valait vraiment la peine de t'expliquer hein!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function compte_ligne(sh As Worksheet, col As Variant) As Integer
    With sh
    If IsNumeric(col) Then
        '--> Gere un argument numérique (1,2,3....)
        Set plage = .Cells(Rows.Count, col)
    Else
        '--> Gere un argument alpha (A,B,C......)
        Set plage = .Range(col & Rows.Count)
    End If
        '--> Compte le nombre de lignes dans la colonne
        compte_ligne = plage.End(xlUp).Row
    End With
    End Function
    ici tu envoie un dtring alors que la fonction a besoins d'un object
    ma_feuille = "toto"
    c'est plut ca :
    ma_feuille = sheets("toto")

    ici
    Dim colonne As String ici pourquoi string pourquoi pas variant afin de pouvoir utiliser le chiffre hein!!!!
    colonne = "D" ' pourquoifaire ???????? puisque tu l'injecte

    j'arrete ici car il faut tout revoir

    et en fait si ca a fonctionné chez toi c'est parceque tu a fait l'operation sur le sheets actif sans ca ca aurait planté


    pour faire court
    tu te plante dans le type de variable que tu utilise a profusion sans que cela soit necessaire

    d'ailleurs pour t'en rendre compte il suffit de regarder la longueur de code de (maprocedure) par rapport a la fonction

    voila comment faut utiliser la fonction tout simplement je remplace tout ton code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim ma_feuille As object
    Dim mon_text As String
    mon_texte = "Nouveau texte"
    set ma_feuille =sheets("toto")
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     sheets("toto").cells(num_ligne(ma_feuille,"D"),"D")= mon_texte
    
    ou en numeric
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     sheets("toto").cells(num_ligne(ma_feuille,3),3)= mon_texte
    
    point barre

    non rien compris tu a petit djedail
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Passage d'arguments entre 2 fonctions
    Par romain_t dans le forum Débuter
    Réponses: 3
    Dernier message: 27/11/2010, 12h15
  2. [Débutant] Différence entre fonction et procédure
    Par secondechance dans le forum Langage
    Réponses: 9
    Dernier message: 21/08/2008, 21h11
  3. Diff entre Fonctions et Procédures Stockées
    Par say dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 28/02/2007, 12h19
  4. Diff entre Fonctions et Procédures Stockées
    Par say dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/02/2007, 12h17

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