Afficher un msgbox en cas d'erreur 1004

Bonsoir à toutes et à tous,

Je rencontre un problème dans mon code qui m'affiche une erreur d'exécution 1004 lorsque je duplique un onglet et je le nomme avec le même nom qu'un onglet existant.

Comment faire pour afficher un msgbox qui demande à l'utilisateur de taper une autre valeur lors de la duplication de l'onglet et qui arrête la procédure ?

Voici mon code :

Sub Dupliquer_Feuille()
Dim MesImages As Shape

ShAvril.Select

Decalage = InputBox("Combien de mois de décalage par rapport au 1er onglet", "CREATION FEUILLE")

If Decalage = cancel Then
MsgBox "Veuillez saisir le nombre de mois de décalge par rapport au 1er onglet", _
vbInformation + vbOKOnly, "ERREUR SAISIE"
Exit Sub
Else
ShAvril.Unprotect "Admin1234"
ActiveWorkbook.Protect Structure:=False, Windows:=False

ShAvril.Copy After:=Worksheets(Worksheets.Count)

Sheets("Avril 2021 (2)").Range("CelMois").Select
Selection = CDate(Application.WorksheetFunction.EDate(Range("A3"), Decalage))

Range("Donnees").Select
Selection.ClearContents

If Err.Number = 1004 Then
' Err.Clear
MsgBox "Attention le chiffre saisie fait réference à un mois déjà existant" & vbNewLine, vbInformation + vbOKOnly _
& "Veuillez saisir un chiffre qui prend en compte le décallage de mois avec le 1er onglet", "ERREUR SAISIE"
Exit Sub
Else
Sheets("Avril 2021 (2)").Name = StrConv(Format(Range("B2").Value, "mmmm") & " " & _
Format(Range("B1").Value, "yyyy"), vbProperCase)
End If

Range("D5").Select

For Each MesImages In ActiveSheet.Shapes
MesImages.Delete
Next
End If

ActiveSheet.Protect "Admin1234"
ActiveWorkbook.Protect Structure:=True, Windows:=False

Application.ScreenUpdating = True
End Sub

Merci d'avance et bon soirée

Cordialement Lyesse

Bonjour,

Je t'invite à regarder attentivement Ici.

Si tu arrives à intégrer cela, tu auras à priori tout ce dont tu as besoin. Cet article m'a été d'une grande aide à titre personnel.

Je te remercie

Bonne journée

Pas de souci !

Si ça coince, n'hésite pas à repasser ici avec tes essais, il y aura toujours quelqu'un pour te guider. Mais si tu as ne serait-ce qu'un tout petit peu de temps à y consacrer, ça te sera beaucoup plus utile et constructif que la solution clé en main (de mon point de vue en tout cas).

bonjour,

Autre fonction du même genre :

Function WsExist(Nom$) As Boolean
   On Error Resume Next
   WsExist = Worksheets(Nom).Index
End Function

Utilisation :

Sub test()
   If WsExist("Feuil1") Then MsgBox "la feuille existe déjà !"
End Sub

A+

Bonjour,

Quoi ?

Préconiserais-tu une méthode de "bourrin" ?

J'essaie de coder plus proprement à force de voir tes remarques sur le fait de faire les choses " plus dans les règles de l'art ☺️

Joyeux Noël : Bonjour?

Réponse en MP

A+

Re,

Désolé, j'ai toujours entendu dire que l'usage du "on error resume next" était un peu un passage en force. J'ai eu tendance à en user et en abuser au départ.

Et c'est vrai qu'en fait ça ne pousse pas vraiment à s'améliorer du coup. J'étais content parce que je faisais en 3 lignes ce que d'autres faisaient en 10. Sauf que la version en 10 lignes était plus "propre" et évolutive, mais je ne m'en rendais pas compte.

Du reste, cette méthode est aussi présentée dans le lien donné. Libre à Lyesse d'utiliser ce qu'il veut.
J'avais juste été surpris que tu proposes ceci. Mais j'ai tout à fait compris avec les infos complémentaires que tu m'as données

Bonjour,

Désolé j’étais au travail, je n’ai pas encore pu tester, c’est vrai que je préférerais une solution bien faites pour que je puisse la réutiliser sur d’autres fichiers.

Merci pour tout.

Cordialement Lyesse

Bonsoir tout le monde,

J’ai tester tout à l’heure et ça ne fonctionne pas.

Je vous explique plus en détails pour votre compréhension et pour pouvoir m’orienter vers la bonne solution.

La macro me sert à dupliquer la feuille et de la renommer avec la valeur de la cellule qui comporte le mois et celle qui comporte l’année.

Par exemple, je lance la macro, une inputbox s’ouvre qui me demande combien de mois je veux décaler par rapport à la feuille 1 qui est « Avril 2021 » si je fais bien, genre 1, ça me crée bien le mois de « Mai 2021 » avec le même nom de feuille, ce que je cherche à faire c’est d’éviter que si je refais le mois prochain 1 dans l’InputBox que l’erreur « MsgBox » se lance pour me dire qu’il faut choisir un autre décalage car ce nom de feuille existe déjà. c’est pour éviter que lorsque mes collègue utiliserons ce fichier il ne tombe pas sur la fenêtre du déboggage.

J’espère que c’est clair pour vous ?

Cordialement Lyesse

Re,

Oui c'est clair et c'est tout à fait compatible avec ce qu'on a donné.

Question : ça va se passer comment quand tu vas créer janvier 2022 à ton avis ?

Je vous dépose le fichier pour que se soit plus simple pour toi.

Si je fais 1 par rapport du mois en cours il me génère une erreur.

Lorsque j'ai change la 1ère feuille en Janvier 2021 et que je lance le code (en mettant 1 pour le décalage), il me crée toujours la feuille de Mai 2021 au lieu de Février 2021.

Pourrais-tu stp m'aider à solutionner tout ça ?

Merci d'avance

Cordialement Lyesse

Bonjour,

Proposition de correction de ton code :

Function WsExist(Nom$) As Boolean
   On Error Resume Next
   WsExist = Worksheets(Nom).Index
End Function

Sub Dupliquer_Feuille()
Dim MesImages As Shape
Dim onglet As String

decalage = InputBox("Combien de mois de décalage par rapport au 1er onglet", "CREATION FEUILLE")

If decalage = cancel Then
      MsgBox "Veuillez saisir le nombre de mois de décalge par rapport au 1er onglet", _
      vbInformation + vbOKOnly, "ERREUR SAISIE"
      Exit Sub
Else
onglet = DateAdd("m", decalage, [B2])
 If WsExist(Format(onglet, "mmmm yyyy")) Then MsgBox "la feuille existe déjà !": Exit Sub

   ShRef.Unprotect ""
   ActiveWorkbook.Protect Structure:=False, Windows:=False

   ShRef.Copy After:=Worksheets(Worksheets.Count)
With ActiveSheet
    .Range("CelMois") = CDate(onglet)
    .Range("Donnees").ClearContents
    .Name = StrConv(Format(onglet, "mmmm yyyy"), vbProperCase)
    .[B1] = CDate(onglet)
    .[D5].Select
End With

   For Each MesImages In ActiveSheet.Shapes
      MesImages.Delete
   Next
End If

ActiveSheet.Protect ""
ActiveWorkbook.Protect Structure:=True, Windows:=False
End Sub

J'ai essayé d'améliorer quelques petits trucs, mais pas tout.

Merci JoyeuxNoel, ça marche super bien.

Je ne sais pas pourquoi ça n'a pas voulu fonctionner quand je l'ai fait, si je le sais, je ne suis pas un pro comme toi.

Merci encore restez tous comme vous êtes.

Cordialement Lyesse

Pas de souci, avec plaisir.

M'enfin suis loin d'être un pro, hein.

Le code n'était pas forcément bien placé dans la boucle et surtout, tu lui demandais de chercher un nom qui n'existait pas.

Je mets dans la variable onglet la date que tu veux créer avec le décalage. Et je demande à la fonction de vérifier s'il existe déjà une feuille avec cette date, au format MMMM AAAA.

En tous les cas, merci beaucoup pour ton aide

Par contre, tu peux juste m’expliquer à quoi sert la dernière fonction, je ne l’ai jamais vu :

windows:=False

Non excuse moi, c’est la procédure pour protéger le classeur.

Comme elle était à la ligne je n’ai pas fait attention,

Désolé

Rechercher des sujets similaires à "afficher msgbox cas erreur 1004"