[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 les amis,
Une petite question subsidiaire si vous me le permettez, l'onglet "TableauDeBord" était masqué, alors quand je l'ai affiché car normalement il doit rester affiché, j'ai remarqué qu'à chaque exécution d'une macro l'onglet "Base" change de place, il passe une fois avant "TableauDeBord" et une autre fois après..
Capt_01.png


Capt_02.png

Ça ne me pose aucun problème si on ne peut pas le régler facilement, le travail réalisé me va très bien.


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

Bonjour R@chid,

Problème facile à régler, il suffit d'ajouter à la fin de la macro CréerOnglets :
Code:
Sheets("Base").Move Before:=Sheets(1)
Fichier (2).

A+
 

Pièces jointes

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

Bonjour @ tous,
J'ai voulu protégé mon classeur alors j'ai fait la macro de créations des onglets comme suite :
Code:
Sub CréerOnglets()
Dim s As Object, t, i&, nom$, vis%, n&
Application.ScreenUpdating = False
On Error Resume Next
'---création des feuilles---
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
    ThisWorkbook.Unprotect "MotDePasseClasseur"
      vis = Sheets(t(i, 1)).Visible
      Sheets(t(i, 1)).Visible = True
      Sheets(t(i, 1)).Copy Before:=Sheets(1)
      ActiveSheet.Name = nom
      Sheets(nom).Unprotect "MotDePasseFeuille" 'adapter le mot de passe
      Sheets(nom).[C7] = nom 'nom de l'élève
      Sheets(nom).Protect "MotDePasseFeuille"
      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").Move Before:=Sheets(1)
Sheets("Base").Activate
ThisWorkbook.Protect "MotDePasseClasseur"
End Sub

Mais je remarque que après chaque clique même si il n'y a pas de nouveaux élèves elle déprotège le classeur et le laisse déprotéger, et après un autre clique elle le protège 😡.

Aussi pour les 2 autres macros Impression & Création PDF, elles déprotèges le classeur mais si je ne les ai pas modifié ou ajouté quoi que ce soit.

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

Re,
Finalement j'ai fait comme suite et ça marche tout fonctionne bien maintenant :
Code:
Sub CréerOnglets()
Dim s As Object, t, i&, nom$, vis%, n&
Application.ScreenUpdating = False
On Error Resume Next
'---création des feuilles---
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
    ThisWorkbook.Unprotect "MotDePasseClasseur"
      vis = Sheets(t(i, 1)).Visible
      Sheets(t(i, 1)).Visible = True
      Sheets(t(i, 1)).Copy Before:=Sheets(1)
      ActiveSheet.Name = nom
      Sheets(nom).Unprotect "MotDePasseFeuille" 'adapter le mot de passe
      Sheets(nom).[C7] = nom 'nom de l'élève
      Sheets(nom).Protect "MotDePasseFeuille"
      Sheets(t(i, 1)).Visible = vis 'état initial
    ThisWorkbook.Protect "MotDePasseClasseur"
    End If
  End If
1 Next
'---placement en tête des onglets autres que ceux des élèves---
For Each s In Sheets
ThisWorkbook.Unprotect "MotDePasseClasseur"
  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").Move Before:=Sheets(1)
Sheets("Base").Activate
ThisWorkbook.Protect "MotDePasseClasseur"
End Sub
Merci de me dire si c'est comme ça qu'il faut ou non ??
ça marche, mais j'aime bien avoir vos conseils

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

Bonsoir à Toutes et tous , Rachid,

Bon un truc est sur jouer avec la gestion d'erreur sans la localiser correctement cela peut jouer des tours ,

Voici un code sans débrayer la gestion d'erreur .

Code:
Sub CréerOnglets()
Dim s As Object, t As Variant, i&, nom$, vis%, n&
Dim Existe As Boolean, Onglet As Worksheet
Application.ScreenUpdating = False
'---création des feuilles---
t = Sheets("Base").[A1].CurrentRegion
For i = 2 To UBound(t)
'Ici

 Existe = False
 For Each Onglet In ThisWorkbook.Worksheets
  If Onglet.Name = t(i, 1) Then Existe = True
 Next

'jusque là
  If Not Existe Then GoTo 1
  
  nom = CStr(t(i, 2))

'idem 
 Existe = False
 For Each Onglet In ThisWorkbook.Worksheets
  If Onglet.Name = nom Then Existe = True
 Next

'voilà 
 If Not Existe Then
    If nom <> "" Then
    ThisWorkbook.Unprotect "MotDePasseClasseur"
      vis = Sheets(t(i, 1)).Visible
      Sheets(t(i, 1)).Visible = True
      Sheets(t(i, 1)).Copy Before:=Sheets(1)
      ActiveSheet.Name = nom
      Sheets(nom).Unprotect "MotDePasseFeuille"  'adapter le mot de passe
      Sheets(nom).[C7] = nom 'nom de l'élève
      Sheets(nom).Protect "MotDePasseFeuille"
      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").Move Before:=Sheets(1)
Sheets("Base").Activate
ThisWorkbook.Protect "MotDePasseClasseur"
End Sub
 
Re : [VBA] Créer des onglets à partir des autres vierges

Rachid,
J'ai retesté au moins 3 fois

Voici dans le fichier
 

Pièces jointes

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

Re,
Je viens de voir le classeur joint, le problème vient du fait qu'il n y a pas de nouveaux élèves, essayer de cliquer après avoir créé les onglets pour la première fois sans ajouter aucun nouvel élève, par-contre avec le truc que j'ai fait sur le post #36 je n'ai aucun problème.

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

Rachid ,

Voilà , suite à tes explications , j'arrive à reproduire le bug, donc dés que c'est reproductible , c'est corrigible ...

Je cherche un peu et revient vers toi.

ça plante ici
Code:
For Each s In ThisWorkbook.Worksheets
  If IsError(Application.Match(s.Name, Application.Index(t, , 2), 0)) _
    Then s.Move Before:=Sheets(1): n = n + 1
Next

exactement là
Code:
 s.Move Before:=Sheets(1)
 
Re : [VBA] Créer des onglets à partir des autres vierges

Rachid , j'ai vu le pourquoi ,

en fait la 2) fois tu ne passe pas par la création d'onglet et donc tu ne déprotéges par le classeur bloquant ainsi la fonction move , ,en mettant à nouveau le unprotect juste devant les boucles de déplacement , ca marche beaucoup mieux

Code:
 ThisWorkbook.Unprotect "MotDePasseClasseur"

'---placement en tête des onglets autres que ceux des élèves---
For Each s In ThisWorkbook.Worksheets
  If IsError(Application.Match(s.Name, Application.Index(t, , 2), 0)) _
    Then s.Move Before:=Sheets(1): n = n + 1
Next
 
- 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