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 :

Faire plus de 50 graphes excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Faire plus de 50 graphes excel
    Bonjours tout le monde,

    J'ai fais une macro qui doit traiter des datas sous format CSV et exporter un graphe sous format PNG pour chaque fichier.

    J'arrive à faire le graphe et j'arrive a exporter dans le format PNG.

    Mais quand j'essaie de le faire sur un nombre conséquent de fichier, les graphes ne se font plus... (Les 40 premiers sont OK, après excel ne traite plus les graphes...

    Voici un extrait du code source:

    Dans la section principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    countfile = 0
    For Each current In fichier
           countfile = countfile + 1
           Application.StatusBar = "Création de l'image: " & CStr(countfile) & "/" & CStr(UBound(fichier))
           texte(countfile)(UBound(texte(countfile)) - 1) = MakeGraphe(CStr(current), path, CInt(texte(0)(UBound(texte(0)) - 1)))
    Next
    fichier est la liste des CSV que je veux traiter, texte est un tableau ou je récupère des données, path est le repertoire de destination des images générées

    Dans la section secondaire
    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
     
    Public Function MakeGraphe(FichierCSV As String, Repertoire As String, epaisseur As Integer) As Boolean
        Dim reussis As Boolean
        Dim a As Byte
        Dim nomcourt As String
        Dim temp As Variant
        Dim classeur As Workbook, graphi As Chart
        nomcourt = Mid(FichierCSV, InStrRev(FichierCSV, "\") + 1)
        On Error Resume Next
            Workbooks.OpenText Filename:=FichierCSV, origin:=xlWindows, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Tab:=True, semicolon:=True, comma:=True, Space:=True
            reussis = Err.Number = 0
        On Error GoTo 0
        If reussis Then
            Set classeur = Workbooks(nomcourt)
            nomcourt = Left(nomcourt, Len(nomcourt) - 4)
            classeur.Sheets(nomcourt).Rows("2:3").Delete Shift:=xlUp
            Set graphi = classeur.Charts.Add
            With graphi
                For Each temp In .SeriesCollection
                    temp.Delete
                Next
                .Location Where:=xlLocationAsNewSheet, Name:="Graph" & Mid(nomcourt, 6)
                .ChartType = xlXYScatter
                .HasLegend = True
                .HasTitle = True
                For a = 1 To 3
                    .SeriesCollection.NewSeries
                    .SeriesCollection(a).XValues = "='" & nomcourt & "'!A:A"
                    .SeriesCollection(a).Values = "='" & nomcourt & "'!" & Chr(77 + a) & ":" & Chr(77 + a)
                    .SeriesCollection(a).Name = "='" & nomcourt & "'!" & Chr(77 + a) & "1"
                Next
                .Axes(xlValue).MinimumScale = epaisseur - 75
                .Axes(xlValue).MaximumScale = epaisseur + 75
                .Axes(xlValue).MajorUnit = 10
                .Axes(xlCategory).MinimumScale = 35
                .Axes(xlCategory).MaximumScale = 995
                .Axes(xlCategory).MajorUnit = 40
                For a = 1 To 3
                    With .SeriesCollection(a)
                        .MarkerStyle = a
                        .MarkerSize = 2
                    End With
                Next
                .ChartTitle.Characters.Text = nomcourt
                .ChartTitle.Characters.Font.FontStyle = "Bold"
                .Axes(xlValue, xlPrimary).HasTitle = True
                .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "mm"
                .Axes(xlValue).AxisTitle.Orientation = xlHorizontal
                .Axes(xlValue, xlPrimary).AxisTitle.Characters(1, 1).Font.Name = "Symbol"
                .ChartTitle.Top = 8
                .Axes(xlValue).AxisTitle.Left = 29
                .Axes(xlValue).AxisTitle.Top = 4.908
                With .PlotArea
                    .Left = 1
                    .Top = 1
                    .Width = 680
                    .Height = 490
                End With
                With .Legend
                    .Left = 606.282
                    .Top = 5
                End With
                On Error Resume Next
                    Kill Repertoire & nomcourt & ".png"
                On Error GoTo 0
                On Error Resume Next
                    .Export Filename:=Repertoire & nomcourt & ".png", FilterName:="PNG"
                    reussis = Err.Number = 0
                On Error GoTo 0
            End With
            Set graphi = Nothing
            classeur.Close (False)
            Set classeur = Nothing
        End If
        MakeGraphe = reussis
    End Function
    Le fichier Wafer1730.png a été généré juste avant qu'excel commence à patiner dans la semoule. Wafer1731 a été généré juste après...

    Est-ce un problème de libération mémoire?

    J'ai essayé de mettre des DoEvents à chaque tours, mais rien n'y fait...
    idem avec mongraphique.refresh ou mafeuille.calculate
    j'ai aussi essayé de mettre un sleep(5000), mais ca n'a rien apporté...

    je sèche....
    Images attachées Images attachées   

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    As tu essayé de mettre un point d'arrêt sur MakeGraph et de contrôler son déroulement et le contenu des variables en mode pas a pas lors de la 41eme génération?
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Ok,

    Je viens de le faire. La boucle qui crées les series cesse de fonctionner. Tous est ok dans les variables, mais les instructions ne se font pas ou échouent sans message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                For a = 1 To 3
                    .SeriesCollection.NewSeries
                    .SeriesCollection(a).XValues = "='" & nomcourt & "'!A:A"
                    .SeriesCollection(a).Values = "='" & nomcourt & "'!" & Chr(77 + a) & ":" & Chr(77 + a)
                    .SeriesCollection(a).Name = "='" & nomcourt & "'!" & Chr(77 + a) & "1"
                Next
    - La création de la série a bien lieu
    - L'attribution des valeur x aussi
    - les 2 lignes d'après ne marchent pas a tous les coups. Les espions ne me montrent pas d'erreur.

    J'ai essayé aussi de mettre les data (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "='" & nomcourt & "'!" & Chr(77 + a) & "1"
    ) dans un string avant de l'atribuer à la série, mais sans succès.

    Je vais essayer de passer par un Range...
    que du bonheur...
    Images attachées Images attachées  

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Le Range ne marche pas non plus.

    Je ne vais pas me faire chier, et vais mettre une condition sur la boucle qui efface les séries qu'Excel génère automatiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each temp In .SeriesCollection
          If temp.Name <> feuille.Range("N1").Value And temp.Name <> feuille.Range("O1").Value And temp.Name <> feuille.Range("P1").Value Then temp.Delete
    Next
    Ca marche très bien comme ca et en plus ca accélère le code.

    Ca m'enerve de ne pas comprendre pourquoi ca ne marchait pas.
    Merci pour ceux qui ont pris la peine de me répondre

    A+

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

Discussions similaires

  1. Graph Excel ? Comment faire ?
    Par moutavril dans le forum Excel
    Réponses: 3
    Dernier message: 25/03/2008, 16h48
  2. Plus court chemin - graphe NON orienté et pondéré
    Par Nicodemus dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 14/03/2006, 15h32
  3. Créer un graph Excel à partir d'un fichier
    Par kult dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/11/2005, 14h06
  4. Comment faire plus simple
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2005, 04h12
  5. Réponses: 10
    Dernier message: 24/05/2005, 14h09

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