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 :

Fonction sous VBA - comment déclarer


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut Fonction sous VBA - comment déclarer
    Bonjour,

    J'ai créé un code de mise en forme, que j'aimerais appliquer à quatre tableaux totalement similaires.
    Problème : le code fait plusieurs centaines de lignes, et je n'ai pas envie de le copier coller 4 fois pour l'appliquer au retraitement des quatres tableaux.

    Je ne maîtrise pas trop les fonctions VBA, et je voulais donc savoir si il était possible de créer une fonction pour ce type de code ?

    Si oui, comment l'implémenter?

    Je vous remercie d'avance

    A bientôt

  2. #2
    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,

    tu peux écrire le code en question dans un module plutôt qu'ua niveau de la feuille de tes tableaux.

    Pour l'appliquer à plusieurs reprises sur différents tableaux, il faut utiliser les paramètres dans ta fonction/procédure.

    Tu pourras y passer des plages de cellules ou un nom de tableau, voire une combinaison des deux

    Peut-on avoir une partie de ton code actuel, pour proposer des adaptations ?
    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

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Une fonction reçoit des paramètres et retourne une valeur (du type défini pour la fonction).
    Elle s'utilise en lui passant les paramètres qu'elle doit traiter.
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CommandButton1_Click()
      Dim toto As Integer, titi As Integer
      toto = 5
      titi = 3
      MsgBox tafonction(toto, titi)
     
    End Sub
     
    Private Function tafonction(byval n1 As Integer,  byval n2 As Integer) As Integer
      tafonction = n1 + n2
    End Function
    Reste à savoir ce que fait ton code et si c'est vraiment d'une fonction que tu as besoin ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Merci de vos réponses !

    Pour être plus précis, on considère que j'ai des tableaux sur "feuil1", "feuil2", "feuil3", "feuil4" ayant tous le même format et des données différentes.

    J'ai voulu créer une fonction de mise en forme.
    Individuellement, mon code fonctionne, mais lorsque j'essaie de le mettre sous forme de fonction, le message d'erreur suivant m'est retourné : "objet requis"

    Par exemple, j'appelle la conction de la manière suivante pour la mise en forme sur feuil1:
    MEF_1er_slide(Feuil1)

    Voici mon code qui concerne la fonction
    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
     
     
    Static Function MEF_1er_slide(nom_table As Worksheet)
    ThisWorkbook.Sheets("nom_table").Activate
    'Mettre en forme les en-têtes du tableau
    Range(Cells(1, 1), Cells(1, 4)).Select
    Selection.Font.Bold = True ' mettre en gras
    Selection.Font.ColorIndex = 2 ' mettre en blanc
    Selection.Interior.ColorIndex = 30 ' mettre la cellule en bordeau
    Cells(1, 1).Value = "Notations"
    Cells(1, 2).Value = "Circuit"
    Cells(1, 3).Value = "En nombre"
    Cells(1, 4).Value = "En %"
     
    'Centrer les données du tableau
    Cells(1, 1).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    With Selection
    .HorizontalAlignment = xlHAlignCenter
    .VerticalAlignment = xlVAlignCenter
    End With
     
    'On tri la colonne A de façon décroissante en déclarant A1 comme en-tête
    Range("A1").Sort , Key1:=Columns("A"), Header:=xlGuess, Order1:=xlDescending
    i = 0
    Cells(1, 1).Select
     
    'On compte le nombre de OK
    For Each cellule In Range(Selection, Selection.End(xlDown))
    If cellule.Value = "OK" Then i = i + 1
    Next
     
    'Réalise la somme pour les "Total"
    Rows(i + 2).Insert
    Cells(i + 2, 1).Value = "Total"
    Cells(i + 2, 3).Value = Application.WorksheetFunction.Sum(Range(Cells(2, 3), Cells(i + 2, 3)))
    Cells(i + 2, 4).Value = Application.WorksheetFunction.Sum(Range(Cells(2, 4), Cells(i + 2, 4)))
     
    'Calcul somme pour "notations (*)"
    Cells(k + 2, 1).Value = "Notations (*)"
    Cells(k + 2, 3).Value = Cells(i + 2, 3).Value + Cells(k + 1, 3).Value
    Cells(k + 2, 4).Value = Cells(i + 2, 4).Value + Cells(k + 1, 4).Value
     
    etc... plein d'autres retraitements
     
    End Function
    Apparemment, je ne peux pas créer ma fonction dans ma "macro1"... donc je l'ai fait en dehors, et j'ai l'impression qu'à aucun moment ma fonction est lue...
    Quand je fais : "outil => Macros => macros" je en vois que ma macro1 et pas ma fonction...


    Je vous remercie d'avance pour votre aide.

  5. #5
    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
    dans un premier temps, sur le code en lui-même,

    - est-ce voulu de passer en paramètre une worksheet globale ?
    - est-ce voulu de passer en dur le nom de la feuille à activer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("nom_table").Activate
    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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    En ce qui concerne le paramètre « worksheet », c’est normal qu’il soit en variable de ma fonction.
    J’aimerais pouvoir appliquer mon code à plusieurs feuilles qui contiennent des tableaux de même format.
    Ainsi il me faudrait appeler 4 fois la même fonction, avec en paramètre le nom de chacune des feuilles, au lieu d’avoir à répéter 4 fois le même code.

    J’aimerais donc pouvoir écrire :
    ma_fonction (feuil1)
    ma_fonction (feuil2)
    ma_fonction (feuil3)
    ma_fonction (feuil4)

    ( "ma_fonction" étant la fonction "MEF_1er_slide" évoquée plus haut dans le topic)

    En ce qui concerne le fait de passer en dur le nom de la feuille à activer est sans doute une erreur de ma part. il aurait probablement été plus judicieux d’enlever les guillemets ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets(nom_table).Activate
    Je ne suis pas certain de la procédure à suivre pour mettre un nom de worksheet en variable d'une fonction
    Il en est de même pour le "type" renvoyé par la fonction... je ne sais pas trop quel type renseigner étant donné qu'il s'agit d'un tableau...

    bref, je suis un peu perdu

    Je ne sais pas si je suis suffisamment clair... :s

  7. #7
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Pour ma part, j'aurais pas fait comme ça.

    J'aurais juste passé le nom de la feuille qui appel la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call NomDuModule.ma_fonction(CStr("feuil1"))
    Si Feuil1 est la feuille active, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call NomDuModule.ma_fonction(CStr(ActiveSheet.Name))
    Ensuite, ta Fonction doit être de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function ma_fonction(NomFeuil As String)
      MsgBox NomFeuil 'affiche le nom de la feuille qui appelle la fonction
    End Function
    Voila !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Merci pour cette réponse !

    Dois-je tapper cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call NomDuModule.ma_fonction(CStr("feuil1"))
    dans un nouveau module ?
    Et à quel moment la feuille à "activer" est spécifiée ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Si je comprend ce que tu veux faire (j'éspère que c'est ça), tu as ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Static Function MEF_1er_slide(nom_table As Worksheet)
    ThisWorkbook.Sheets("nom_table").Activate
    'Mettre en forme les en-têtes du tableau
    Range(Cells(1, 1), Cells(1, 4)).Select
    Selection.Font.Bold = True ' mettre en gras
    Selection.Font.ColorIndex = 2 ' mettre en blanc
    Selection.Interior.ColorIndex = 30 ' mettre la cellule en bordeau
    Cells(1, 1).Value = "Notations"
    Cells(1, 2).Value = "Circuit"
    Cells(1, 3).Value = "En nombre"
    Cells(1, 4).Value = "En %"
    etc... plein d'autres retraitements
    End Function
    Qui est générique a plusieurs onglets.

    Donc, si c'est le cas, place tout ton code (celui du dessus) dans un Module mais modifi ton code de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function MEF_1er_slide(nomtable As String)
    ThisWorkbook.Sheets(nomtable ).Activate
    'Mettre en forme les en-têtes du tableau
    etc... plein d'autres retraitements
    End Function
    Ensuite, si sur ta feuil1 tu veux appeler cette fonction utilise cette procedure (ce code tu peux l'utiliser pour toute tes feuilles):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub AppelerFunction ()
      Call NomDeTonModule.MEF_1er_solide(CStr(ActiveSheet.Name))
    End Sub

    Par contre je ne comprend pas à quel moment tu veux mettre en forme tes feuilles, est-ce que la mise en forme dois ce refaire plusieurs fois?

    Si tu veux mettre en forme tout tes tableaux d'un coup, essaye ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Call NomDeTonModule.MEF_1er_solide(CStr("Feuil1"))
    Call NomDeTonModule.MEF_1er_solide(CStr("Feuil2"))
    Call NomDeTonModule.MEF_1er_solide(CStr("Feuil3"))
    Si tu ne comprend pas quelque chose, n'hesite pas !

  10. #10
    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 une autre idée
    a suposer que ta fonction s'apelle "tartanpion" que tu a bien evidement place dans un module normal

    si ta fonction doit ce faire au depart (a louverture du fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    workbook.open()
     
    call tartanpion
    sita fonction est declenche par un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private sub nomdubouton()
     
    call tartanpion
    et ta fonction tartanpion
    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
        sub tartanpion()
     
    dim nom, i as variant
    nom=feuil
    for i =1 to X ( X represente le nombre de feuille que tu veux traiter)
     
    'dans ta fonction que tu a citer plus haut dans le topic tu remplace les nom de feuilles par
    "feuil"& i
     
    et le reste de ta fonction
     
     
    'et a la fin de la fonction 
    next
    'tu a donc boucler le meme nombre de fois que tu a de feuilles a traiter
    'et a chaque fois le "i"et incrementer de 1
     
    'voila en gros mon idée
    mais ya bien d autre solution
    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Une fois de plus, merci à tous pour vos réponses, elles m'ont toutes apportées une vision des différentes opportunités qui s'offraient pour résoudre mon problème.

    J'ai finalement utilisé la solution de jojo86 qui correspond tout à fait à ce que je voulais faire.

    Merci encore à tous !

    A bientôt

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

Discussions similaires

  1. [AC-2003] comment trouver la procedure Public Fonction sous VBA Access
    Par mohamed9 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/09/2009, 16h57
  2. Réponses: 11
    Dernier message: 19/06/2006, 13h51
  3. Réponses: 12
    Dernier message: 10/06/2006, 19h07
  4. [VBA]localiser un appel fonction sous excel
    Par random dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/01/2006, 10h09
  5. Réponses: 2
    Dernier message: 04/02/2005, 13h23

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