Nouvel onglet par macro avec 2 ComboBox
Bonjour le forum !
Je me suis inspiré d'un sujet déjà abordé, "creation d'un nouvel onglet par macro", que Banzai64 avait brillamment résolu (comme dab), mais je l'ai adapté à mes besoins. Je m'explique : j'ai un userform qui propose deux combobox, une pour le jour (menu déroulant de 1 à 31) et l'autre pour les mois (même chose avec les 12 mois), ceci afin que les utilisateurs désirant créer un nouvel onglet de production ne saisisse pas à la main dans différents formats. La création du nouvel onglet est une copie d'un onglet "modèle" caché qui est alors rendu visible pour la saisie de données. Je me suis même permis d'ajouter un espace (" ") entre le résultat des 2 combo box, ceci afin que l'onglet créé soit du type JJ MM (exemple : 24 septembre).
La création des nouveaux onglets de production fonctionnent très bien, mais en cas de choix dans les combobox d'une date d'onglet déjà existante, la macro ne va pas jusqu'à la ligne MsgBox "Feuille déjà existante !". J'obtiens le message d'erreur suivant :
"Erreur d'exécution '1004' : Impossible de renommer une feuille comme une autre feuille, une bibliothèque d'objets référencé par Visual Basic." avec une option de débogage qui, activée, me met en surbrillance la ligne "ActiveSheet.Name = Me.ComboBox1 & " " & Me.ComboBox2". Il semble donc que "Faute = Err.Number" ne voit pas d'erreur alors qu'il y en a une ...
Je joins mon code :
Private Sub CommandButton1_Click()
Dim Faute As Long
If Me.ComboBox1 = "" Or Me.ComboBox2 = "" Then Exit Sub ' Si le jour et le mois non renseigné, sortir du Sub
On Error Resume Next
Sheets(Me.ComboBox1.Text).Visible = True & " " & Sheets(Me.ComboBox2.Text).Visible = True ' Combine le Jour + "espace" + le mois
Faute = Err.Number
On Error GoTo 0
If Faute > 0 Then
Sheets("Modèle").Copy After:=Sheets(Sheets.Count) ' Copie l'onglet modèlé caché
ActiveSheet.Name = Me.ComboBox1 & " " & Me.ComboBox2 ' Renomme le nouvel onglet
ActiveSheet.Visible = True ' Rend le nouvel onglet visible
Else
MsgBox "Feuille déjà existante !" 'Annule la création de l'onglet si déjà existant
End If
End SubAu fait, si je désire un nom d'onglet avec un espace entre le jour et le mois, c'est que je compte réutiliser cette valeur en tant que date pour uen macro dans mon onglet modèle.
Merci par avance à ceux qui peuvent m'aider. Si notre génie Banzai64 est dans le coin, je suis preneur ...
Bonjour
A tester
Remplaces ta macro par celle-ci et rajoute la fonction
Private Sub CommandButton1_Click()
If Me.ComboBox1.ListIndex = -1 Or Me.ComboBox2.ListIndex = -1 Then Exit Sub ' Si le jour et le mois non renseigné, sortir du Sub
If FeuilleExiste(Me.ComboBox1 & " " & Me.ComboBox2) = False Then
Sheets("Modèle").Copy After:=Sheets(Sheets.Count) ' Copie l'onglet modèlé caché
ActiveSheet.Name = Me.ComboBox1 & " " & Me.ComboBox2 ' Renomme le nouvel onglet
ActiveSheet.Visible = True ' Rend le nouvel onglet visible
Else
MsgBox "Feuille déjà existante !" 'Annule la création de l'onglet si déjà existant
End If
End Sub
Function FeuilleExiste(Nom As String) As Boolean
On Error Resume Next
FeuilleExiste = Sheets(Nom).Name <> ""
On Error GoTo 0
End FunctionSuperbe, rien à dire, cela fonctionne parfaitement ... Je n'ai pas eu l'idée d'utiliser une "Function" à part, c'est très ingénieux !
Dernière question : j'aurais un fichier de production par mois, donc quand un nouveau mois commencera, il n'y aura aucun onglet de production de créé (sachant que mon userform s'affichera à l'ouverture du fichier Excel). Le userform permet, à l'heure actuelle, soit de créer un nouvel onglet de production, soit d'annuler la demande et d'afficher le dernier onglet de prod en cours. Donc si aucun onglet de prod n'existe au début du mois, comment forcer l'utilisateur à en créer un, sans quoi impossible pour lui d'ouvrir quelque onglet que ce soit (les onglets de base étant réservés aux imports de données par macro ) ?
Bonjour
Sans ton fichier pas évident
Une piste : Compte le nombre de feuille et si celui-ci correspond au fichier initial ==> pas de feuille prod crée ==> bloquer toute action sauf la création de la feuille
Rebonjour,
J'ai réussi à la faire avec le code qui suit. Le "CommandButton2" de mon UserForm correspond au bouton "annuler" (contrairement au CommandButton1 qui permet la création de feuillet avec le code que tu m'as donné plus haut). Ca marche impec mais je voudrais également empêcher l'utilisateur de fermer le UserForm pour la croix en haut à droite car cela lui permet de rester dans le fichier Excel alors qu'il n'a rien à y faire sans un seul onglet de production ...
Private Sub CommandButton2_Click()
ActionCommandButton2 = True
If FeuilleExiste(Me.ComboBox1 & " " & Me.ComboBox2) = False Then
MsgBox "Il n'y a pas d'onglet de production pour le mois en cours, veuillez en créer un ..."
Else
Unload Userform1
End If
End SubLa solution serait elle avec le UserForm_QueryClose ?
Merci encore de ton aide !
Bonjour
A tester
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Suite à des travaux importants cette sortie est interdite" & vbCr & "Veuillez utiliser le bouton prévu à cet effet"
Cancel = True
End If
End SubBonjour Banzai64,
J'ai finalement modifié le "Private Sub CommandButton2_Click()" en me basant sur la position du 1er onglet de données qui est en 1ere position avant la création d'un éventuel onglet de production par le userform et ça marche très bien :
ActionCommandButton2 = True
If Sheets(3).Name = "Données_S" Then
MsgBox "Il n'y a pas d'onglet de production pour le mois en cours" & vbCr & " Veuillez en créer un ..."
Else
Unload Userform1
End IfQuand au "Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)", je l'ai modifié tel suit :
If CloseMode = vbFormControlMenu Then
If Sheets(1).Name = "Données_S" Then
Application.DisplayAlerts = False
Application.Quit
Else
Unload Userform1
End If
End If
Toute cette partie là est nickel grâce à toi, merci de tout coeur. Mon fichier de production avance maintenant à grands pas, il me reste encore à empêcher une création manuelle d'un nouvel onglet, de copier automatiquement le nom de chaque nouvel onglet créé dans une cellule de l'onglet créé, etc .....Ca va encore m'occuper un moment !