Importer des données d'un classeur dans un formulaire multipage

Y compris Power BI, Power Query et toute autre question en lien avec Excel
d
djibysadji
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 8 septembre 2019
Version d'Excel : 2016

Message par djibysadji » 8 septembre 2019, 19:37

Bonjour Le Forum
J'ai un classeur composé de plusieurs onglets: 8 onglets portent chacun le nom d'une classe (3A, 3B, 4A, 4B, 5A, 5B, 6A et 6B), deux onglets intitulés "Bulsem1" et Bulsem2, un onglet "Listes" et un autre sur les informations générales des élèves. Donc un classeur à 12 feuilles.

Pour afficher les notes du premier semestre et celles du deuxième, j'ai conçu un formulaire multipage: Une page intitulée Premier semestre et une autre intitulée deuxième semestre. Je voudrais pouvoir importer le prénom, nom, date et lieu de naissance, classe, sexe, le code ou matricule... et les notes des élèves de chaque classe dans ce formulaire.
J'ai fait deux comboboxes: une pour sélectionner les classes et une seconde qui en relation avec la première chargera les matricules de la classe sélectionnée. A la sélection d'une matricule ou code, les données de l'élève dont la matricule est sélectionnée s'affichent dans les textboxes

J'ai réussi à régler, je pense, le problème des comboboxes; mais la sélection d'une matricule ne permet pas jusqu'ici de charger les textboxes: MON PROBLEME!


J'affiche ci-dessous le code que j'ai réalisé:

Private O As Worksheet 'déclare la variable O (Onglet)
Private LI As Integer 'déclare la variable LI (LIgne)
Private DL As Integer 'déclare la variable DL (Dernière Ligne)
Private CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Private B As Worksheet 'déclare la variable B (onglet Bulletins)

Private Sub UserForm_Initialize()
Dim CL As Worksheet 'déclare la variable CL (CLasse)

For Each CL In Sheets 'boucle sur tous les onglets du classeur
'si le nom de l'onglet contient moins de 4 caractères, ajoute le nom aux ComboBoxes "cbocl1" et "cbocl2"
If Len(CL.Name) < 4 Then cbocl.AddItem CL.Name
If Len(CL.Name) < 4 Then cbocl2.AddItem CL.Name
Next CL 'prochain onglet de la boucle
Me.MultiPage1.Value = 0 'définit le Semestre 1 comme onglet par défaut

End Sub

Private Sub cbocl_Change()
Dim I As Byte 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim TP1 As String 'déclare la variable TP1 (TemPoraire 1)
Dim TP2 As String 'déclare la variable TP2 (TemPoraire 2)

cboco.Value = "" 'efface le contenu de la ComboBocx "cboco"
Set O = Worksheets(Me.cbocl.Value) 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne B de l'onglet O
With cboco 'prend en compte la ComboBox "cboco"
.ColumnCount = 2 'La cbo aura deux colonnes
.ColumnWidths = "0; 1" 'La deuxième sera visible (code)
.Clear 'On efface la cbo
For I = 16 To DL 'boucle sur les lignes 16 à DL
.AddItem I 'ajoute un élément à la ComboBox
.Column(1, .ListCount - 1) = O.Cells(I, "B") 'récupère le code dans la colonne 1 de la ComboBox
Next I 'prochaine ligne de la boucle
'tri alphabétique du code avec numéro de ligne qui suit
For I = 0 To Me.cboco.ListCount - 1 'boucle 1 : sur tous les code de la ComboBox
For J = 0 To Me.cboco.ListCount - 1 'boucle 2 : sur tous les code de la ComboBox
'condition : si le code de la boucle 1 est inférieur au code de la boucle 2 et si I est différent de J
If .Column(1, I) < .Column(1, J) And I <> J Then
'inverse le code
TP1 = .Column(0, I): .Column(0, I) = .Column(0, J): .Column(0, J) = TP1
'inverse le numéro de ligne corespondant au code
TP2 = .Column(1, I): .Column(1, I) = .Column(1, J): .Column(1, J) = TP2
End If 'fin de la condition
Next J 'prochain code de la boucle 2
Next I 'prochain code de la boucle 1
End With 'fin de la prise en compte de la ComboBox "cbocd1"

End Sub

Private Sub cbocl2_Change()
Dim I As Byte 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim TP1 As String 'déclare la variable TP1 (TemPoraire 1)
Dim TP2 As String 'déclare la variable TP2 (TemPoraire 2)

cboco2.Value = "" 'efface le contenu de la ComboBocx "cbocd1"
Set O = Worksheets(Me.cbocl2.Value) 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne B de l'onglet O
With cboco2 'prend en compte la ComboBpx "cbocd1"
.ColumnCount = 2 'la cbo aura deux colonnes
.ColumnWidths = "0; 1" 'La deuxième sera visible (code)
.Clear 'Efface la cbo
For I = 16 To DL 'boucle sur les lignes 16 à DL
.AddItem I 'ajoute un élément à la ComboBox
.Column(1, .ListCount - 1) = O.Cells(I, "B") 'récupère le code dans la colonne 1 de la ComboBox
Next I 'prochaine ligne de la boucle
'tri alphabétique du code avec numéro de ligne qui suit
For I = 0 To Me.cboco2.ListCount - 1 'boucle 1 : sur tous les code de la ComboBox
For J = 0 To Me.cboco2.ListCount - 1 'boucle 2 : sur tous les code de la ComboBox
'condition : si le code de la boucle 1 est inférieur au code de la boucle 2 et si I est différent de J
If .Column(1, I) < .Column(1, J) And I <> J Then
'inverse le code
TP1 = .Column(0, I): .Column(0, I) = .Column(0, J): .Column(0, J) = TP1
'inverse le numéro de ligne corespondant au code
TP2 = .Column(1, I): .Column(1, I) = .Column(1, J): .Column(1, J) = TP2
End If 'fin de la condition
Next J 'prochain code de la boucle 2
Next I 'prochain code de la boucle 1
End With 'fin de la prise en compte de la ComboBox "cbocd1"
End Sub

Private Sub cboco_Change()

CLA = Me.cbocl.Value 'définit la variable CLA (déclarée publique dans le module [Moduile 1])
If COD = "" Then Exit Sub 'Si on vide on quitte....ici
COD = Me.cboco.Value
If CLA = "" Then Exit Sub 'sort de la procédure si la variable CLA est vide
LI = Me.cboco.Column(0, Me.cboco.ListIndex) 'définit la ligne LI (récupérée dans la colonne cachée de la ComboBox "cbocd1")
Me.Txtef1.Value = O.Cells("C11").Value 'renvoie l'effectif dans la TextBox "txtef1"
For Each CTRL In Me.Controls 'boucle sur tous les contrôles CTRL du classeur
'si la propriété [Tag] du contrôle n'est pas vide, renvoie la valeur du controle dans la cellule
'ligne = LI, colonne = propriété [Tag] du contrôle
If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LI, CTRL.Tag)

Next CTRL 'prochain contrôle de la boucle

End Sub
Private Sub cboco2_Change()
CLA = Me.cbocl2.Value 'définit la variable CLA (déclarée publique dans le module [Moduile 1])
If COD = "" Then Exit Sub 'Si vide on quitte ici
COD = Me.cboco2.Value 'définit la variable COD (déclarée publique dans le module 1
If CLA = "" Then Exit Sub 'sort de la procédure si la variable CLA est vide
LI = Me.cboco2.Column(0, Me.cboco2.ListIndex) 'définit la ligne LI (récupérée dans la colonne cachée de la ComboBox "cboco2")
Me.Txtef2.Value = O.Cells("C11").Value 'renvoie l'effectif dans la TextBox "txtef"
For Each CTRL In Me.Controls 'boucle sur tous les contrôles CTRL du classeur
'si la propriété [Tag] du contrôle n'est pas vide, renvoie la valeur du controle dans la cellule
'ligne = LI, colonne = propriété [Tag] du contrôle
If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LI, CTRL.Tag)
Next CTRL 'prochain contrôle de la boucle

End Sub
Détails.xlsm
(214.18 Kio) Téléchargé 8 fois
Détails.xlsm
(214.18 Kio) Téléchargé 1 fois
Avatar du membre
galopin01
Passionné d'Excel
Passionné d'Excel
Messages : 6'074
Appréciations reçues : 113
Inscrit le : 18 septembre 2008
Version d'Excel : 2016
Téléchargements : Mes applications

Message par galopin01 » 9 septembre 2019, 05:53

bonjour,
Au risque de te froisser... Quel foutoir !

D'abord quand on cite du code on utilise les balises codes : Sélectionner tout le code puis appuyer sur le bouton : ( </>)
ça permet de conserver l'indentation et de donner envie de lire ton code.
Parce que là c'est illisible.
Ensuite ton classeur me semble dérisoire. Pas une ligne de code. Pas l'ombre d'un UserForm. Donc je ne te parle pas de multipage.
A moins que tu ne considères ta Feuil1 comme un UserForm ?
De toute façon un formulaire qu'il soit Userform ou multifeuilles avec autant de contrôles se traite avec un module de classes sinon c'est pas un programme que tu vas écrire mais une une encyclopédie en douze volume.
Et les données à importer tu les trouves ou ?
Bref je ne comprend rien.

A mon avis tu te lances dans un un projet timoré et surtout démesuré sans avoir la moindre idée de programmation.
Fournir un classeur convaincant.

A+
Ici c'est un forum Excel/VBA pas Photoshop :
Quand vous amenez votre voiture au garagiste vous lui donnez pas juste la photo ?
d
djibysadji
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 8 septembre 2019
Version d'Excel : 2016

Message par djibysadji » 10 septembre 2019, 18:08

Bonjour Galopin01, le forum
Contrairement à ce que tu crois, j'apprécie ta sincérité. Tu as raison je n'ai que très peu de connaissances en vba. Mais quand j'aimerais beaucoup que tu apportes ton aide. C'est projet très important pour moi et le collège que gère. Cette application si elle se réalise me fera gagner beaucoup de temps; Imagine nous gérons huit classes avec au minimum 80 élèves par classes.
Je te décris le problème ensuite je joins le fichier cette fois ci avec le code et le formulaire
MONPROJET.xlsm
(567.18 Kio) Téléchargé 6 fois

J'ai conçu un formulaire multipage (2 pages): une page intitulée "Premier semestre" et une autre "Deuxième semestre". Les deux pages sont sous forme de bulletin scolaire(voir fichier joint) .
L'objectif est de pouvoir importer les données des élèves, de les modifier..... et de pouvoir imprimer des bulletins via le fomulaire.
La sélection d'une classe A et d'un élève de cette classe A se fera à travers deux comboboxes. Au choix d'une classe dans la combobox "classe", les codes des élèves de cette classe se chargeront dans la combobox "codes" et là on pourra choisir l'élève dont on veut afficher les données dans les textboxes.
Le classeur doit être normalement composé de huit onglets qui portent chacun le nom d'une classe et de deux autres intitulés "Bulsem1" et "Bulsem2". Mais je l'ai considérablement réduit pour ne pas avoir des difficultés lors du transfert du fichier. De même j'ai mis un effectif de 3 élèves par classe pour les même raisons. Mais tenez vous bien nous avons des effectifs qui flirtent avec la centaine par classe. Donc prévoir huit classes et au minimum 90 élèves par classe.

Voir le code dans l'éditeur.
MONPROJET.xlsm
(567.18 Kio) Téléchargé 6 fois
Merci
DJISA
Avatar du membre
galopin01
Passionné d'Excel
Passionné d'Excel
Messages : 6'074
Appréciations reçues : 113
Inscrit le : 18 septembre 2008
Version d'Excel : 2016
Téléchargements : Mes applications

Message par galopin01 » 10 septembre 2019, 20:20

Bonsoir,
Je te réponds dans un moment par message privé...
A+
Ici c'est un forum Excel/VBA pas Photoshop :
Quand vous amenez votre voiture au garagiste vous lui donnez pas juste la photo ?
Avatar du membre
galopin01
Passionné d'Excel
Passionné d'Excel
Messages : 6'074
Appréciations reçues : 113
Inscrit le : 18 septembre 2008
Version d'Excel : 2016
Téléchargements : Mes applications

Message par galopin01 » 16 septembre 2019, 11:53

Bonjour,

Un sujet intéressant mais complexe ou j'ai préféré traiter directement en MP car l'auteur avaient grillé un peu maladroitement beaucoup de cartouches avec de multiples demandes un peu désordonnées sur plusieurs forums.
En définitive la question a été résolue logiquement en abandonnant l'idée d'utiliser un USF pour des impressions et d'utiliser une feuille ou un simple RECHERCHEV remonte les infos de la "base de données."

On peut donc considérer cette question comme provisoirement résolue.
A+
1 membre du forum aime ce message.
Ici c'est un forum Excel/VBA pas Photoshop :
Quand vous amenez votre voiture au garagiste vous lui donnez pas juste la photo ?
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message