[VBA] Créer des onglets à partir des autres vierges

  • Initiateur de la discussion Initiateur de la discussion R@chid
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

R@chid

XLDnaute Barbatruc
Supporter XLD
Bonjour @ tous,
Encore une fois ce R@chid va poser 3 questions en VBA 🙂
Je travaille pour un établissement scolaire qui fait la formation et l'encadrement des candidats CNED, donc je dois faire une application pour suivre la réalisation des devoirs de chacun des élèves.
J'ai créé un fichier avec des onglets vierges, un onglet pour chaque classe ces derniers sont verrouillés par un mot de passe et je vais les masquer..

Ce que je veux faire :

Macro 1:
Créer des onglets à partir des onglets masqués "6EME" "5EME"… le nom de l'onglet doit porter le nom et prénom de l'élève et insérer aussi le nom de l'élève dans la cellule C7.
Noter que les onglets vont être verrouillés par mot de passe, et que je prévoie aussi l'inscription tardive des élèves donc il ne faut pas recréer ceux qui sont déjà créés.

Macro 2:
On va envoyer les relevés aux parents, alors il faut créer des fichiers PDF à partir des onglets, nom de fichier "Classe_JJMMAA_PrenomNom" dans un dossier que je vais spécifier.

Macro 3:
Une autre macro pour l'impression.

Voir PJ

J’espère être clair

Bien @ vous
 

Pièces jointes

Re : [VBA] Créer des onglets à partir des autres vierges

Bonjour R@chid,

Pour la 1ère macro vois le fichier joint :
Code:
Sub CréerOnglets()
Dim t, i&, nom$, vis As Boolean, j%
Application.ScreenUpdating = False
On Error Resume Next
t = Sheets("Base").[A1].CurrentRegion
For i = 2 To UBound(t)
  If IsError(Sheets(t(i, 1))) Then GoTo 1
  nom = t(i, 1) & "_" & t(i, 2)
  If IsError(Sheets(nom)) Then
    vis = Sheets(t(i, 1)).Visible
    Sheets(t(i, 1)).Visible = True
    Sheets(t(i, 1)).Copy After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = nom
    Sheets(nom).Unprotect "TOTO" 'adapter le mot de passe
    Sheets(nom).[C7] = t(i, 2) 'nom de l'élève
    Sheets(nom).Protect "TOTO"
    Sheets(t(i, 1)).Visible = vis 'état initial
  End If
1 Next
'---classement alphabétique des onglets---
For i = 6 To Sheets.Count 'on ne touche pas aux 5 premiers onglets
  For j = i + 1 To Sheets.Count
    If Sheets(j).Name < Sheets(i).Name Then Sheets(j).Move Before:=Sheets(i)
  Next
Next
Sheets("Base").Activate
End Sub
Il se crée des valeurs d'erreur #NOM?, à toi de voir ça.

Pour la création du fichier PDF mieux vaut utiliser Excel 2010 (je suis sur 2003).

Je vais partir en Normandie, guère le temps de continuer.

A+
 

Pièces jointes

Re : [VBA] Créer des onglets à partir des autres vierges

Bonjour @ tous,
Merci Job75 pour ton intervention..
Il y a un petit souci à adapter
Les onglets de base vont être masqués, donc avec cette macro quand c'est le cas, elle me crée des onglets nommés "6EME (2)" "6EME (3)" "5EME (2)" .... et ainsi de suite.
En plus pour le tri alphabétique de l'onglets, je préfère respecter le tri sur le tableau car il y a encore des autres classes comme "CM2" "2nde-Grle" "2nde-Pro" "1ere-STMG" "Term S" "Term ES", alors que pour faire le tri ce sera :
CM2
6EME
5EME
4EME
3EME
2NDE-GRLE
2NDE-PRO
1ERE-STMG
TERM ES
TERM S
je vais le faire sur le tableau avec une colonne intermédiaire et une formule pour avoir ce tri.
Donc ce que je veux c'est de respecter le tri, et comme ça si j’ajoute des autres élèves je ferai le tri et j'aime que les nouveaux onglets se placent correctement et pas en dernier.

Un autre petit truc c'est que je veux insérer les noms des élèves dans les cellules C7.

Merci
 
Re : [VBA] Créer des onglets à partir des autres vierges

Re,

Je ne comprends pas R@chid que tu obtiennes des noms d'onglets "6EME (2)" "6EME (3)" "5EME (2)" 😕

Chez moi les onglets créés portent bien les noms des élèves.

Par ailleurs ma macro renseigne bien la cellule C7 mais je n'avais pas vu que le mot de passe est "1234".

Je suis maintenant sur Excel 2010, vois le fichier joint où les feuilles modèles sont masquées.

J'ai déclaré vis Integer et enlevé le tri des onglets puisqu'il ne te convient pas :

Code:
Sub CréerOnglets()
Dim t, i&, nom$, vis%
Application.ScreenUpdating = False
On Error Resume Next
t = Sheets("Base").[A1].CurrentRegion
For i = 2 To UBound(t)
  If IsError(Sheets(t(i, 1))) Then GoTo 1
  nom = t(i, 2)
  If IsError(Sheets(nom)) Then
    vis = Sheets(t(i, 1)).Visible
    Sheets(t(i, 1)).Visible = True
    Sheets(t(i, 1)).Copy After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = nom
    Sheets(nom).Unprotect "1234" 'adapter le mot de passe
    Sheets(nom).[C7] = nom 'nom de l'élève
    Sheets(nom).Protect "1234"
    Sheets(t(i, 1)).Visible = vis 'état initial
  End If
1 Next
Sheets("Base").Activate
End Sub
A+
 

Pièces jointes

Re : [VBA] Créer des onglets à partir des autres vierges

Bonsoir Job75,
Merci mon ami, maintenant c'est bon, le problème de tout à l'heure a eu naissance après avoir enregistrer le fichier en *.XLSM..
Maintenant un autre petit truc, quand j'ajoute un nouvel élève je fais le tri et je clique sur "créer les onglets" mais il me le place en dernier, il ne respecte pas le tri..

Merci
 
Re : [VBA] Créer des onglets à partir des autres vierges

Re,

Avec cette macro :

- les onglets (même masqués) autres que ceux des élèves sont placés en tête

- les onglets des élèves sont classés dans l'ordre de la feuille.

Code:
Sub CréerOnglets()
Dim t, i&, nom$, vis%, s As Object, n&
Application.ScreenUpdating = False
On Error Resume Next
t = Sheets("Base").[A1].CurrentRegion
For i = 2 To UBound(t)
  If IsError(Sheets(t(i, 1))) Then GoTo 1
  nom = t(i, 2)
  If IsError(Sheets(nom)) Then
    vis = Sheets(t(i, 1)).Visible
    Sheets(t(i, 1)).Visible = True
    Sheets(t(i, 1)).Copy Before:=Sheets(1)
    Sheets(1).Name = nom
    Sheets(1).Unprotect "1234" 'adapter le mot de passe
    Sheets(1).[C7] = nom 'nom de l'élève
    Sheets(1).Protect "1234"
    Sheets(t(i, 1)).Visible = vis 'état initial
  End If
1 Next
'---placement en tête des onglets autres que ceux des élèves---
For Each s In Sheets
  If IsError(Application.Match(s.Name, Application.Index(t, , 2), 0)) _
    Then s.Move Before:=Sheets(1): n = n + 1
Next
'---classement des onglets des élèves dans l'ordre de la feuille---
For i = 0 To UBound(t) - 2
  Sheets(t(i + 2, 2)).Move After:=Sheets(n + i)
Next
Sheets("Base").Activate
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : [VBA] Créer des onglets à partir des autres vierges

Bonsoir Job75,
Merci mais le problème persiste, je vous explique :
J'ai fait un tri personnalisé,
Job75_6.png
J'ai exécuté la macro, tout est bien passé.
J'ai ajouté un élève "Rachid" en "6EME"
j'ai reappliqué le tri, et j'ai exécuté la macro, la macro m'a créé un onglet avec le sixième nommé "6EME (2)"
j'ai supprimé tous les onglets créés, et j'ai exécuté la macro encore une fois, alors là j'ai vu les onglets "6EME (2)" et "6EME (3)" ... et ainsi de suite..
C'est bizarre
 
Re : [VBA] Créer des onglets à partir des autres vierges

Re,

Désolé je ne comprends pas, mais peut-être une histoire de cellule vide (?), alors :

Code:
Sub CréerOnglets()
Dim t, i&, nom$, vis%, s As Object, n&
Application.ScreenUpdating = False
On Error Resume Next
t = Sheets("Base").[A1].CurrentRegion
For i = 2 To UBound(t)
  If IsError(Sheets(t(i, 1))) Then GoTo 1
  nom = CStr(t(i, 2))
  If IsError(Sheets(nom)) Then
    If nom <> "" Then
      vis = Sheets(t(i, 1)).Visible
      Sheets(t(i, 1)).Visible = True
      Sheets(t(i, 1)).Copy Before:=Sheets(1)
      Sheets(1).Name = nom
      Sheets(1).Unprotect "1234" 'adapter le mot de passe
      Sheets(1).[C7] = nom 'nom de l'élève
      Sheets(1).Protect "1234"
      Sheets(t(i, 1)).Visible = vis 'état initial
    End If
  End If
1 Next
'---placement en tête des onglets autres que ceux des élèves---
For Each s In Sheets
  If IsError(Application.Match(s.Name, Application.Index(t, , 2), 0)) _
    Then s.Move Before:=Sheets(1): n = n + 1
Next
'---classement des onglets des élèves dans l'ordre de la feuille---
For i = 2 To UBound(t)
  If CStr(t(i, 2)) <> "" Then _
    Sheets(CStr(t(i, 2))).Move After:=Sheets(n): n = n + 1
Next
Sheets("Base").Activate
End Sub
Fichier (3).

Bonne nuit et A+
 

Pièces jointes

Dernière édition:
Re : [VBA] Créer des onglets à partir des autres vierges

Bonsoir.

Rédigé comme ça ça à l'air de passer :
VB:
Sub CréerOnglets()
Dim T(), L&, Nom$, Vis As Boolean, F As Worksheet, I%
Application.ScreenUpdating = False
T = Sheets("Base").[A1].CurrentRegion.Value
I = 1
On Error Resume Next
For L = 2 To UBound(T)
   Nom = T(L, 2)
   Err.Clear: Set F = Worksheets(Nom)
   If Err Then
      Err.Clear: Worksheets(T(L, 1)).Copy After:=Worksheets(Worksheets.Count)
      If Err Then GoTo 1
      Set F = Worksheets(Worksheets.Count)
      F.Name = Nom
      F.Unprotect "1234" 'adapter le mot de passe
      F.[C7] = Nom 'nom de l'élève
      F.Protect "1234"
      F.Visible = True: End If
   F.Move After:=Worksheets(I)
   I = F.Index
1  Next L
Sheets("Base").Activate
End Sub
 
Re : [VBA] Créer des onglets à partir des autres vierges

Bonjour R@chid, Bernard, le forum,

La macro du post #10 n'allait pas, je l'ai corrigée.

Mais a priori il n'y a pas de cellules vides, ça ne changera donc rien.

Réessaye en repartant à zéro.

Je vais regarder ce qu'a fait Bernard.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour