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 :

macro pour créer plusieurs graphique pour plusieurs tableaux


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut macro pour créer plusieurs graphique pour plusieurs tableaux
    bonjour
    je débute en VBA, donc je ne sais pas trop si je demande est faisable;
    j'ai un classeur contenant plusieurs feuilles de calculs contenant le même type de tableaux. j'ai besoin d'avoir le même type de graphique pour chaque ligne de chaque tableau de chaque feuille.
    j'ai crée la macro pour générer le graphique que je veux, mais je dois répéter l'ecriture de cette macro autant de fois que le nombre de ligne*le nombre de feuille de calcul, en changeant à chaque fois la sélection des plages de cellules concernée, et le nom de la feuille sur laquelle je travaille
    Y a t il un moyen pour éviter cela, en ayant un minimum de macros?

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 486
    Points : 16 385
    Points
    16 385
    Par défaut
    Bonjour

    Oui avec des boucles imbriquées.

    Par exemple si toutes les feuilles sont concernées
    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
    Dim maplage As Range
    For Each SH In ActiveWorkbook.Worksheets
        Set maplage = SH.Range("A1:C" & SH.Range("A65000").End(xlUp).Row)
        For Each ligne In maplage.Rows
        'Code Construction du graphique - exemple à adapter
        If ligne.Row > 1 Then
            Charts.Add
            ActiveChart.ChartType = xlColumnClustered
            ActiveChart.SetSourceData Source:=Sheets(SH.Name).Range("A1:C1," & ligne.Address), PlotBy:= _
                 xlRows
            ActiveChart.Location Where:=xlLocationAsObject, Name:=SH.Name
            ActiveWindow.Visible = False
        End If
        Next ligne
    Next SH
    Ce n'est qu'un exemple à adapter tant au niveau des plages sources que de la position des graphiques...

  3. #3
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    Vas falloir être plus claire


    Citation Envoyé par totau Voir le message
    ...j'ai besoin d'avoir le même type de graphique pour chaque ligne de chaque tableau de chaque feuille.
    Cela veut dire qu'il faut créer un graphique par lignes ?
    Cela veut dire qu'il y as plusieurs tableaux par feuilles ?
    plusieurs graphes par feuilles?

    Citation Envoyé par totau Voir le message
    j'ai crée la macro pour générer le graphique que je veux, mais je dois répéter l'ecriture de cette macro autant de fois que le nombre de ligne*le nombre de feuille de calcul, en changeant à chaque fois la sélection des plages de cellules concernée, et le nom de la feuille sur laquelle je travaille
    Y a t il un moyen pour éviter cela, en ayant un minimum de macros?
    et l'on peu pas voir ce code pour un tableau ?




    @78Chris : en passant ton code est à revoir au moins cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            ActiveChart.SetSourceData Source:=Sheets(SH.Name).Range("A1:C1," & ligne.Address), PlotBy:= _
                 xlRows
    pourquoi mettre : Sheets(SH.Name).Range(... et pas simplement SH.Range(... , surtout qu'avec ton code tu oublie de préciser le classeur concerné...

    je comprends pas nom plus la suite de ta ligne , ..:
    Range("A1:C1," & ligne.Address)cette concaténation de deux adresses est à revoir ....

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 486
    Points : 16 385
    Points
    16 385
    Par défaut
    Bonjour

    Bbil : n'ayant pas le code de totau, la partie création de graph n'est qu'un exemple, le but étant de montrer le principe de boucles imbriquées.

    Je n'ai pas du tout cherché à optimiser : ta première remarque optimise effectivement.

    En revanche pour la seconde remarque : ce double adressage permet de sélectionner la ligne de titre ET la ligne de valeurs.

    Quand au classeur SH se référant à activeworbook, il ne devrait pas y avoir de problème mais on peut préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Charts.Add

  5. #5
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    ok pour l'adresse j'avais pas vu la virgule... et pour le SH on est d'accord, c'est mieux sh.range que worksheets(sh.name...

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    bonjour
    Dsl d'avoir mis longtemps pour répondre.
    Eclaircissement du problème; mon classeur contient exactement trois feuilles, chaque feuille contient un seul tableau bidimensionnel et les trois tableau sont de meme type et ont les memes lignes et memes colonnes. Je veux créer à la fin de chaque ligne de chaque tableau un bouton qui génère un graphique relatif à la ligne indiquée, chose que j'ai réussi à faire mais avec la spécification de la ligne et de la feuille dans le code.
    Les tableau que je traite sont des suivis d'évolution des indicateur durant une année; donc j'ai un nombre de colonne variable ( suivant les données disponible des différents mois)
    Voici le code pour le graphique

    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
    Sub ari()
     
    Sheets("T").Select
     
    n = 0
    For i = 3 To 15
    v = ActiveSheet.Cells(7, i).Value
    If VarType(v) <> 0 Then
        n = n + 1
    End If
    Next i
    If n = 0 Then
        MsgBox ("veuillez remplir le tableau")
    End If
    ActiveWindow.SmallScroll Down:=-9
     
    Dim plage As Range
    Set plage = Application.Union(Range(Cells(6, 2), Cells(7, 2 + n)), Range(Cells(31, 2), Cells(31, 2 + n)))
     
    Charts.Add
     
    ActiveChart.SetSourceData plage
    ActiveChart.ChartType = xlLineMarkers
    ActiveChart.Location Where:=xlLocationAsObject, Name:="T"
    ActiveChart.Parent.Name = "Graphique1"
     
    End Sub
    merci )

  7. #7
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    à quoi corresponde tes lignes 6,7 et 31 ?

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    La ligne 6 correspond à la ligne des entête des colonnes ( pour avoir l'axe des abscisse)
    La ligne 7 est une ligne correspondant à une région, donc c'est la ligne variable
    La ligne 31 est la moyenne pour les mois, je compare l’évolution de l'indicateur sur une région avec la moyenne

  9. #9
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    un début de code ..:

    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
    Option Explicit 'Force la déclaration des variables
     
    Sub ari(iLigne As Integer)
     Dim plage As Range
     
     Dim ch As Chart 'Graphique créé
     Const LIG_ENTETE = 6 'Numero de ligne entête
     Const LIG_MOYENNE = 31 'Numéro de ligne moyenne
     Dim iNbCol As Integer 'Nombre de colonne à traiter
     
     ' Définition de la feuille à traiter .. si plusieurs feuilles concernées ==> Passer la variable sh en paramétre de la procédure et supprimer les deux lignes suivante.
     Dim sh As Worksheet 'Feuille de donnée
     Set sh = ThisWorkbook.Sheets("T") 'Définie la feuille source de donné
     
     iNbCol = DetermineDernierColonne(sh.Rows(iLigne)) 'Fonction renvoi numero derniére colonne non vide avec colonne 1 = C
     If iNbCol = 0 Then
        MsgBox ("veuillez remplir le tableau")
        Exit Sub 'On abandonne
     End If
    With sh 'Pour être sur d'être sur la bonne feuille
        Set plage = Application.Union(.Range(.Cells(LIG_ENTETE, 2), .Cells(LIG_ENTETE, 2 + iNbCol)), _
                                      .Range(.Cells(iLigne, 2), .Cells(iLigne, 2 + iNbCol)), _
                                      .Range(Cells(LIG_MOYENNE, 2), .Cells(LIG_MOYENNE, 2 + iNbCol)))
    End With
    Set ch = Charts.Add
    ch.SetSourceData plage
    ch.ChartType = xlLineMarkers
    ch.Location Where:=xlLocationAsObject, Name:=sh.Name  ' Créer le classer dans la feuille courante..
     
     
    End Sub
     
    '
    ' Détermine derniére colonne
    '
    Function DetermineDernierColonne(rLigne As Range)
        Dim n As Integer
        Dim i As Integer
        For i = 3 To 15
            If VarType(rLigne.Cells(1, i)) <> 0 Then
            n = n + 1
        End If
        Next
        DetermineDernierColonne = n
    End Function

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    bonjour
    je n'ai pas bien compris vos explications dans le code, pouvez vous être plus clair s'il vous plait
    exemples:
    -vous avez mis
    Sub ari(iLigne As Integer)
    est ce que le iLigne est automatiquent generer en affectant la macro a un bouton sur la ligne concernée?
    - est ce que je peux affecter cette meme macro à tous les boutons, à chaque ligne de chaque tableau?

  11. #11
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    il faut affecter le numéro de ligne ...

    pour l'instant tu peu tester en mettant dans le code d'un bouton ou en tapant le code dans la fenêtre exécution (CTRL+G)
    ensuite il faudra créer un macro événementielle pour générer l'appel en fonction de la ligne courante (par exemple sur double clic dans une colonne...)

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    l'appel de la macro avec l'affectation de la ligne se fait dans le VB ?
    parce que j'ai essayé , et en voulant l'affecter à un bouton elle est toujours inexistante
    - je ne saurais pas creer
    un macro événementielle pour générer l'appel en fonction de la ligne courante
    pourriez vous m'aider s'il vous plait?

  13. #13
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par bbil Voir le message
    pour l'instant tu peu tester en mettant dans le code d'un bouton ou en tapant le code dans la fenêtre exécution (CTRL+G)
    ..
    depuis l'éditeur VBE , CTRL+G puis tu tape la commande dans la fenêtre exécution sans oublier le entrée...

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    je renonce ça n'a pas voulu marcher!!
    je recopierai la macro autant de fois qu'il le faudrait en changent à chaque fois la ligne et la feuille concernées
    merci pour votre aide

  15. #15
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par totau Voir le message
    je renonce ça n'a pas voulu marcher!!
    je recopierai la macro autant de fois qu'il le faudrait en changent à chaque fois la ligne et la feuille concernées
    merci pour votre aide
    pour marcher il faut des jambes ...

    tu as fait quoi ? et que s'est-il passé ... (ne dit pas rien c'est pas possible, ton curseur à du au moins bouger après l'action sur enter !)

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    c'est parce que ça m'a semblé trop compliqué et que de toute façon j'allais refaire le traitement plusieurs fois puisque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim sh As Worksheet 'Feuille de donnée
     Set sh = ThisWorkbook.Sheets("T") 'Définie la feuille source de donné
    donc il faudrait refaire au moins pour chaque feuille son code!
    c'est ce que j'ai compris!!

Discussions similaires

  1. problème pour créer une formule comportant plusieurs conditions
    Par roufko dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2014, 22h04
  2. Réponses: 4
    Dernier message: 19/08/2011, 14h44
  3. Plusieur classes pour créer un web service
    Par nabil148911 dans le forum Services Web
    Réponses: 1
    Dernier message: 25/11/2008, 14h59
  4. Librairie Graphique pour créer des graphiques
    Par cris73 dans le forum Windev Mobile
    Réponses: 3
    Dernier message: 23/10/2008, 16h00
  5. macro pour créer des graphiques
    Par Sebastien_INR59 dans le forum Access
    Réponses: 1
    Dernier message: 07/06/2006, 09h44

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