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 :

Nom d'une feuille=Titre d'un graphique [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Par défaut Nom d'une feuille=Titre d'un graphique
    Bonjour,

    Quelles sont les lignes de code à indiquer pour affecter à la feuille active l'indice 1, et pour affecter le nom de la feuille d'indice 1 du classeur au graphique actuel ?

    Voici ce que j'ai tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveWorkbook.ActiveSheet.Set Worksheet = Workbook.Worksheets(1)
    Set Worksheet = Workbook.Worksheets(1)
    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.ChartTitle.Characters.Text = Worksheets(1)
    Mais cela ne fonctionne pas.
    Merci d'avance d'éclairer ma recherche.

    Devour

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Bien sûr ça ne fonctionnera pas, il ne suffit pas de juxtaposer des mots cote à cote qu'on arrive à faire du code.

    Je crois que je t'avais donnée un code (pour un autre problème) dans lequel je n'avais nullement utilisé les ActiveSheet ou ActiveChart ou ActiveMachin

    Il fallait en tenir compte.

    L'indice de la feuille est celui de sa position dans le classeur
    Si tu as Feuil1 Feuil2 Feuil3, l'indice de Feuil2 est 2
    Si tu la déplace Feuil2 Feuil1 Feuil3, Feuil2 a désormais l'indice 1.

    Enfin, ré-explique ton besoin en postant ici le code entier de réalisation du graphique.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Par défaut
    Voilà mon code entier que j'ai refait avec mon professeur puis en deuxième partie ton code pour tout un dossier. J'ai réussi à partir d'une feuille de données à tracer un graphe sur une seconde feuille. J'aimerais pouvoir dans le code de la macro, réussir également à changer quelques propriétés de ce graphe:


    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
    Sub Graphe()
    '
    ' Graphe Macro
    '
        ActiveSheet.Shapes.AddChart.Select
        ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
        ActiveChart.SeriesCollection.NewSeries
        ActiveChart.SeriesCollection(1).Name = "=""Temp"""
        ActiveChart.SeriesCollection(1).XValues = "='Falex5023'!$A:$A"
        ActiveChart.SeriesCollection(1).Values = "='Falex5023'!$B:$B"
        ActiveChart.SeriesCollection.NewSeries
        ActiveChart.SeriesCollection(2).Name = "=""Torque"""
        ActiveChart.SeriesCollection(2).XValues = "='Falex5023'!$A:$A"
        ActiveChart.SeriesCollection(2).Values = "='Falex5023'!$I:$I"
        ActiveChart.SeriesCollection(1).Select
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.SeriesCollection(1).AxisGroup = 2
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.SeriesCollection(1).Select
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.ChartArea.Select
        ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Graph"
        ActiveChart.HasTitle = True
        ActiveChart.ChartTitle.Characters.Text = "Falex X"
        ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = True
        ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (s)"
        ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
        ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Torque (N.m)"
        ActiveChart.Axes(xlValue, xlSecondary).HasTitle = True
        ActiveChart.Axes(xlValue, xlSecondary).AxisTitle.Characters.Text = "Temp (°C)"
    End Sub
    Les modifications qu'il me reste à faire sont:
    -la mise en place du titre de l'axe secondaire dans l'autre sens (pivoté de 90° mais vers la droite)
    -l'indication du titre pour le graphe qui est tout simplement le nom de la première feuille (ou le nom du fichier sans l'extension)
    -l'indication des cellules à sélectionner qui se trouvent dans la feuille portant le nom du graphe (ou première feuille) et non pas dans une feuille avec un nom spécifié comme à la ligne 11 ou 12 du code (Falex****).



    Voici ton code pour tout un dossier que j'aimerais transformer pour un seul fichier, suivant mon code comme tu peux le voir:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    Option Explicit
     
    '1. Sub pour suppression des connexions.
     
    Sub ConnectDelete()
    Dim Cn As Object
     
    Application.DisplayAlerts = False
    For Each Cn In ThisWorkbook.Connections
        Cn.Delete
    Next Cn
    Application.DisplayAlerts = True
    End Sub
     
    '2. Sub qui permet de tracer le graphique dans un classeur Wbk
     
    Sub Incremental(Wbk As Workbook)
    Dim Sh As Worksheet
    Dim Chrt As Chart
    Dim Plage As Range, VectX As Range
    Dim LastLig As Long
    Dim k As Byte
     
    Application.ScreenUpdating = False
    '---------Au cas où une feuille Graphe existe déjà, on l'as supprime
    On Error Resume Next
    Application.DisplayAlerts = False
    Wbk.Sheets("Graphe").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    '-------------------------------------------------------------------
     
    Set Sh = Wbk.Worksheets(1)
    With Sh
        .UsedRange.ClearContents
        ThisWorkbook.Worksheets("Temp").UsedRange.Copy .Range("A1")
        ConnectDelete
        ThisWorkbook.Worksheets("Temp").UsedRange.Clear
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Plage = Union(.Range("B1:C" & LastLig), .Range("I1:I" & LastLig))
        Set VectX = .Range("A1:A" & LastLig)
        Set Chrt = Wbk.Charts.Add
        Chrt.Name = "Graphe"
        With Chrt
            .SetSourceData Plage
            .ChartType = xlXYScatterSmoothNoMarkers
            For k = 1 To 3
                .SeriesCollection(k).XValues = VectX
            Next k
            .SeriesCollection(3).AxisGroup = 2
        End With
        .Activate
    End With
    Set Chrt = Nothing
    Set Plage = Nothing
    Set VectX = Nothing
    Set Sh = Nothing
    End Sub
     
    '3. Sub de reformatge des données (Feuille Temp)
     
    Sub Formalisation(ByVal Fichier As String)
    Dim Sh As Worksheet
     
    Set Sh = ThisWorkbook.Worksheets("Temp")
    With Sh
        .UsedRange.Clear
        With .QueryTables.Add(Connection:="TEXT;" & Fichier, Destination:=Sh.Range("A1"))
            .FieldNames = True
            .TextFileTabDelimiter = True
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1)
            .Refresh BackgroundQuery:=False
        End With
        .UsedRange.Replace ",", "."
        .UsedRange.Replace "~?", "°"
    End With
    End Sub
     
    '4. Sub récursive qui permet de traiter tous les classeurs Excel commençant par Falex
    'dans tous les sous dossiers "xxxx à yyyy"
     
    '/!\ Nécessite d'activer la référence "Microsoft Scripting RunTime"
     
    Sub Traitement(Chemin As String)
    Dim Fso As Scripting.FileSystemObject
    Dim DossPere As Scripting.Folder
    Dim DossFils As Scripting.Folder, DF As Scripting.Folder
    Dim Fichier As Scripting.File
    Dim Classeur As String
    Dim Wbk As Workbook
     
    Application.ScreenUpdating = False
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set DossPere = Fso.GetFolder(Chemin)
    If DossPere.SubFolders.Count > 0 Then
        For Each DF In DossPere.SubFolders
            If DF.Name Like "* à *" Then
                For Each Fichier In DF.Files
                    If Fichier.Name Like "Falex*.xls*" Then
                        Classeur = DF.Path & "\" & Fichier.Name
                        Formalisation Classeur
                        Set Wbk = Workbooks.Open(Classeur)
                        Incremental Wbk
                        Application.DisplayAlerts = False
                        Classeur = DF.Path & "\Bis_" & Fichier.Name
                        Wbk.SaveAs Classeur, 56
                        Application.DisplayAlerts = True
                        Wbk.Close
                        Set Wbk = Nothing
                    End If
                Next Fichier
                'ICI s'il y a des sous dossiers dans les dossiers
                For Each DossFils In DF.SubFolders
                    If DossFils.Name Like "* à *" Then Traitement DossFils.Path
                Next DossFils
                'JUSQU'A ICI
            End If
        Next DF
    End If
    Set Fso = Nothing
    Set DossPere = Nothing
    End Sub
     
    '5. Sub de Lancement
     
    Sub TEST()
    Dim t As Long
     
    t = Timer
    Traitement "C:\Users\user\Desktop"                                   ' à adapter par rapport au dossier père de tous les dossiers à traiter
    MsgBox "Traitement terminé en " & Timer - t & " secondes"
    End Sub

    Merci de ton aide Mercator

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    C'est pas mieux et lisible comme ceci? (Sans les Select, activemachin...)
    L'adressage est complet

    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
    48
    49
    50
    51
    Sub Graphe()
    Dim Sh As Worksheet
    Dim Ch As Chart
    Dim i As Integer
     
    Application.ScreenUpdating = False
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("Graph").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
     
    Set Sh = ThisWorkbook.Worksheets(1)
    Set Ch = ThisWorkbook.Charts.Add(After:=ThisWorkbook.Worksheets(1))
    With Ch
        For i = .SeriesCollection.Count To 1 Step -1
            .SeriesCollection(i).Delete
        Next i
        .Name = "Graph"
        .ChartType = xlXYScatterSmoothNoMarkers
        .SeriesCollection.NewSeries
        With .SeriesCollection(1)
            .Name = "Temp"
            .XValues = Sh.Range("A:A")
            .Values = Sh.Range("B:B")
        End With
        .SeriesCollection.NewSeries
        With .SeriesCollection(2)
            .Name = "Torque"
            .XValues = Sh.Range("A:A")
            .Values = Sh.Range("I:I")
            .AxisGroup = 2
        End With
        .HasTitle = True
        .ChartTitle.Characters.Text = Sh.Name
        With .Axes(xlCategory, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Time (s)"
        End With
        With .Axes(xlValue, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Torque (N.m)"
        End With
        With .Axes(xlValue, xlSecondary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Temp (°C)"
        End With
    End With
    Set Sh = Nothing
    Set Ch = Nothing
    End Sub

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Par défaut
    Oui, c'est parfait, je comprenais déjà les parties With et Set mais pourrais-tu juste me décrire ce que signifie ces deux parties de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Application.ScreenUpdating = False
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("Graph").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = .SeriesCollection.Count To 1 Step -1
            .SeriesCollection(i).Delete
        Next i
    Merci énormément de ton aide précieuse en tout cas car grâce à tes compétences, je vais enfin pouvoir terminer une bonne partie de mon stage.

    Bonne journée
    Devour

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je l'avais bien expliqué dans ton autre sujet.

    On crée une feuille graphique qu'on va nommer Graph, c'est ça?
    Si dans ton classeur, il existe déjà une feuille appelé Graph et si on veut nommer notre nouvelle feuille Graph, il y aura erreur (on ne peut pas avoir 2 feuilles portant le même nom dans un même classeur. c'est ça?

    2 possibilité dès lors:

    1. On supprime l'éventuelle feuille Graph et on crée la notre

    2. On cherche si la feuille Graph existe, on la modifie; sinon on la crée

    C'est cette 2ème possibilité qui me convient. Mais pour toi, il est mieux d'utiliser la 1ère possibilité.

    Donc, on doit d'abord supprimer la feuille Graph du fichier
    Si elle existe déjà, pas de problème, sinon, on aura une erreur. D'où la partie du code que j'ai commenté ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'On désactive la mise à jour affichage écran
    Application.ScreenUpdating = False
    'S'il y a erreur on passe à la ligne suivante (au cas où aucune feuille n'est appelée Graph q'on veut supprimer
    On Error Resume Next
    'On désactive les alertes (En effet, lors de la suppression d'une feuille, une alerte apparait)
    Application.DisplayAlerts = False
    'On supprimer la feuille appelée Graph. En cas de son inéxistance, cette ligne est surpassée grace à On Error resume next
    Sheets("Graph").Delete
    'On réactive les alertes (par défaut, elles sont actives, mais ci haut nous les avions spécialement désactivés
    Application.DisplayAlerts = True
    'Ici fin de portée de On Error Resume Next
    On Error GoTo 0
    PS: Dorénavant, tu es en mesure de travailler avec des variables objet (ici Sh et Ch) au lieu des Activetruc...

    [Edit]

    Point 2 commenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        'On parcour les séries par défaut créés dans le graphique et on les supprime
        For i = .SeriesCollection.Count To 1 Step -1
            .SeriesCollection(i).Delete
        Next i

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

Discussions similaires

  1. Récupérer le numéro du nom d'une feuille.
    Par drics dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/11/2007, 18h16
  2. Réponses: 1
    Dernier message: 15/11/2007, 13h51
  3. nom d'une feuille dans une cellule
    Par s.rais dans le forum Excel
    Réponses: 2
    Dernier message: 05/07/2007, 12h05
  4. [VBA-E]Récuperer le nom d'une feuille sans le N°
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 11h33
  5. Réponses: 4
    Dernier message: 09/11/2005, 17h11

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