Vérification de nom d'onglet

Résolu
Maksime568 Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   -  
Patrice33740 Messages postés 8561 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

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Maksime568 Messages postés 142 Date d'inscription   Statut Membre Dernière intervention  
 
Merci ça fonctionne au top.

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


:-)
0
Maksime568 Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
c'est à dire?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
c'est un choix subjectif, pour éviter le
on error
, dont certains abusent parfois.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
bof, cela ne fonctionne que s'il n'y a pas d'erreur en A1 de la feuille...
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > yg_be Messages postés 23541 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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention  
 
merci!
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Patrice33740 Messages postés 8561 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
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > yg_be Messages postés 23541 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
Maksime568 Messages postés 142 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Maksime568 Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 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