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 :

Supprimer un classeur Excel avec VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Supprimer un classeur Excel avec VBA
    Bonjour à tous !

    Je rédige une macro me permettant de créer un graphique, jusque là tout va bien. Le graphique se créé sur une nouvelle feuille excel sans problème.
    Ce qui m'embête c'est qu'à chaque fois que j'exécute la macro, une nouvelle feuille avec un nouveau graphique apparait. Cela me gêne car je me retrouve vite avec plein de graphiques, alors que je souhaite uniquement conserver le plus récent !

    J'ai essayé de nommer cette nouvelle feuille (sans succès), de donner l'ordre de supprimer la feuille au début de ma macro, mais si elle n'existe pas déjà ça ne fonctionne pas...

    Voici mon 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
     
    'Sheets("Graph1").Select
    'ActiveWindow.SelectedSheets.Delete --> ne fonctionne pas si mon graph 1 n'est pas déjà créé. De plus lors de la seconde excéution, le graph créé est désormais nommé graph2. Ainsi, lors de la troisième exécution, le système ne fonctionne plus :(
     
    With WsD
            Set Plage = .Range(.Cells(77, 2), .Cells(.Cells(77, 2).End(xlDown).Row, .Columns.Count).End(xlToLeft))
       End With
     
     
       Set objChart = ThisWorkbook.Charts.Add
       objChart.ChartType = xlColumnStacked
       objChart.SetSourceData Plage, xlRows
     
       ActiveChart.ChartArea.Select
        ActiveChart.SeriesCollection(1).XValues = "=Recap!$C$64:$CP$64"
        ActiveChart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)
        Selection.Caption = "Mois"
        ActiveChart.SetElement (msoElementPrimaryValueAxisTitleRotated)
        Selection.Caption = "ETPs"
        ActiveChart.SetElement (msoElementChartTitleAboveChart)
        Selection.Caption = "Plan de charge Technique groupé par famille"
    Peut être qu'il faudrait donner un nom à la feuille créée (au moins comme ça pas de problème de graph1 graph2 graph3...) et mettre une instruction au début du code disant que si cette feuille existe déjà, alors il faut la supprimer... Qu'en pensez vous ?

    J'ai un autre petit problème avec mon code : comme vous pouvez le voir, j'ai sélectionné l'échelle de l'axe des abscisses : de C64 à CP64. Néanmoins, ma colonne CP est susceptible de varier ! J'ai essayé une autre formule du type : mais sans succès :/
    Voici ma formule qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ActiveChart.SeriesCollection(1).XValues = Range(.Cells(64, 3).End(xlDown))

    Merci à tous ceux qui pourraient me donner un petit coup de main ! Merci et bonne journée !

  2. #2
    Membre régulier Avatar de MlNOU
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 47
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    Ton idée de nommer la feuille et de verifier si elle existe au debut de la macro et de la supprimer si oui est à mon avis la plus simple et la plus efficace.


    Sinon je ne vois pas ce que tu veux dire par
    ma collonne CP peut varier

    Cordialement MlNOU.
    Il y a un temps pour tout , mais jamais pour la guerre. Mass Hysteria


    Un petit ça fait toujours plaisir.

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    voici une fonction testant si une feuille existe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function ExistSheet(Ws$, Optional Wb As Workbook) As Boolean
             If Wb Is Nothing Then Set Wb = ActiveWorkbook
             On Error Resume Next
             ExistSheet = IsObject(Wb.Sheets(Ws))
    End Function
    Le premier paramètre est le nom de la feuille.

    Le second est le classeur (objet Workbook) auquel est rattachée la feuille.
    Optionnel, s'il n'est pas précisé, c'est le classeur actif qui est pris en compte.

    Cette fonction booléenne renvoie donc vrai ou faux …


    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Bonjour,

    Pour supprimer toutes les feuilles de graphique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.DisplayAlerts = False
    Charts.Delete
    Application.DisplayAlerts = True
    Pour les abscisses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.SeriesCollection(1).XValues = Range(.Cells(64, 3), .Cells(64, Columns.Count).End(xlToLeft))
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour à tous et merci de vos réponses !

    @Minou
    Quand je dis que ma colonne CP peux varier, c'est que ma plage d’abscisses est automatiquement remplie. Elle peut être par exemple C64:E64 aussi bien que C64:X64. Si mon C64 est fixe et la ligne dans laquelle figure les abscisses également (ligne 64), mon numéro de colonne peut varier. Daniel m'a fourni une solution (merci d'ailleurs), mais quand j'exécute ma macro avec ce code, elle me renvoie un message d'erreur sur .Cells : "référence incorrecte ou non qualifiée"... Bizarre non ???

    Ensuite, j'ai écris la fonction de Marc au début de mon module, me permettant de tester si mon graph1 existe déjà ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function ExistSheet("Graph1", Optional Wb As Workbook) As Boolean
             If Wb Is Nothing Then Set Wb = ActiveWorkbook
             On Error Resume Next
             ExistSheet = IsObject(Wb.Sheets(Ws))
    End Function
    et ensuite dans ma macro j'ai rajouté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     If ExistSheet = True Then Sheets("Graph1").Select
    ActiveWindow.SelectedSheets.Delete
    End If
    Mais rien ne fonctionne... Il me renvoie que ExistSheet est un argument non facultatif (?)...

    J'ai réussi à nommer ma feuille créée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ActiveSheet.Name = "Mgmt T"
    Donc maintenant ma macro en peut s'exécuter que si ma feuille n'existe pas déjà (logique), mais j'aurais aimé réussir à la supprimer si elle existe au début de ma macro.

    Encore merci pour vos réponses !

    Ah déjà j'ai compris pourquoi ma macro me demandait un argument !

    J'ai corrigé comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    'tout en haut de mon module
    Function ExistSheet(Ws$, Optional Wb As Workbook) As Boolean
         If Wb Is Nothing Then Set Wb = ActiveWorkbook
            On Error Resume Next
             ExistSheet = IsObject(Wb.Sheets(Ws))
    End Function
     
     
    'au début de ma macro
    If ExistSheet("MgmtT") = True Then Sheets("MgmtT").Select
    ActiveWindow.SelectedSheets.Delete
    Je crois que ça va mieux déjà comme ça, je vais retester et vous tiens au courant !

  6. #6
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    je supprime le Graphique existant sur la feuille
    bien sur je présume que le graphique se nomme Graph1.
    sin non le supprimer a la main à la première exécution.
    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
    Dim Shap As Shape
    Enum style
        ColumnStacked = 52
        PieExploded = 69
        Pie = 5
        TroisDLine = -40101
        TrisDBarStacked100 = 62
    End Enum
     
    Sub test()
    Dim Plage As Range
    Set Plage = Range("A1:C12")
    Graphique_Delete Sheets("Graph1"), "Graph1"
    Graphique_New Sheets("Graph1"), "Graph1"
    Graphique_Style ColumnStacked
    Graphique_Source Plage, xlRows
    Graphique_SeriesCollection "=Recap!$C$64:$CP$64"
    Graphique_SeriesCollection_Caption "Mois", msoElementPrimaryCategoryAxisTitleAdjacentToAxis
    Graphique_SeriesCollection_Caption "ETPs", msoElementPrimaryValueAxisTitleRotated
    Graphique_SeriesCollection_Caption "Plan de charge Technique groupé par famille", msoElementChartTitleAboveChart
     
     
    End Sub
     
    Public Sub Graphique_Delete(Feuille As Worksheet, Non As String)
    For Each MyObject In Feuille.Shapes
        If MyObject.Name = nom Then MyObject.Delete: Exit Sub
    Next
    End Sub
    Public Sub Graphique_New(Feuille As Worksheet, Non As String)
    Set Shap = Feuille.Shapes.AddChart
    Shap.Name = nom
    End Sub
    Public Sub Graphique_Source(MyRange As Range, Orientation As Long)
     Shap.Chart.SetSourceData MyRange, Orientation
    End Sub
    Public Sub Graphique_Style(MyStyle As style)
     Shap.Chart.ChartType = MyStyle
    End Sub
    Public Sub Graphique_SeriesCollection_Caption(Caption As String, Element As MsoChartElementType)
    Dim e
      Shap.Chart.SetElement Element
      Select Case Element
                Case 2
                    Shap.Chart.ChartTitle.Text = Caption
                Case 301
                    Shap.Chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = Caption
                Case 309
                    Shap.Chart.Axes(xlValue, xlPrimary).AxisTitle.Text = Caption
      End Select
    End Sub
    Public Sub Graphique_SeriesCollection(V)
     Shap.Chart.SeriesCollection(1).XValues = V
    End Sub
    Public Sub Graphique_SeriesCollection_Visible()
     
     Shap.Chart.SeriesCollection(1).ApplyDataLabels
    End Sub
    Public Sub Graphique_Taille(Hauteur As Integer, Largeur As Integer)
     Shap.Height = Hauteur
     Shap.Width = Largeur
    End Sub
    Public Sub Graphique_Position(X As Integer, Y As Integer)
     Shap.Top = X
     Shap.Left = Y
    End Sub
    Dernière modification par Invité ; 10/07/2013 à 12h42.

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    mariecaro,

    tes lignes n°11 & 12 doivent se réduire en une seule : If ExistSheet("MgmtT") Then Sheets("MgmtT").Delete


    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …


    __________________________________________________________________________________________
    Une lesbienne qui n'a pas de seins, c'est une omoplate ?
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    merci durupt pour ta longue réponse, mais je dois t'avouer que c'est un peu compliqué pour moi !
    J'ai réussi à faire fonctionner mon code grâce au dernier message de Marc, merci beaucoup c'est super !

    Un dernier petit problème avec ma sélection des abscisses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveChart.SeriesCollection(1).XValues = Range(.Cells(64, 3), .Cells(64, Columns.Count).End(xlToLeft))
    Cela me renvoie toujours un message d'erreur... Une idée ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    pourtant mon code fait la même chose que le tien ni plus ni moins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Range(.Cells(77, 2), .Cells(.Cells(77, 2).End(xlDown).Row, .Columns.Count).End(xlToLeft))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub test()
    Dim Plage As Range
    Set Plage = .Range(.Cells(77, 2), .Cells(.Cells(77, 2).End(xlDown).Row, .Columns.Count).End(xlToLeft))
    Graphique_Delete Sheets("Graph1"), "Graph1"
    Graphique_New Sheets("Graph1"), "Graph1"
    Graphique_Style ColumnStacked
    Graphique_Source Plage, xlRows
    Graphique_SeriesCollection "=Recap!$C$64:$CP$64"
    Graphique_SeriesCollection_Caption "Mois", msoElementPrimaryCategoryAxisTitleAdjacentToAxis
    Graphique_SeriesCollection_Caption "ETPs", msoElementPrimaryValueAxisTitleRotated
    Graphique_SeriesCollection_Caption "Plan de charge Technique groupé par famille", msoElementChartTitleAboveChart
     
     
    End Sub

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Il faut que le graphique soit sélectionné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.SeriesCollection(1).XValues = .Range(.Cells(64, 3), .Cells(64, .Columns.Count).End(xlToLeft))
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphique_SeriesCollection .Range(.Cells(64, 3), .Cells(64, .Columns.Count).End(xlToLeft))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub Graphique_SeriesCollection(V)
     Shap.Chart.SeriesCollection(1).XValues = V
    End Sub
    ma méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Graphique_New(Feuille As Worksheet, Non As String)
    Set Shap = Feuille.Shapes.AddChart
    Shap.Name = nom
    End Sub
    fait référence a l'objet Shap pas besoin de le sélectionner.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    pas besoin de le sélectionner.
    Dans le code initial, il est automatiquement sélectionné lors de la création. Pourquoi compliquer ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  13. #13
    Invité
    Invité(e)
    Par défaut
    pas de souci!

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

Discussions similaires

  1. [XL-2013] Suppression de doublons dans un classeur Excel avec utilisation d'une macro VBA
    Par gblassel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2014, 16h18
  2. [VBA] Dissocier des feuilles Excel avec VBA
    Par lezinve dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/03/2006, 16h30
  3. Supprimer des classeurs excel
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/12/2005, 15h04
  4. [VBA] supprimer un Classeur Excel
    Par beurnoir dans le forum Access
    Réponses: 26
    Dernier message: 14/11/2005, 14h05
  5. Comment recupérer la version d'Excel avec VBA ?
    Par ikoto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/09/2005, 18h51

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