Vérification de nom d'onglet

Résolu
Maksime568 Messages postés 145 Statut Membre -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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. Maksime568 Messages postés 145 Statut Membre
       
      Merci ça fonctionne au top.

      possible de rajouter une MsgBox si la feuille existe déjà pour prévenir?
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Maksime568 Messages postés 145 Statut Membre
         
        Oui
        Dans le if avant le exit sub
        0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      ahhhhhhhhhhhhh.... quelle horreure...
      Une boulce pour vérifier le nom des feuilles..... aaaaahhhhhhhhhh.... au secours.......


      :-)
      0
      1. Maksime568 Messages postés 145 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        c'est à dire?
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        c'est un choix subjectif, pour éviter le
        on error
        , dont certains abusent parfois.
        0
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      bof, cela ne fonctionne que s'il n'y a pas d'erreur en A1 de la feuille...
      0
    2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Et 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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      merci!
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      et une idée de comment faire pour vérifier la présence d'un onglet dans un classeur non ouvert?
      0
    5. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour 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. Maksime568 Messages postés 145 Statut Membre
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
      1. Maksime568 Messages postés 145 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        oui c'est vrai.

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