Vérification de nom d'onglet

Résolu
Bonjour,

J'ai une petite macro me permettant de copier un onglet de référence et en nommant ce nouvel onglet selon la date du jour.
Cependant,
si 2 appuis sont fait le même jour sur le bouton d'ajout (ce qui ne doit pas arriver),
la macro bug et ne reprotège pas mon classeur.

comment faire pour éviter de créer un second onglet si un premier en date du jour est déjà créé?
Sub ajoutProduction()
'
' ajoutProduction Macro
'

    ActiveWorkbook.Unprotect
    Sheets("Suivi Production").Select
    Sheets("Suivi Production").Copy After:=Sheets(1)
    ActiveSheet.Name = Format(Date, "dd-mm-yy")
    ActiveWorkbook.protect Structure:=True, Windows:=False

    
End Sub


Configuration: Windows / Firefox 81.0

4 réponses

  1. Modérateur
    Bonjour

    un truc du genre

    Function FExist(NomF As String) As Boolean ' test si la feuille existe
       Application.ScreenUpdating = False
       On Error Resume Next
       FExist = Not Sheets(NomF) Is Nothing
       Application.ScreenUpdating = True
    End Function 
    
    Sub ajoutProduction()
    '
    ' ajoutProduction Macro
    '
       Dim nomF as String
        nomF = Format(Date, "dd-mm-yy")
        if FExist(nomF) Then 
          exit sub
        End If
    
        ActiveWorkbook.Unprotect
        Sheets("Suivi Production").Select
        Sheets("Suivi Production").Copy After:=Sheets(1)
    
        ActiveSheet.Name = nomF
        ActiveWorkbook.protect Structure:=True, Windows:=False
    
        
    End Sub
    


    1
    1. Merci ça fonctionne au top.

      possible de rajouter une MsgBox si la feuille existe déjà pour prévenir?
      0
    2. Modérateur
      @Maksime568Oui
      Dans le if avant le exit sub
      0
  2. Contributeur
    bonjour, suggestion:
    Option Explicit
    
    Sub ajoutProduction()
    '
    ' ajoutProduction Macro
    '
    Dim nom As String
    nom = Format(Date, "dd-mm-yy")
    If Not existedeja(nom) Then
        ActiveWorkbook.Unprotect
        Sheets("Suivi Production").Select
        Sheets("Suivi Production").Copy After:=Sheets(1)
        ActiveSheet.Name = Format(Date, "dd-mm-yy")
        ActiveWorkbook.Protect Structure:=True, Windows:=False
    End If
        
    End Sub
    Private Function existedeja(quoi As String) As Boolean
    Dim ong As Worksheet
    For Each ong In ThisWorkbook.Worksheets
        If ong.Name = quoi Then
            existedeja = True
            Exit Function
        End If
    Next ong
    existedeja = False
    End Function
    1
    1. Modérateur
      ahhhhhhhhhhhhh.... quelle horreure...
      Une boulce pour vérifier le nom des feuilles..... aaaaahhhhhhhhhh.... au secours.......

      :-)
      0
    2. @jordane45c'est à dire?
      0
    3. Contributeur
      @jordane45c'est un choix subjectif, pour éviter le
      on error
      , dont certains abusent parfois.
      0
  3. Bonjour le Fil,

    Pour éviter les horreurs (Boucle et On Error) :
    Function FeuilleExiste(ByVal strNomFeuille As String) As Boolean
      FeuilleExiste = Not IsError(Evaluate("='" & strNomFeuille & "'!A1"))
    End Function
    0
    1. Contributeur
      bof, cela ne fonctionne que s'il n'y a pas d'erreur en A1 de la feuille...
      0
    2. @yg_beEt quelle est la probabilité que ça arrive avec cette cellule ?
      Function FeuilleExiste(ByVal strNomFeuille As String) As Boolean
        FeuilleExiste = Not IsError(Evaluate("='" & strNomFeuille & "'!XFD1048576"))
      End Function


      Et celle-ci fonctionne avec une erreur en A1 d'une feuille existante :
      Function FeuilleExiste(ByVal strNomFeuille As String) As Boolean
        FeuilleExiste = Not IsError(Evaluate("=CELL(""col"",'" & strNomFeuille & "'!A1)"))
      End Function
      0
    3. Contributeur
      @Patrice33740et une idée de comment faire pour vérifier la présence d'un onglet dans un classeur non ouvert?
      0
    4. @yg_beBonjour yg_be

      Avec une connexion ADODB :
      'Nécéssite d'activer la référence Microsoft ADO ext x.x for DLL and Security
      'Nécéssite d'activer la référence Microsoft ActiveX Data Objects x.x Library
      Option Explicit
      
      Sub testFeuilleFermee()
      Dim sFichier As String
      Dim sFeuille As String
        sFichier = ThisWorkbook.Path & "\Classeur_à_lire.xls"  'à adapter
        sFeuille = "Feuille 4"
        MsgBox FeuilleFermeeExiste(sFichier, sFeuille)
      End Sub
      
      Function FeuilleFermeeExiste(sNomCompletClasseur$, sNomFeuille$) As Boolean
      Dim oCnx As ADODB.Connection
      Dim oCat As ADOX.Catalog
      Dim oTbl As ADOX.Table
        Set oCnx = New ADODB.Connection
        Set oCat = New ADOX.Catalog
        oCnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNomCompletClasseur & ";Extended Properties=Excel 8.0;"
        Set oCat.ActiveConnection = oCnx
        For Each oTbl In oCat.Tables
          If Replace(oTbl.Name, "'", "") = sNomFeuille & "$" Then FeuilleFermeeExiste = True
        Next
        Set oCat = Nothing
        Set oTbl = Nothing
        oCnx.Close
        Set oCnx = Nothing
      End Function
      0
  4. Autre point,

    ma macro me permet de générer une nouvelle feuille qui sera complétée.

    comment pourrais-je faire pour éviter que l'on vienne modifier les données des autres feuilles précédemment complétées?
    Mais tout en me laissant consulter les autres onglets afin de pouvoir en visualiser le contenu.
    0
    1. Modérateur
      Bonjour,

      Normalement..... nouvelle question = ouverture d'une nouvelle discussion propre à celle-ci sur le forum...

      Quoi qu'il en soit, Excel te permet de protéger les feuilles....
      en vba, il existe la méthode "protect"
      Tu trouveras des tonnes d'exemples sur le net sans difficulté.
      0
    2. @jordane45oui c'est vrai.

      je regarde pour faire un autre sujet si je ne trouve pas réponse à ma question ☺
      0