Empecher l'envoie d'une erreur si l'onglet existe déjà

Résolu
Bonjour,

Je cherche à mettre en place un système ou plutôt une sécurité qui m'évite d'avoir une erreur quand je demande à Excel de mettre à jour les valeurs de mes onglets.

Par exemple une macro qui parcourait mon classeur et si elle trouve un onglet qui existe déjà elle ne le recrée pas ( car du coup erreur), et passe à la suite.

Sub Macro1()
'--------------------
On Error Resume Next
If IsError(Sheets("P1").Name) Then
Sheets.Add After:=Sheets(Sheets.Count)
With Sheets(Sheets.Count)
.Name = "P1"
.Activate
Range("A1").Select
End With
End If
On Error GoTo 0
'------------'suite du code
End Sub


Merci d'avance.

Configuration: Windows / Edge 18.17763

10 réponses

  1. Bonjour

    il te suffit d'appeler la fonction FeuilleExiste depuis la boucle ou tu crées tes feuilles.
    Si elle n'existe pas tu crées, si elle existe tu ne fais rien.
    Un truc du genre

    If FeuilleExiste("Nom de la feuille") = False Then
    'code de création
    End if
    


    1. Modérateur
      Bonjour,

      Déjà, pour éviter de faire des boucles... il existe une fonction un peu plus "optimisée"
      Function FeuilleExiste(NomF As String) As Boolean ' test si la feuille existe
         On Error Resume Next
         FeuilleExiste = Not Sheets(NomF) Is Nothing
      End Function
      


      Ensuite, pour répondre à ta question de " l'appliquer sur tout le classeur" ... et bien... il suffit d'y faire appel avant de faire l'ajout de ta feuille
      
      if FeuilleExiste("P1") = False Then
           Sheets.Add After:=Sheets(Sheets.Count)
           With Sheets(Sheets.Count)
             .Name = "P1"
             .Activate
           End With
      End if
      


      1. Sub Macro()
        Dim nomFeuille As String
        Dim monFichier As String
        Dim wb As Workbook
        Dim chemin As String
        Dim i As Integer
        
        Set wb = Workbooks(ThisWorkbook.Name)
        chemin = ThisWorkbook.Path & "\Test\"
        monFichier = Dir(chemin & "*.xlsx", vbNormal)
        
        Do While monFichier <> ""
        'Ici je crée un onglet pour chaque nom de fichier dans mon dossier
            onglet = Split(Split(monFichier, "-")(2), "_")(0)
            if FeuilleExiste(onglet) = False Then
                wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
           end if
        monFichier = Dir
        Loop
        
          
        End Sub


        Avec la fonction FeuilleExiste de Jordane, que je salue au passage.
        1. Je suis tombé sur ce code en creusant un peu, l'idée serait de l'appliquer pas pour une seule page, mais pour tout un classeur.

          Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean
          'fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif
          'par Excel-Malin.com ( https://excel-malin.com )
          
          On Error GoTo SiErreur
          Dim Feuille As Worksheet
              
              FeuilleExiste = False
              For Each Feuille In Worksheets
                  If UCase(Feuille.Name) = UCase(FeuilleAVerifier) Then
                      FeuilleExiste = True
                      Exit Function
                  End If
              Next Feuille
          Exit Function
          
          SiErreur:
              FeuilleExiste = CVErr(xlErrNA)
          End Function
          
          1. Bonjour,

            Merci pour ta réponse. Est ce qu'il est possible de l'activer sur le classeur entier et non une feuille précise ?

            Merci d'avance
            1. Voici mon code initial. Merci beaucoup.

              Sub Macro()
              Dim nomFeuille As String
              Dim monFichier As String
              Dim wb As Workbook
              Dim chemin As String
              Dim i As Integer
              
              Set wb = Workbooks(ThisWorkbook.Name)
              chemin = ThisWorkbook.Path & "\Test\"
              monFichier = Dir(chemin & "*.xlsx", vbNormal)
              
              Do While monFichier <> ""
              'Ici je crée un onglet pour chaque nom de fichier dans mon dossier
                  onglet = Split(Split(monFichier, "-")(2), "_")(0)
                  wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
              monFichier = Dir
              Loop
              
                
              End Sub
              
              1. Aussi simple que ça, merci beaucoup !
                1. teste d'abord et si ça te convient, marque le sujet résolu
              2. J'ai testé comme ci-dessous mais je tombe sur l'erreur "Type d'argument ByRef incompatible sur "onglet" :
                If FeuilleExiste(onglet) = False Then


                Function FeuilleExiste(NomF As String) As Boolean ' test si la feuille existe
                   On Error Resume Next
                   FeuilleExiste = Not Sheets(NomF) Is Nothing
                   
                   If FeuilleExiste("P1") = False Then
                     Sheets.Add After:=Sheets(Sheets.Count)
                     With Sheets(Sheets.Count)
                       .Name = "P1"
                       .Activate
                     End With
                End If
                End Function
                Sub Macro()
                Dim nomFeuille As String
                Dim monFichier As String
                Dim wb As Workbook
                Dim chemin As String
                Dim i As Integer
                
                Set wb = Workbooks(ThisWorkbook.Name)
                chemin = ThisWorkbook.Path & "\Test\"
                monFichier = Dir(chemin & "*.xlsx", vbNormal)
                
                Do While monFichier <> ""
                'Ici je cr?e un onglet pour chaque nom de fichier dans mon dossier
                    onglet = Split(Split(monFichier, "-")(2), "_")(0)
                    If FeuilleExiste(onglet) = False Then
                        wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
                   End If
                monFichier = Dir
                Loop
                
                  
                End Sub
                
                1. Relis le code de Jordane.

                  Ca n'est pas ce que tu as utilisé.