XL 2016 Vérifier si une feuille existe sinon la créer..

Pamela_Supermoto

XLDnaute Nouveau
Bonjour à tous,
J'ai besoin d'un petit coup de main svp sur:
Dans mon classeur, j'ai ma première feuille 'CANEVAS'.
A l'aide d'un bouton, j'ouvre un user form qui me demande un numéro de commande et si une feuille existe, il me l'ouvre sinon il la crée en copiant la feuille1 "CANAVAS".

Quel code me conseillez-vous?

merci beaucoup...
 

patricktoulon

XLDnaute Accro
bonjour Pamela_Supermoto

une petite fonction perso a ma façon

elle tient en une seule ligne et te permet de savoir si le sheets existe ou pas
VB:
Function SheetsExist(nom): SheetsExist = TypeName(Evaluate(nom & "!A:B")) = "Range": End Function
et on l'utilise comme dans l'exemple qui suit
on teste le sheets toto :si il existe pas canevas est copié en dernier et la copie est renommée "toto"
si il existe il est tout simplement activé
Code:
Sub test()
    If Not SheetsExist("toto") Then
        Sheets("canevas").Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "toto"
    Else
        Sheets("toto").Activate
    End If
End Sub
;)
 
Dernière édition:

Pamela_Supermoto

XLDnaute Nouveau
bonjour Pamela_Supermoto

une petite fonction perso a ma façon

elle tient en une seule ligne et te permet de savoir si le sheets existe ou pas
VB:
Function SheetsExist(nom): SheetsExist = TypeName(Evaluate(nom & "!A:B")) = "Range": End Function
et on l'utilise comme dans l'exemple qui suit
on teste le sheets toto :si il existe pas canevas est copié en dernier et la copie est renommée "toto"
si il existe il est tout simplement activé
Code:
Sub test()
    If Not SheetsExist("toto") Then
        Sheets("canevas").Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "toto"
    Else
        Sheets("toto").Activate
    End If
End Sub
;)

Merci pour la réponse,
je dois être blonde!!

Ca plante et ne comprends pas pourquoi:-(
Je joins le fichier met n'y passe pas trop de temps!!
a+
 

Fichiers joints

youky(BJ)

XLDnaute Barbatruc
Bonjour tous,
Un truc que j'utilise aussi.
Bruno
VB:
Private Sub btnValider_Click()
On Error Resume Next ' on gère les erreurs
Sheets(Me.tbxOf.Text).Activate 'on tente d'activer
If Err > 0 Then Sheets("CANEVAS").Copy After:=Sheets(1): ActiveSheet.Name = Me.tbxOf.Text: _
 MsgBox "Le nouveau rapport à bien été créé": Me.tbxOf = ""
'on ferme
    Unload Me
End Sub
 

patricktoulon

XLDnaute Accro
re
tu m’étonne que ça fonctionne pas: tu met une fonction dans une sub toi ??

Private Sub btnValider_Click()

Function SheetsExist(tbxOf): SheetsExist = TypeName(Evaluate(tbxOf & "!A:B")) = "Range": End Function

'Pour créer une nouvelle feuille issu d'un modèle
Sheets("CANEVAS").Select
Sheets("CANEVAS").Copy After:=Sheets(1)
Sheets("CANEVAS (2)").Select
ActiveSheet.Name = Me.tbxOf

'On affiche un message à l'utilisateur que le nouveau rapport à bien été ajoutée
MsgBox "Le nouveau rapport à bien été créé"

'On vide le formulaire pour un prochain calcul
Me.tbxOf = ""

'On ferme automatiquement le Userform
Unload Me

End Sub

si tu avais fait les choses comme je te les ai donné ça aurait fonctionné

youki bonjour oui aussi :
perso j'aime pas le masquage des erreurs mais bon c'est fonctionnel
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon :) et bonne fin de semaine,

elle tient en une seule ligne et te permet de savoir si le sheets existe ou pas
VB:
VB:
Function SheetsExist(nom): SheetsExist = TypeName(Evaluate(nom & "!A:B")) = "Range": End Function
Très très belle instruction.

elle tient en une seule ligne et te permet de savoir si le sheets existe ou pas
Ne faut-il pas remplacer sheet par worksheet pour être tout à fait juste ? ;)
 

patricktoulon

XLDnaute Accro
re
Bonjour mapomme
oui c'est exact

cela dit si j'injectais le nom d'un sheets chart par exemple je déclencherais une erreur donc evaluate me renverrait false
c'est un défaut au quel ne n'ai pas pensé c'est vrai
je vais plancher sur cette question
merci de me l'avoir signalé
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Pourquoi utiliser Evaluate(nom & "!A:B") ? Il me semble que Evaluate(nom & "!A1") va bien non ?

A+
 
Dernière édition:

patricktoulon

XLDnaute Accro
re
ha!!! et ben celle la je l'ai attendu :D:D:D
cette version tu la trouve partout d'ailleurs je l'ai longtemps utilisé jusqu' au jour ou quelqu'un m'a dit tout simplement

et si la cellule est vide ? o_O

c'est pour cela que j’évalue non pas la valeur d'une cellule mais le typename d'une plage de cellule(s)

evaluate renvoie "error" si le sheets n'existe pas donc ="Range" renvoie false


tandis que l'evaluation d'une cellule renverra
  1. error si le sheets n'existe pas
  2. rien si il existe mais que la cellule est vide
  3. la donnée de la cellule si il existe et que la cellule est remplie



je l'attend depuis hier celle la ;););) et j'ai du mal a croire qu'elle vienne de toi Job75

teste
nom="toto"
msgbox evaluate(nom &"!A1)

avec un sheets toto qui existe , quand il n'existe pas , avec la A1 remplie , avec la A1 vide
 
Dernière édition:

job75

XLDnaute Barbatruc
Bah patricktoulon si je pose la question c'est que moi j'ai testé.

Et chez moi TypeName(Evaluate(nom & "!A1")) renvoie soit "Range" soit "Error" quel que soit le contenu de la cellule A1.
 

patricktoulon

XLDnaute Accro
re
a oui !!!pardon
la version que l'on choppe partout
c'est Evaluate(nom & "!A1")
mille excuse :oops: :oops: :oops: :oops:
je planche sur la colle que m'a posé mapomme et elle est coton sans gestion d'erreur"on error ..."
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Bonjour à tous

Tout d'abord, je m'excuse pour ce qui va suivre ;)
VB:
Function L_existence_précède_l_essence(OCB As String, Optional Dixit As String = "J-P Sartre") As Boolean
L_existence_précède_l_essence = Not WorksheetFunction.IsErr(Evaluate("'" & OCB & "'!A1"))
End Function
Sub test1()
If L_existence_précède_l_essence("Staple1600") Then
MsgBox "J'existe", 1600 + 1047024
Else
MsgBox "Je ne suis pas une feuille, mais je les aime bien (;-))", 1046992 + 1600
End
End If
End Sub
Sub test2()
If L_existence_précède_l_essence("Feuil1") Then
MsgBox "J'existe", 1600 + 1047024
Else
MsgBox "Je ne suis pas une feuille, mais je les aime bien ;-)", 1046992 + 1600
End
End If
End Sub
Mais bon, le week-end est prolongé, alors je m'amuse dans mon VBE ;)

EDITION: Bonjour job75
 
Dernière édition:

job75

XLDnaute Barbatruc
Re, salut JM,

Encore une chose, si le nom de feuille contient des espaces il faut le mettre entre apostrophes ou utiliser :
VB:
Function SheetsExist(nom): SheetsExist = TypeName(Evaluate("'" & nom & "'!A1")) = "Range": End Function
A+
 

patricktoulon

XLDnaute Accro
oui c'est exact
mais mon plus gros problème c'est les 3 possibilités
  1. le sheets est de type xlchart l'evaluation renverra "error" mais existe quand même (sheetexist doit etre a true )
  2. l'evaluation donne range l'evaluation renverra "Range"donc existe (sheetexist doit etre a true )
  3. le sheet n'existe pas l'evaluation renverra "error"donc false

sans se passer de on error et sans faire une fonction de 3 kilometre je vois pas comment
 

patricktoulon

XLDnaute Accro
Bonjour Staple1600
je regarderais ca tout a l'heure je me prépare a partir en inter chez un client

purré il me laisseront jamais mon samedi !!! lui je vais lui prendre un MAX 3 fleche fleche fleche 3 ;) :D :D :D
 

job75

XLDnaute Barbatruc
Puique On Error Resume Next existe je ne vois pas pourquoi on en aurait la phobie :
VB:
Function SheetsExist(nom): Dim s As Object: On Error Resume Next: Set s = Sheets(nom): SheetsExist = Not s Is Nothing: End Function
Ni pourquoi on aurait une peur bleue des boucles :
VB:
Function SheetsExist(nom)
Dim i&
For i = 1 To Sheets.Count
    If Sheets(i).Name = nom Then Exit For
Next
SheetsExist = i <= Sheets.Count
End Function
 

youky(BJ)

XLDnaute Barbatruc
Bonjour tous,
Faut encore tester la variable nom
si je lui mets comme nom d'onglet . . . 100/2
C'est pour mettre mon grain de sel au moulin hihi
Voici un code pour Pamela
Bruno
VB:
Private Sub btnValider_Click()
On Error Resume Next ' on gère les erreurs
Sheets(Me.tbxOf.Text).Activate 'on tente d'activer
If Err > 0 Then
Err.Clear
Sheets("CANEVAS").Copy After:=Sheets(1): ActiveSheet.Name = Me.tbxOf.Text
If Err > 0 Then
Application.DisplayAlerts = False
 MsgBox "Votre N° OF est erroné": Sheets(2).Delete
Application.DisplayAlerts = True
Exit Sub
Else
 MsgBox "Le nouveau rapport à bien été créé": Me.tbxOf = ""
End If
End If
'on ferme
    Unload Me
End Sub
 

patricktoulon

XLDnaute Accro
re
excuse pour le retard mais pour ton test Staple1600 c'est pas bon
Bonjour le fil, Bonjour à tous

Tout d'abord, je m'excuse pour ce qui va suivre ;)
VB:
Function L_existence_précède_l_essence(OCB As String, Optional Dixit As String = "J-P Sartre") As Boolean
L_existence_précède_l_essence = Not WorksheetFunction.IsErr(Evaluate("'" & OCB & "'!A1"))

.........
Mais bon, le week-end est prolongé, alors je m'amuse dans mon VBE ;)

EDITION: Bonjour job75
re bonsoir Staple1600 c'est bien ce que je pensais : si le sheets est un xlchart il me dit qu'il n’existe pas

je crois que mapomme m'a refiler un casse tete

@job75 je prive personne de rien
perso les "on error..." si je peux les Eviter ca m'arrange elle peuvent masquer une autre erreur dans un code
après c'est le sport de trouver une solution hors du commun qui m'eclate juste du sport
 
Haut Bas