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

R@chid

XLDnaute Barbatruc
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

  • XLD_Devoirs.xlsx
    39.3 KB · Affichages: 51

job75

XLDnaute Barbatruc
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

  • Excel - XLD_Devoirs(1).xls
    112 KB · Affichages: 47

job75

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

Re,

Relisant ton post #1 je vois que tu ne veux que le nom de l'élève comme nom d'onglet.

Dans ce cas utilise cette version (1 bis).

A+
 

Pièces jointes

  • Excel - XLD_Devoirs(1 bis).xls
    112.5 KB · Affichages: 45

R@chid

XLDnaute Barbatruc
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
 

job75

XLDnaute Barbatruc
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)" :confused:

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

  • XLD_Devoirs(1).xlsm
    48.9 KB · Affichages: 49

R@chid

XLDnaute Barbatruc
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
 

R@chid

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

Re,
Voici ce que j'ai obtenu quand j'ai changé le tri..
Je veux que la macro respecte l'ordre d'apparition des classes et des élèves.


@ + +
 

Pièces jointes

  • XLD_Devoirs(1)_2.xlsm
    101.6 KB · Affichages: 44

job75

XLDnaute Barbatruc
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

  • XLD_Devoirs(2).xlsm
    49.9 KB · Affichages: 45

R@chid

XLDnaute Barbatruc
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
 

job75

XLDnaute Barbatruc
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

  • XLD_Devoirs(3).xlsm
    50.1 KB · Affichages: 52
Dernière édition:

Dranreb

XLDnaute Barbatruc
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
 

job75

XLDnaute Barbatruc
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+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87