Vérification de nom d'onglet [Résolu]

Signaler
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021
-
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021
-
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

Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021
3 395
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


Cordialement,
Jordane
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021

Merci ça fonctionne au top.

possible de rajouter une MsgBox si la feuille existe déjà pour prévenir?
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021
3 395 >
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021

Oui
Dans le if avant le exit sub
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021
831
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
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021
3 395
ahhhhhhhhhhhhh.... quelle horreure...
Une boulce pour vérifier le nom des feuilles..... aaaaahhhhhhhhhh.... au secours.......


:-)
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021
>
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021

c'est à dire?
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021
831 >
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021

c'est un choix subjectif, pour éviter le
on error
, dont certains abusent parfois.
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021
1 648
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
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021
831 >
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021

merci!
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021
831 >
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021

et une idée de comment faire pour vérifier la présence d'un onglet dans un classeur non ouvert?
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021
1 648 >
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021

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
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021
831 >
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021

merci. dans ce cas, donc, on retombe sur une boucle qui fait le tour des onglets?
Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021
1 648 >
Messages postés
15161
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2021

Oui, les fonctions, Excel Cellule() et VBA Evaluate(), ne fonctionnent pas sur un classeur fermé.
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021

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.
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021
3 395
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é.
Messages postés
139
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
19 janvier 2021
>
Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021

oui c'est vrai.

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