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 des onglets en VBA [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut Supprimer des onglets en VBA
    Bonjour,

    Je travaille avec Excel 2007.
    Mon programme effectue une copie du fichier Excel qui le contient (nommé "Fichier.xlsm") pour générer un nouveau fichier nommé "Fichier2.xlsm".

    Le fichier d'origine comporte 12 onglets portant les noms suivants : "Mars 2014", "Avril 2014", ..., "Janvier 2015","Février 2015"

    J'ai un tableau (tabMois) contenant des noms de mois sur le même modèle ("Avril 2014", "Mai 2014" etc).
    Comme ce tableau ne contient pas le mois de Mars 2014, je voudrais supprimer l'onglet "Mars 2014" dans la copie du fichier que j'ai effectuée. Or quand je cherche à suoprimer cet onglet, je n'ai aucun message (alors qu'il parait que sans utilisation de "Application.DisplayAlerts = False" je devrais avoir une demande de confirmation) et je constate ensuite que l'onglet est toujours dans le fichier et n'a pas été supprimé.

    J'ai vérifié que le contenu de mon tableau était correct, et que je passais bien dans la fonction de suppression de l'onglet. J'ai même ajouté un "On Error Goto" mais sans qu'aucune erreur ne soit signalée lors de l'exécution du programme.

    Quelqu'un a t-il une idée de la raison pour laquelle l'onglet n'est pas supprimé ? Merci de votre aide.

    PS : Le tableau tabMois est une variable globale. Dans les deux fichiers, il existe un premier onglet dont le nom est "Paramétrage" et qui doit toujours être conservé.

    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
     
    Sub btnMAJ()
     
    On Error GoTo Err_btnMAJ
     
     Dim filePath As String
     Dim newFilePath As String
     Dim xlApp As Excel.Application
     Dim xlBook As Excel.Workbook
     Dim xlSheet As Excel.Worksheet
     
     Dim feMois As Variant
     Dim feSheet As Variant
     
     Dim ongletTrouve As Boolean
     
     Dim objFSO As Object
     
     Dim nomOnglet As String
     Dim numAnnee As Integer
     Dim mois As clsMois
     
     Dim i As Integer
     Dim compteur As Integer
     
     ' Initialise la liste des mois pour le nouveau classeur
     InittabMois
     
    ' Génération du nouveau classeur et de ses onglets (1 an glissant)
      filePath = ActiveWorkbook.Path + "\Fichier.xlsm"
      newFilePath = ActiveWorkbook.Path + "\Fichier2.xlsm"
     
      ' On effectue la copie du fichier
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      objFSO.CopyFile filePath, newFilePath, True
     
      'On accède au nouveau fichier pour lire les noms de ses onglets
      Set xlApp = CreateObject("Excel.Application")
      Set xlBook = xlApp.Workbooks.Open(newFilePath)
     
    boucle:
      For Each feSheet In xlBook.Worksheets
      ongletTrouve = False
      If feSheet.Name <> "Paramétrage" Then
            For Each feMois In tabMois
                If LCase(feSheet.Name) = LCase(feMois.LibelleMois) Then
                    ongletTrouve = True
                End If
            Next
            ' Si l'onglet recherché ne figure pas dans le tableau tabMois, on le supprime du fichier
            If ongletTrouve = False Then
               feSheet.Delete
            End If
        End If
      Next
     
    Fin_btnMAJ:
      xlBook.Save
      xlBook.Close
      xlApp.Quit
      Exit Sub
     
    Err_btnMAJ:
      MsgBox Err & ": " & Error(Err)
      GoTo Fin_btnMAJ
     
    End Sub

  2. #2
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Bonjour,

    Tu pourrais poster le code de , voire le classeur complet? Dans ton code comme ça rien d'anormal à première vue.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    A priori, la fonction InittabMois ne pose pas de problèmes, puisque j'ai vérifié le contenu du tableau tabMois et que son contenu était correct. Mais puisque vous le demandez, voici le code. Le but est que la liste des mois corresponde à 3 mois avant le mois courant, et 8 mois après le mois courant. Ainsi, pour le mois de Juillet 2014, on obtient :

    Avril 2014
    Mai 2014
    Jui 2014
    Juillet 2014 (mois courant)
    Août 2014
    Septembre 2014
    Octobre 2014
    Novembre 2014
    Décembre 2014
    Janvier 2015
    Février 2015
    Mars 2015

    Dans le code, j'utilise un module de classe nommé clsMois qui comprend les propriétés suivantes :

    clsMois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Public LibelleMois As String
      Public NumeroMois As Integer
    Le tableau tabMois est défini de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public tabMois(11) As clsMois
    Voici le code de la fonction :

    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
     
    Public Sub InittabMois()
     
    ' Crée la liste des mois correspondant aux onglets du fichier à créer
    ' 3 mois avant le mois courant, et 8 mois après le mois courant
     
    Dim nomMois As String
    Dim numMois As Integer
    Dim annee As Integer
    Dim anneePrecedente As Integer
    Dim anneeSuivante As Integer
     
    Dim borne As Integer
    Dim idx As Integer
    Dim numero As Integer
    Dim compteur As Integer
     
    Dim mois As clsMois
     
    Erase tabMois
     
    ' Récupère le nom du mois courant
    nomMois = VBA.MonthName(Month(Date))
    numMois = Format(Date, "MM")
    annee = Format(Date, "YYYY")
    anneePrecedente = annee - 1
    anneeSuivante = annee + 1
     
    ' 3 mois précédant le mois courant + le mois courant
    compteur = 0
    borne = numMois - 3
    If borne < 1 Then
        borne = borne + 12
        annee = anneePrecedente
        For idx = borne To numMois + 12
            Set mois = New clsMois
            mois.LibelleMois = VBA.MonthName(idx) + " " + CStr(annee)
            numero = idx
            If idx > 12 Then numero = idx - 12
            mois.NumeroMois = numero
            Set tabMois(compteur) = mois
            compteur = compteur + 1
        Next idx
    Else
        For idx = borne To numMois
            Set mois = New clsMois
            mois.LibelleMois = VBA.MonthName(idx) + " " + CStr(annee)
            numero = idx
            mois.NumeroMois = numero
            Set tabMois(compteur) = mois
            compteur = compteur + 1
        Next idx
    End If
     
    ' 8 mois suivant le mois courant
    compteur = 4
    For idx = numMois + 1 To numMois + 1 + 7
        numero = idx
        If idx > 12 Then
            numero = idx - 12
            annee = anneeSuivante
        End If
        Set mois = New clsMois
        mois.LibelleMois = VBA.MonthName(numero) + " " + CStr(annee)
        mois.NumeroMois = numero
        Set tabMois(compteur) = mois
        compteur = compteur + 1
    Next idx
     
    End Sub
    J'ai mis un point d'arrêt sur la ligne qui supprime l'onglet (feSheet.Delete) et je constate que la collection de feuilles du fichier (xlBook.Worksheets.Count) contient le même nombre d'éléments (13) avant ou après l'exécution de cette ligne. Tout se passe comme si cette ligne n'avait aucun effet.

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    J'ai trouvé la solution. Le problème venait en fait de ce que mon document était verrouillé par une instance d'Excel qui ne permettait pas de le modifier

    J'ai modifié le code de la façon suivante, afin d'ouvrir le fichier sans passer par une instance d'Excel qui existe déjà en mémoire : (fp contient le chemin vers le fichier dont je veux supprimer des onglets)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim feOnglet as Variant
     Set wb = Workbooks.Open(fp)
     For Each feOnglet In wb.Worksheets
            If feOnglet.Name = "TEST" Then
                    Application.DisplayAlerts = False
                    wb.Worksheets(feOnglet.Name).Delete
                    Application.DisplayAlerts = True
         End If
      Next
      wb.Close savechanges:=True

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

Discussions similaires

  1. [XL-2010] Supprimer des onglets sous condition
    Par APLOMB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/01/2013, 00h16
  2. [XL-2010] Supprimer des onglets sous condition
    Par APLOMB dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/01/2013, 23h56
  3. [XL-2007] Créer une macro pour supprimer des onglets dans un autre classeur
    Par nicosd54 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/03/2011, 10h01
  4. [AC-2003] Créer des onglets en VBA
    Par stigma dans le forum VBA Access
    Réponses: 6
    Dernier message: 10/05/2010, 10h50
  5. supprimer des lignes avec VBA
    Par NulenVBA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/10/2008, 17h14

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