Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2011, 10h49   #1
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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?
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 17h14   #2
Membre émérite
 
Conseil + Formation
Inscription : février 2010
Messages : 583
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Conseil + Formation

Informations forums :
Inscription : février 2010
Messages : 583
Points : 885
Points : 885
Bonjour

Oui avec des boucles imbriquées.

Par exemple si toutes les feuilles sont concernées
Code :
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...
78chris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 17h36   #3
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
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 :
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 ....
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 19h53   #4
Membre émérite
 
Conseil + Formation
Inscription : février 2010
Messages : 583
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Conseil + Formation

Informations forums :
Inscription : février 2010
Messages : 583
Points : 885
Points : 885
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 :
ActiveWorkbook.Charts.Add
78chris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 20h27   #5
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h03   #6
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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 :
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 )
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h25   #7
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
à quoi corresponde tes lignes 6,7 et 31 ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h31   #8
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h59   #9
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
un début de code ..:

Code :
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
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h08   #10
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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
Citation:
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?
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h15   #11
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
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...)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 16h01   #12
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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
Citation:
un macro événementielle pour générer l'appel en fonction de la ligne courante
pourriez vous m'aider s'il vous plait?
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 16h17   #13
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 15h49   #14
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 19h53   #15
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
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 !)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 02h08   #16
Invité de passage
 
Inscription : mai 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 15
Points : 1
Points : 1
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 :
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!!
totau est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h14.


 
 
 
 
Partenaires

Hébergement Web