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

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

26details.xlsm (214.18 Ko)
29details.xlsm (214.18 Ko)

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+

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

64monprojet.xlsm (567.18 Ko)

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.

64monprojet.xlsm (567.18 Ko)

Merci

DJISA

Bonsoir,

Je te réponds dans un moment par message privé...

A+

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+

Rechercher des sujets similaires à "importer donnees classeur formulaire multipage"