[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

Re R@chid,

Je ne comprends pas ce que tu as fait avec ton fichier du post #11, en effet :

- j'affiche la feuille "Rachid", je vois qu'elle a été modifiée : classe non renseignée, nombres de devoirs différents

- je supprime cette feuille ainsi que la feuille "6EME(2)"

- je relance la macro : tout se passe normalement chez moi, la feuille "Rachid" se crée bien, au bon endroit...

- même si je masque cette feuille, aucun problème.

A+
 

R@chid

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

Bonjour @ tous,
Salut Daranreb, Salut Job75.

@ Dranreb : même chose mon cher ami, je ne peux pas voir d'où vient le problème.
@ Job75 : je te le jure j'ai rient fait du fichier
Pour la modification que tu as faite sur le post #10, j'ai téléchargé le fichier, j'ai modifié le tri comme tu vas le voir, j'ai lancé la macro, tout est bien passé, j'ai ajouté un élève "Rachid" avec les "6EME" et j'ai réapliqué le tri, alors j'ai lancé la macro, et voilà l'apparition de "6EME (2)" au bonne place mais "Rachid" est masqué.

Peut-être que la source du problème de mon âge qui ne convient pas au "6EME" ni à toutes niveaux du CNED.


Merci à vous
 

Pièces jointes

  • XLD_Devoirs(3)_2.xlsm
    142.6 KB · Affichages: 44

JCGL

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

Bonjour à tous,

Fonctionne parfaitement si tu appliques les recommandations du #16 de l'ami Gérard.

A++
A+ à tous
 

Pièces jointes

  • JC XLD_Devoirs(3)_2.xlsm
    140.7 KB · Affichages: 40

camarchepas

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

Bonjour Dranreb, Job, Rachid , le Forum, Et JC (qui édidait en même temps que moi )

Bon , je te rassure Rachid , j'ai réussis à reproduire l'anomalie en créant un nouvel éléve Alain petit nouveau,

puis en triant dans la feuille , cette occurence passe en premiére ligne , lors de l'éxécution de la macro il créé bien la feuille de l'éléve en masqué et me laisse également une feuille 3emme(2) puisque c'était un éléve de troisiéme.

Voilà , je vais essayer d'analyser le truc

A bientot
 

R@chid

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

Bonjour les amis,
Merci "camarchepas" pour ton passage pour me rassurer :)
JCGL, merci à toi également, c'est vrai, je l'ai supprimé et j'ai ajouté "Rachid" en "6EME" et "Ahmed" en "5EME", j'ai fait le tri et j'ai relancé la macro tout est bien passé, j'ai ajouté "Fatima" en "3EME" et j'ai relancé la macro et voilà la renaissance du même souci.


@ + +
 

JCGL

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

Bonjour à tous,

j'ai ajouté "Fatima" en "3EME" et j'ai relancé la macro et voilà la renaissance du même souci.

Je pense que tu n'as pas ajouté Fatima mais remplacé Elève xx par Fatima.
La feuille de l'Elève xx existe toujours.

Attendons que l'ami Gérard ait fini les Célébrations du Débarquement pour avoir son avis.

A+ à tous
 

camarchepas

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

Re , Rachid,

Je pense que le référencement de la feuille créee était un peu hazardeux,

car en fait l'on renommait l'onglet modele ....

Modifies ce bout de macro :

Code:
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)
      ActiveSheet.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
  End If
1 Next
 
Dernière édition:

job75

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

Re, bonjour les nouveaux arrivés,

Bon j'ai compris ce qui se passait, c'est dû aux feuilles masquées, mais ce n'est pas facile à expliquer.

Alors cette nouvelle macro ne pose plus aucun problème, refais ta manip R@chid :

Code:
Sub CréerOnglets()
Dim s As Object, t, i&, nom$, vis%, n&
Application.ScreenUpdating = False
On Error Resume Next
'---placement après la feuille "Base" des onglets masqués---
For Each s In Sheets
  If s.Visible <> -1 Then s.Move After:=Sheets("Base")
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
      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 (4).

A+
 

Pièces jointes

  • XLD_Devoirs(4).xlsm
    50.2 KB · Affichages: 38

R@chid

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

Bonjour les amis,
Merci de votre retour..

@ Patrick :
Merci pour le conseil, je suis encore jeune je dois oublier ce conseil de temps en temps.

@ camarchepas :
Merci pour l'adaptation ça marche parfaitement.

@ Job75 :
La nouvelle macro fonctionne comme il faut.

Finalement vous m'avez cru, je vais continuer d'essayer en ajoutant quelques données sur les autres colonnes pour voir ce que ça va donner.

Dranred, JCGL, merci à vous aussi c'est gentil.

merci.jpg

Merci @ vous tous
 

Pièces jointes

  • merci.jpg
    merci.jpg
    23.5 KB · Affichages: 93
  • merci.jpg
    merci.jpg
    23.5 KB · Affichages: 95

job75

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

Re,

La solution de camarchepas post #23 est nettement plus simple, je n'avais pas pensé à utiliser ActiveSheet.

Je l'ai donc introduite dans le fichier joint ainsi que ces 2 macros, comme demandé :

Code:
Sub PDF()
Dim chemin$, P As Range, i&, classe$, nom$
CréerOnglets
chemin = ThisWorkbook.Path & "\Eleves" 'à adapter
Application.DisplayAlerts = False
On Error Resume Next
MkDir chemin 'pour créer le sous-dossier
Set P = Sheets("Base").[A1].CurrentRegion
For i = 2 To P.Rows.Count
  classe = CStr(P(i, 1)): nom = CStr(P(i, 2))
  If P.Rows(i).Hidden = False And classe <> "" And nom <> "" Then _
    Sheets(nom).ExportAsFixedFormat xlTypePDF, chemin & "\" & _
      Replace(classe & Format(Date, "_ddmmyy_") & nom, " ", "")
Next
End Sub

Sub Imprimer()
Dim P As Range, i&
CréerOnglets
Set P = Sheets("Base").[A1].CurrentRegion
For i = 2 To P.Rows.Count
  If P.Rows(i).Hidden = False And CStr(P(i, 1)) <> "" And _
    CStr(P(i, 2)) <> "" Then Sheets(CStr(P(i, 2))).PrintOut
Next
End Sub
A+
 

Pièces jointes

  • XLD_Devoirs+PDF+Imprimer(1).xlsm
    54.9 KB · Affichages: 47
Dernière édition:

R@chid

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

Re,
Merci Job75,
Pour les PDF's, il ne prend pas en compte le filtre, même si je filtre il imprime tous les onglets, en plus je vais le faire sur le même dossier je ne veux pas créer un dossier pour chaque exportation en PDF, c'est pour ça j'ai pensé d’intégrer la date d'exportation dans le nom du fichier.

Pour la macro de l'impression, elle bug

Merci de votre retour
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

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