[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

R@chid

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

job75

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

  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    48.9 KB · Affichages: 55
  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    48.9 KB · Affichages: 57
  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    48.9 KB · Affichages: 52

R@chid

XLDnaute Barbatruc
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 :mad:.

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.

@ + +
 

R@chid

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

@ + +
 

camarchepas

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

camarchepas

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

  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    52.5 KB · Affichages: 49
  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    52.5 KB · Affichages: 52
  • XLD_Devoirs+PDF+Imprimer(2).xlsm
    52.5 KB · Affichages: 47

R@chid

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

@ + +
 

camarchepas

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

camarchepas

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

Discussions similaires

Statistiques des forums

Discussions
312 296
Messages
2 086 967
Membres
103 411
dernier inscrit
jamjam6767