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 :

Eviter répétition code [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Par défaut Eviter répétition code
    Bonjour à toutes et à tous,

    Peu initié en VBA, je suis tout de même parvenu à réaliser une macro qui satisfasse à mes besoins

    Sauf qu'à plusieurs reprises dans le code, je utiliser un ensemble de lignes de mise en forme et je souhaiterai savoir si il existe un moyen d'éviter cette répétition !?

    Voici un exemple du code répété (au sein de boucles ou unitairement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            sh1.Cells(c, colonne).Interior.Color = RGB(225, 233, 243)
            sh1.Cells(c, colonne).Borders(xlEdgeLeft).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeTop).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeBottom).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeRight).Weight = xlThin
            sh1.Cells(c, colonne).Font.Name = "Calibri"
            sh1.Cells(c, colonne).Font.Size = 10
            sh1.Cells(c, colonne).Font.Bold = True
    j'ai bien essayé de créer une fonction mais j'obtiens dans ce cas une erreur à l'exécution..

    pourriez-vous m'aider SVP ?

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Par défaut
    Dans ton bout de code : qu'est-ce qui sera amené à changer en fonction des boucles ?

    Si par exemple tu veux faire varier selon c et colonne, un code de ce type (j'ai supposé que ce sont des integers) :

    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
    Sub CodeRepet(c As Integer, colonne As Integer)
            sh1.Cells(c, colonne).Interior.Color = RGB(225, 233, 243)
            sh1.Cells(c, colonne).Borders(xlEdgeLeft).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeTop).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeBottom).Weight = xlThin
            sh1.Cells(c, colonne).Borders(xlEdgeRight).Weight = xlThin
            sh1.Cells(c, colonne).Font.Name = "Calibri"
            sh1.Cells(c, colonne).Font.Size = 10
            sh1.Cells(c, colonne).Font.Bold = True 
    End Sub
     
    Sub Main
    'Code avant
    CodeRepet 8,16
    'Code après
    End Sub
    Si le main et ton CodeRepet ne sont pas dans le même module : ajouter un Public devant Sub en première ligne.

  3. #3
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    tu pourrais créer une petite procédure de mise en forme avec les paramètres Feuille, Ligne et Colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MEF(Feuil As Worksheet, Lig As Integer, Col As Integer)
        With Feuil.Cells(Lig, Col)
            .Interior.Color = RGB(225, 233, 243)
            .Borders(xlEdgeLeft).Weight = xlThin
            .Borders(xlEdgeTop).Weight = xlThin
            .Borders(xlEdgeBottom).Weight = xlThin
            .Borders(xlEdgeRight).Weight = xlThin
            .Font.Name = "Calibri"
            .Font.Size = 10
            .Font.Bold = True
        End With
    End Sub
    et l'exécuter à chaque fois que tu en as besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MaMacro()
    '...
    '...
    'mise en forme
    MEF feuille, ligne, colonne
    '...
    '...
    '...
    'mise en forme
    MEF feuille, ligne, colonne
    'etc...
    End Sub

  4. #4
    Membre averti
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Par défaut
    Merci à vous !

    J'ai en effet utilisé une procédure avec les paramètres Feuille, Ligne et Colonne tel qu'indiqué par fring, en réalité, mon erreur (de newbie ) était tout simplement due à l'absence de passage de paramètres...

    En tous cas merci de votre réactivité et de la précision des réponses

    Zyco

  5. #5
    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 174
    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 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    j'ai bien essayé de créer une fonction mais j'obtiens dans ce cas une erreur à l'exécution..
    Ton code que j'ai mis dans un bloc WITH pour la facilité de lecture et où j'ai remplacé ta variable C par R qui me semblait une lettre plus proche de Row
    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
    Sub Proc1()
     Dim sh1 As Worksheet: Set sh1 = ThisWorkbook.Worksheets("Feuil1")
     Dim r As Long, colonne As Long
     r = 2: colonne = 5
     With sh1.Cells(r, colonne)
     .Interior.Color = RGB(225, 233, 243)
     .Borders(xlEdgeLeft).Weight = xlThin
     .Borders(xlEdgeTop).Weight = xlThin
     .Borders(xlEdgeBottom).Weight = xlThin
     .Borders(xlEdgeRight).Weight = xlThin
     .Font.Name = "Calibri"
     .Font.Size = 10
     .Font.Bold = True
     End With
    End Sub
    Tu tapes ton code de mise en forme dans une procédure SUB ou FUNCTION dans laquelle tu prévois comme argument le range sur lequel tu appliquera cette MEF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function MiseEnForme(rng As Range)
     With rng
     .Interior.Color = RGB(225, 233, 243)
     .Borders(xlEdgeLeft).Weight = xlThin
     .Borders(xlEdgeTop).Weight = xlThin
     .Borders(xlEdgeBottom).Weight = xlThin
     .Borders(xlEdgeRight).Weight = xlThin
     .Font.Name = "Calibri"
     .Font.Size = 10
     .Font.Bold = True
     End With
    End Function
    Que tu appelles avec cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub proc2()
     Dim sh1 As Worksheet: Set sh1 = ThisWorkbook.Worksheets("Feuil1")
     Dim maPlage As Range
     Dim r As Long, colonne As Long
     r = 2: colonne = 5
     Set maPlage = sh1.Cells(r, colonne)
     MsgBox "Mise en forme de la plage " & maPlage.Address & MiseEnForme(maPlage)
     Set maPlage = sh1.Range("A5:C8")
     MsgBox "Mise en forme de la plage " & maPlage.Address & MiseEnForme(maPlage)
    End Sub
    Tu pourrais ensuite faire mieux en ajoutant un paramètre supplémentaire qui serait la couleur à appliquer.
    Une procédure comme celle-ci, que j'ai chanhger en SUB comme cela tu as 2 exemples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MiseEnForme(rng As Range, laCouleur As Long)
     With rng
     .Interior.color = laCouleur
     .Borders(xlEdgeLeft).Weight = xlThin
     .Borders(xlEdgeTop).Weight = xlThin
     .Borders(xlEdgeBottom).Weight = xlThin
     .Borders(xlEdgeRight).Weight = xlThin
     .Font.Name = "Calibri"
     .Font.Size = 10
     .Font.Bold = True
     End With
    End Sub
    Que tu appelles par une procédure comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub proc3()
     Dim sh1 As Worksheet: Set sh1 = ThisWorkbook.Worksheets("Feuil1")
     Dim maPlage As Range
     Dim mycolor As Long
     mycolor = RGB(255, 0, 200)
     Set maPlage = sh1.Range("A3:A20")
     MiseEnForme maPlage, mycolor
    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

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

Discussions similaires

  1. Eviter répétition de l'identifiant d'un objet
    Par rtg57 dans le forum Langage
    Réponses: 8
    Dernier message: 26/02/2010, 23h51
  2. Eviter du code redondant
    Par yarf dans le forum Langage
    Réponses: 4
    Dernier message: 20/11/2008, 17h13
  3. [W12] Répétition d'un bout de code
    Par thierrybatlle dans le forum WinDev
    Réponses: 1
    Dernier message: 16/09/2008, 11h56
  4. [HTML]Eviter les redondances de code
    Par Pfeffer dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 30/12/2005, 09h13
  5. Réponses: 2
    Dernier message: 05/07/2005, 14h46

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