Nouvelle feuille Excel selon une numérotation
Bonjour cher Forum!
J'ai un bon problème à résoudre dont je n'arrive pas à trouver la solution, je vous expose le tous.
J'ai donc une feuille Excel pré avec des éléments à l'intérieur de base qui fait office de "template". Ce "template est le même peut importe la directive de changement qui sera crée. Ce que je voudrais c'est qu'en ouvrant mon userform où je dois sélectionner des ToggleButton qui serve à sélectionner les catégories que par exemple en sélectionnant le ToggleButton "Architecture" il copie ma feuille "#TEMPLATE_DC" et tous dépendament à qu'elle numéro il est rendu il renomme la feuille après la copie "DC-A" avec le numéro où il est rendu. En d'autre mots, si la feuille DC-A01 n'a pas été créer encore il l'a créer sinon il créer la feuille DC-A02 et ainsi de suite.
Je vous met en pièce jointe le fichier ça aide toujours à mieux comprendre!
Merci d'avance pour votre aide, j'ai déjà une bonne partie du code d'écrit et là où je n'arrive plus à avancer c'est pour la détection des numéros.
Bonjour CEdL
Je rajouterai les lignes suivantes dans CommandButton1_Click
Dim categ As String 'la catégorie sélectionnée
Dim Tabl As String ' pour prévoir l'accès aux cellules
Dim max_Architecture, max_Mécanique, max_structure, max_civil, max_interne
If ToggleButton1.Value = True Then categ = "A": Tabl = "TB_architecture": max_Architecture = 0
If ToggleButton2.Value = True Then categ = "ME": Tabl = "TB_mécanique":: max_Mécanique = 0
If ToggleButton3.Value = True Then categ = "S": Table = "TB_structure": max_structure = 0
If ToggleButton4.Value = True Then categ = "C": Tabl = "TB_civil": max_cicil = 0
If ToggleButton5.Value = True Then categ = "IN": Table = "TB_interne": max_interne = 0puis pour trouver les numérotations par catégories
For Each sh2 In Worksheets
If sh2.Name Like "DC-*" Then
If Mid(sh2.Name, 4, 1) = "A" Then If CLng(Mid(sh2.Name, 5)) > max_Architecture Then max_Architecture = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "M" Then If CLng(Mid(sh2.Name, 6)) > max_Mécanique Then max_Mécanique = CLng(Mid(sh2.Name, 6))
If Mid(sh2.Name, 4, 1) = "S" Then If CLng(Mid(sh2.Name, 5)) > max_structure Then max_structure = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "C" Then If CLng(Mid(sh2.Name, 5)) > max_civil Then max_civil = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "I" Then If CLng(Mid(sh2.Name, 6)) > max_interne Then max_interne = CLng(Mid(sh2.Name, 5))
Next sh2Pour trouver le nom de la feuille à créer
Sh.Copy After:=Sheets(Sheets.Count)
If ToggleButton1.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_Architecture + 1)
If ToggleButton2.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_Mécanique + 1)
If ToggleButton3.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_structure + 1)
If ToggleButton4.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_civil + 1)
If ToggleButton5.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_interne + 1)
...On peut faire le calcul des numérotation max par categorie, à l'initialisation de la feuille, donc dans la routine Userform_Initialize
Les trois lignes de déclarations de variables seront globales au userform, à savoir les lignes (à mettre en haut du code de la feuille UF_Directive):
Dim categ As String 'la catégorie sélectionnée
Dim Tabl As String ' pour prévoir l'accès aux cellules
Dim max_Architecture, max_Mécanique, max_structure, max_civil, max_interneJe commence à comprendre ce que tu veux faire, donc avoir le max des feuilles créées ne sert pas à grand chose.
Le but ne serait t'il pas de créer toutes les feuilles indiquées en colonne A des 5 tableaux, cela va faire beaucoup.
Sur le plan pratique, il est difficile de manipuler des classeurs contenant beaucoup d'onglets.
La limite est donc plus liée à une bonne ergonomie...
Il faut évaluer le nombre de feuilles directives et la taille occupée sur disque par ces directives car j'ai peur que tu dépasse les 3 gigas et que ton classeur devienne impossible à charger
Ne serait t'il pas mieux de faire un classeur par type de directives et par tranches numérotées afin de disposer de classeur pas trop lourd.
Bonjour scraper!
Merci beaucoup pour aide c'est très apprécié!
J'ai tenté le code et placé les lignes que tu as fait au meilleur de mes connaissances, je pense comprendre. J'ai une erreur qui survient avec "Next sh2" qui me dit qu'il n'y a pas la commande "For" alors qu'elle est là. Je crois que c'est plus tôt de la manière dont je l'ai entré qui ne doit pas être bonne. Je te met le code de la manière dont j'ai placé le tien tu seras en mesure de me dire si j'ai bien appliquer ton code ou non!
Private Sub CommandButton1_Click()
If ToggleButton1.Value = False And ToggleButton2.Value = False And ToggleButton3.Value = False And ToggleButton4.Value = False And ToggleButton5.Value = False Then
MsgBox ("Vous devez sélectionner l'une des catégories avant de pouvoir continuer."): Exit Sub
Else
Dim categ As String 'la catégorie sélectionnée
Dim Tabl As String 'pour prévoir l'accès aux cellules
Dim max_Architecture, max_Mécanique, max_structure, max_civil, max_interne
If ToggleButton1.Value = True Then categ = "A": Tabl = "TB_architecture": max_Architecture = 0
If ToggleButton2.Value = True Then categ = "ME": Tabl = "TB_mécanique":: max_Mécanique = 0
If ToggleButton3.Value = True Then categ = "S": Table = "TB_structure": max_structure = 0
If ToggleButton4.Value = True Then categ = "C": Tabl = "TB_civil": max_cicil = 0
If ToggleButton5.Value = True Then categ = "IN": Table = "TB_interne": max_interne = 0
Dim Sh As Worksheet, sh2 As Worksheet
Set Sh = Sheets("#TEMPLATE_DC")
For Each sh2 In Worksheets
If sh2.Name Like "DC-*" Then
If Mid(sh2.Name, 4, 1) = "A" Then If CLng(Mid(sh2.Name, 5)) > max_Architecture Then max_Architecture = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "M" Then If CLng(Mid(sh2.Name, 6)) > max_Mécanique Then max_Mécanique = CLng(Mid(sh2.Name, 6))
If Mid(sh2.Name, 4, 1) = "S" Then If CLng(Mid(sh2.Name, 5)) > max_structure Then max_structure = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "C" Then If CLng(Mid(sh2.Name, 5)) > max_civil Then max_civil = CLng(Mid(sh2.Name, 5))
If Mid(sh2.Name, 4, 1) = "I" Then If CLng(Mid(sh2.Name, 6)) > max_interne Then max_interne = CLng(Mid(sh2.Name, 5))
Next sh2
Sh.Copy After:=Sheets(Sheets.Count)
If ToggleButton1.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_Architecture + 1)
If ToggleButton2.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_Mécanique + 1)
If ToggleButton3.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_structure + 1)
If ToggleButton4.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_civil + 1)
If ToggleButton5.Value = True Then ActiveSheet.Name = "DC-" & categ & CStr(max_interne + 1)
On Error GoTo TriageErreur
Dim j As Integer
Dim i As Integer
Dim PremiereFeuille As Integer
Dim DerniereFeuille As Integer
PremiereFeuille = Count + 3
DerniereFeuille = ActiveWorkbook.Worksheets.Count
For i = PremiereFeuille To DerniereFeuille
For j = i To DerniereFeuille
If UCase(Worksheets(j).Name) < UCase(Worksheets(i).Name) Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Next j
Next i
Exit Sub
TriageErreur:
End SubBonsoir
La feuille registre contient les tableaux structurés qui contiennent les ID des Directives à créer en colonne A
Il est fortement déconseillé de mettre des tableaux structurés les uns en dessous des autres car il devient rapidement impossible d'ajouter des lignes sans perturber le tableau suivant.
J'ai créé plus de 570 feuilles de directives. Ensuite, comment vous irez sur chacune des feuilles de directive? Avez-vous prévu une interface utilisateur?
Le fichier Excel résultant fait plus de 5 Méga.
j'ai un pb car je peux recréer des feuilles qui ont le meme nom lorsque je relance le traitement
Effectivement, il recréer des feuilles existante déjà... J'ai tenté de mon côté de faire quelque chose, toute fois je n'ai vraiment pas tes connaissances en VBA tu me dépasses largement haha!
Je pense que je vais devoir rester avec la vieille méthode d'inscrire chacun des numéros malheureusement. C'est dommage ça l'aurait fait un fichier très faciles d'utilisation avec ça.
Si jamais une idée te vient n'hésite pas à m'en faire part je vais faire de même de mon côté!
Rebonjour scraper!
Je vais y aller avec un InputBox pour entrer les valeurs, je ne sais pas si tu peux m'aider avec ça, j'aimerais qu'au moins mon InputBox force une saisie numérique uniquement soit : 0123456789. Actuellement j'ai pu forcer la valeur numérique afin qu'il est toujours au minimum deux chiffres :
DCA = Format(InputBox("Veuillez saisir le numéro de la nouvelle directive de changement en architecture", "Nouvelle directive"), "00")Le code fonctionne très bien toute fois je peux quand même saisir des lettres. J'ai regardé sur le forum et internet et les gens ont parlé de la fonction Type:=1 sauf que cette fonctionne n'est pas prise en charge partout et ne fonctionne pas sur le mien et pourtant j'ai la dernière version récente de Excel... Est-ce tu connais une ligne de code qui même si quelqu'un essaie de saisir des lettres il ne peut pas comme j'ai déjà fait sur une TextBox d'un autre fichier que j'ai :
If InStr(1, "0123456789- ", Chr(KeyAscii)) = 0 And KeyAscii <> 8 Then
KeyAscii = 0
End IfMerci à toi!
J'oubliais! Idéalement si le nombre inscrit est 0 alors faire un message d'erreur comme le nombre n'est pas valide puisque le chiffre le plus bas ne peut-être que 1.