formateur informatique

Application d'évaluation par QCM en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Application d'évaluation par QCM en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Evaluation des candidats par QCM VBA Excel

Dans cette formation VBA Excel, le but est d'évaluer les candidats sur les réponses données aux questions posées, selon le thème sélectionné, lors de la phase d'identification.

Application évaluation VBA Excel par questionnaires archivés en base de données Access



Il s'agit du 5ème volet des formations consistant à aboutir l'application d'évaluation des candidats. Les sujets sont archivés en base de données Access externe. Ils peuvent donc être démultipliés, ce qui rend l'application d'autant plus intéressante et souple.

Sources et présentation de la problématique
Nous proposons de récupérer les sources offrant les travaux développés lors des précédents volets. Ils sont nécessaires à l'élaboration de cette suite. La décompression conduit à deux fichiers. Il s'agit tout d'abord du classeur de l'application et ensuite de la base de données Access. Cette dernière archive les questionnaires ainsi que les données des candidats.
  • Double cliquer sur le classeur application-evaluation-vba-excel.xlsm pourl'ouvrir,
  • Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Le formulaire d'identification se charge automatiquement. Des animations, programmées lors du premier volet, attirent l'attention de l'utilisateur. Une fois qu'elles sont terminées, le candidat peut renseigner les champs désignés. Son identifiant est vérifié en base de données. S'il existe, la connexion est établie. Il s'agit du développement que nous avons réalisé lors du quatrième volet.

Si vous cliquez sur le lien Jamais inscrit ?, vous basculez sur le formulaire d'inscription. Lors du deuxième volet, nous avions codé des contrôles et guides de saisie. Enfin, lors du troisième volet, nous avions terminé le formulaire d'inscription. Les données d'un nouveau candidat peuvent désormais être inscrites en base de données. De fait, ce dernier peut s'identifier pour participer à une évaluation.

Si vous cliquez sur le bouton Annuler, vous basculez de nouveau sur le formulaire d'identification.

Nettoyer les résultats archivés
Lors de la précédente formation, nous avons aussi développé le bouton Démarrer. Il permet d'archiver les informations sur les feuilles Mémoire et Session. De même, il appelle deux procédures n'existant pas encore : purger et depart.
  • Fermer le formulaire en cliquant sur la croix de sa fenêtre,
  • Basculer dans l'éditeur de code VBA avec le raccourci clavier ALT + F11,
  • Dans l'explorateur de projet, double cliquer sur le formulaire Connexion pour l'afficher,
  • Puis, sur le formulaire, double cliquer sur le bouton Démarrer pour afficher son code,
Vous notez en effet la présence des appels en commentaires, aux procédures purger et depart. La première doit nettoyer les traces de l'ancien questionnaire en feuille Mémoire. La seconde doit récupérer les données inscrites dans cette même feuille au choix du questionnaire, pour restituer la première question et ses quatre propositions sur la feuille Evaluation. C'est ainsi que pourra débuter le test.
  • Dans l'explorateur de projet, déployer l'affichage du dossier Modules,
  • Puis, double cliquer sur l'élément Module1 pour afficher sa feuille de code,
  • Sous l'instruction Option Explicit, créer la procédure purger comme suit :
Sub purger()

Sheets('Memoire').Select
Range('B5:H24').Select
Selection.ClearContents

End Sub


Grâce à la méthode Select de l'objet VBA Sheets, nous activons tout d'abord la feuille Mémoire. Ainsi nous pouvons agir sur ses cellules. Avec la même méthode appliquée cette fois à l'objet Range, nous désignons précisément la plage de cellules à nettoyer (B5:H24). Il ne reste plus qu'à exploiter la méthode ClearContents de l'objet VBA Selection pour supprimer le contenu de toutes les cellules sélectionnées.

Une macro automatique aurait pour fournir ce code VBA. Plutôt que d'utiliser une boucle While à la recherche de toutes les cellules non vides à purger, nous avons préféré les désigner directement par l'objet Range. Une évaluation se déroule nécessairement sur 20 questions. Aucun contenu ne sera donc jamais inscrit après la ligne 24.

A chaque nouveau test, la feuille Memoire est désormais prête à accueillir les données au fur et à mesure de la progression de l'évaluation.

Nous avons besoin de variables publiques pour porter les données durant toute la partie. Comme vous le savez, une variable publique vit au-delà des bornes des procédures appelées. Il s'agit de connaître le moment de départ du test, de mémoriser la note qui évolue ainsi que le nombre de questions restantes qui diminue.
  • Sous l'instruction Option Explicit et avant la procédure purger, ajouter les déclarations publiques suivantes :
Dim la_note As Byte: Dim nb_rest As Integer
Dim mem_id As String: Dim ligne As Byte: Dim temps


Les variables la_note et nb_rest parlent d'elles-mêmes. La variable mem_id est importante. Elle est déclarée comme un String. Elle doit servir à mémoriser, sous forme de chaîne de caractères, l'ensemble des identifiants concaténés des questions déjà proposées. Elle sera donc interrogée afin de ne pas suggérer une question aléatoire qui a déjà été posée. La variable ligne doit progresser au fur et à mesure des questions. Son indice variable sera notamment exploité pour inscrire les nouvelles questions les unes à la suite des autres dans la feuille Mémoire. Enfin, la variable temps sera typée à la volée. Elle doit prélever l'information de temps au démarrage du test.



Initialiser la partie
La procédure depart doit donc récupérer les informations associées à la première question générée pour les offrir sur la feuille Evaluations. Ainsi, la partie pourra débuter. Souvenez-vous, ces données sont stockées sur la ligne 5 de la feuille Mémoire. Dans le même temps, elle doit démarrer le chrono. C'est la fonction VBA Timer qui permet de retourner le temps à la milliseconde près. Enfin, nous partons du principe que la feuille Evaluations sera protégée une fois l'application aboutie. L'objectif est d'empêcher le candidat d'agir sur la structure de la feuille. Le code VBA doit commencer par enlever cette protection. Une fois les actions terminées, il doit la réactiver.
  • Sous la procédure purger, créer la procédure depart, comme suit :
Sub depart()

ligne = 5
temps = Timer

Sheets('Evaluations').Select
Sheets('Evaluations').Unprotect

Range('B2').Value = ''' & Sheets('Memoire').Cells(ligne, 3).Value
Range('B5').Value = ''' & Sheets('Memoire').Cells(ligne, 4).Value
Range('F5').Value = ''' & Sheets('Memoire').Cells(ligne, 5).Value
Range('B8').Value = ''' & Sheets('Memoire').Cells(ligne, 6).Value
Range('F8').Value = ''' & Sheets('Memoire').Cells(ligne, 7).Value

Range('G11').Value = 0
mem_id = '-' & Sheets('Memoire').Cells(ligne, 2).Value & '-'
nb_rest = 20

Range('B14').Value = 'Nombre de questions restantes : '& nb_rest

Sheets('Evaluations').Protect DrawingObjects:=True, contents:=True, Scenarios:=True

End Sub


Nous initialisons la variable ligne à 5 pour désigner ensuite la cinquième ligne de la feuille Memoire. A la milliseconde près, nous prélevons l'information de temps que nous stockons dans la variable temps. Lorsque nous ferons la différence à l'issue de l'évaluation, nous connaîtrons la durée de la partie. Nous activons la feuille Evaluations grâce à la méthode Select de l'objet VBA Sheets. C'est sur cette feuille que se déroule le test. C'est donc elle qui doit être affichée au candidat. La méthode Unprotect de l'objet Sheets retire la protection de la feuille si elle existe. Puis, dans chaque cellule de la feuille Evaluations (Range('B2').Value), nous inscrivons l'information correspondante stockée en ligne 5 de la feuille Memoire (Sheets('Memoire').Cells(ligne, 3).Value). Notez l'ajout en préfixe de l'apostrophe (''' &) par concaténation. Certains questionnaires sont particuliers en effet, notamment l'évaluation sur Excel. Des propositions commencent par le symbole = pour suggérer des syntaxes de formules répondant à la question. Or lorsqu'une saisie débute par ce caractère, Excel tente de résoudre la formule. L'apostrophe en préfixe est une astuce consistant à retranscrire l'information sans tenter de l'interpréter.

Ensuite, nous réinitialisons le score à zéro (Range('G11').Value = 0). Nous mémorisons l'identifiant de la question proposée aléatoirement (mem_id = '-' & Sheets('Memoire').Cells(ligne, 2).Value & '-'). Vous notez que nous l'encadrons de tirets ('-'), pour qu'il n'y ait pas d'ambiguïté dans les recherches futures. Nous réinitialisons le nombre de questions restantes à 20 (nb_rest = 20). Comme cette variable est publique, elle pourra être décrémentée au fil de la partie. Nous inscrivons l'information en cellule B14 prévue à cet effet. Enfin puisque les premiers traitements sont terminés, grâce à la méthode Protect de l'objet Sheets, nous réactivons la protection de la feuille.

Pour tester ces deux procédures, nous devons supprimer les commentaires qui les neutralisent.
  • Afficher le formulaire Connexion en conception,
  • Double cliquer sur le bouton Démarrer pour basculer dans sa procédure évènementielle,
  • Supprimer l'apostrophe en préfixe des appels des procédures purger et depart,
  • Enregistrer les modifications et afficher de nouveau le formulaire Connexion en conception,
  • Enfoncer la touche F5 du clavier pour l'exécuter,
  • Taper un identifiant reconnu, par exemple : 999999,
  • Cliquer sur le bouton Ok pour déverrouiller et charger la liste déroulante,
  • Dans la liste, choisir un thème, par exemple : Anglais niveau 1,
  • Puis, cliquer sur le bouton Démarrer,
Comme nous réalisons la simulation depuis l'éditeur VBA, le focus lui est rendu une fois le traitement terminé. Si nous avions débuté le test à l'ouverture du classeur, la feuille Evaluations aurait été affichée dans la foulée. Nous aurons tout le loisir de réaliser une simulation complète.
  • Afficher la feuille Evaluations,
Début évaluation VBA Excel par QCM avec question générée aléatoirement

Comme vous le constatez, la première question aléatoire et ses quatre suggestions sont parfaitement retranscrites. Le score et le nombre de questions restantes sont de même réinitialisés.
  • Cliquer sur l'onglet Mémoire en bas de la fenêtre Excel pour afficher sa feuille,
Nettoyer tableau Excel et archiver informations de base de données par code VBA

La procédure purger a fait son oeuvre. Le tableau traçant les questions de l'évaluation a été nettoyé. La première question y a été ajoutée. Les autres suivront au fil de la partie.



Comparer les réponses de l'évaluation
La partie doit désormais se dérouler sur les 20 questions au clic sur le bouton Suivant de la feuille Evaluations. Un code VBA associé doit comparer la réponse fournie par le candidat grâce à la liste déroulante en C11. Cette donnée doit être confrontée à celle archivée en colonne H de la feuille Memoire pour la ligne en cours (variable publique ligne). Bien sûr, cette feuille devra être masquée pour finaliser l'application afin de préserver les informations confidentielles.

Cette procédure doit ensuite générer une nouvelle question aléatoire qui n'a pas encore été proposée. Une chaîne de texte les mémorise toutes par concaténation (mem_id). Nous allons donc devoir l'exploiter.
  • Revenir dans l'éditeur de code VBA Excel,
  • Dans l'explorateur de projet, double cliquer sur l'élément Module1 pour afficher sa feuille,
  • Sous la procédure depart, créer la procédure suivant, comme suit :
Sub suivant()
Dim requete As String: Dim chemin_bd As String
Dim enr As Recordset: Dim base As Database

End Sub


Nous déclarons les variables usuelles permettant de manipuler les données de bases de données.

La question ne doit être validée que si l'utilisateur a bien émis un choix en cellule C11, par le biais de la liste déroulante.
  • A la suite du code, ajouter l'instruction conditionnelle suivante :
If(Sheets('Evaluations').Range('C11').Value <> '') Then
Sheets('Evaluations').Unprotect

End If


Si une réponse a bien été donnée (Range('C11').Value <> ''), nous commençons par ôter temporairement la protection de la feuille.

Nous devons désormais comparer la réponse fournie avec le numéro de la bonne réponse archivée en colonne H de la feuille Memoire.
  • Dans les bornes de l'instruction If, ajouter le code VBA suivant :
If (Right(Sheets('Evaluations').Range('C11').Value, 1) = Right(Sheets('Memoire').Cells(ligne, 8).Value, 1)) Then
Range('G11').Value = Range('G11').Value + 1
End If

ligne = ligne + 1
nb_rest = nb_rest - 1
Range('B14').Value = 'Nombre de questions restantes : '& nb_rest

If (nb_rest = 0) Then
'fin
Exit Sub
End If


Les questionnaires ne sont pas tous homogènes. La bonne réponse est parfois stockée sous forme de numéro (1, 2, 3, 4) ou de texte (Choix1, Choix2 etc...). Pour ne comparer que les numéros entre eux, nous exploitons la fonction VBA Right. Avec la valeur 1 passée en second argument, elle prélève le dernier caractère de la chaîne passée en premier paramètre. Nous comparons donc bien le numéro de la réponse proposée (Range('C11').Value), avec celui qui est archivé en feuille Memoire (Cells(ligne, 8).Value).

Si ces numéros coïncident, le candidat a bien répondu. En conséquence, nous incrémentons son score (Range('G11').Value = Range('G11').Value + 1). Dans tous les cas, nous plaçons le pointeur de lecture sur la ligne suivante, grâce à la variable publique (ligne = ligne + 1). Bien sûr, nous n'oublions pas de décrémenter la variable publique des questions restantes (nb_rest = nb_rest - 1).

Et justement, si la dernière question est atteinte (If (nb_rest = 0)), alors nous mettons fin au traitement (Exit Sub), donc à l'évaluation. Nous en profitons pour appeler la procédure fin qui n'existe pas encore. C'est pourquoi nous la neutralisons par l'apostrophe du commentaire. Dans le dernier volet, elle aura pour objectif d'archiver les résultats du candidat et d'offrir son classement sur le thème sélectionné.

Que le candidat ait bien répondu ou non, il est temps de passer à la question suivante. Elle est archivée en base de données. Nous devons la générer. Pour cela, nous devons initialiser les objets de bases de données.
  • A la suite du code de la procédure, toujours entre les bornes de la première instruction conditionnelle, ajouter les affectations suivantes :
chemin_bd = ThisWorkbook.Path & 'questionnaires-evaluations.accdb'
Set base = DBEngine.OpenDatabase(chemin_bd)
Set enr = base.OpenRecordset('SELECT TOP 1 * FROM [' & Sheets('Session').Range('C5').Value & '] ORDER BY RND(-(100000*N°)*Time())', dbOpenDynaset)


Il s'agit de techniques que nous avons déjà exploitées à maintes reprises. La propriété Path de l'objet VBA Excel ThisWorkbook retourne le chemin d'accès complet au classeur du projet en cours. La base de données Access est située dans le même dossier. Nous la concaténons à ce résultat pour la désigner grâce à la variable chemin_bd.

La méthode OpenDatabase de l'objet DBEngine permet de pointer sur cette base de données ainsi passée en paramètre. Grâce à la méthode héritée OpenRecordset, nous accédons aux enregistrements de la base de données, selon la syntaxe SQL qui lui est passée en premier argument. Grâce à la fonction SQL RND appliquée sur le champ de la clé primaire (N°) dans la clause ORDER BY, nous réalisons un tri aléatoire sur les enregistrements du questionnaire choisi (FROM [' & Sheets('Session').Range('C5').Value & ']). Comme nous ne prélevons que le premier d'entre eux avec tous les champs (SELECT TOP 1 *), nous générons une nouvelle question aléatoire.

Mais rien ne dit que cette proposition aléatoire n'a pas été faite lors des précédentes questions. Il s'agit donc de vérifier si le numéro d'enregistrement n'a pas déjà été stocké dans la variable publique mem_id.
  • A la suite du code VBA, ajouter les instructions suivantes :
If (enr.RecordCount > 0) Then
enr.MoveFirst

While (InStr(1, mem_id, '-' & enr.Fields('N°').Value & '-') > 0)
Set enr = base.OpenRecordset('SELECT TOP 1 * FROM [' & Sheets('Session').Range('C5').Value & '] ORDER BY RND(-(100000*N°)*Time())', dbOpenDynaset)
enr.MoveFirst
Wend

End If


Nous vérifions tout d'abord que la requête produit un résultat grâce à la propriété RecordCount de l'objet Recordset enr. Si tel est le cas, nous plaçons le pointeur de lecture sur l'enregistrement résultant. Il s'agit de la question générée aléatoirement. Et puis nous exploitons un critère dans un traitement récursif à l'aide d'une boucle While. Ce dernier consiste à regénérer la question (SELECT TOP 1 * FROM...), tant que (While) le numéro de l'enregistrement a déjà été proposé. Pour ce faire, nous exploitons la fonction VBA InStr. Cette dernière livre la position de l'occurrence cherchée ('-' & enr.Fields('N°').Value & '-'), dans la chaîne de caractères (mem_id). Souvenez-vous, pour des raisons de clarté, nous mémorisons chaque numéro traité en l'encadrant de tirets ('-' &). Si la position renvoyée par la fonction InStr n'est pas nulle (>0), nous en déduisons que la question a déjà été posée.

Ainsi, au sortir de la boucle, la proposition est forcément nouvelle. Nous devons récolter les données pour les inscrire à la suite dans la feuille Mémoire. Puis, nous devons restituer la question et ses propositions dans la feuille Evaluations. Ainsi le test du candidat progresse.
  • A la suite du code, après la boucle While, ajouter les instructions suivantes :
Sheets('Memoire').Cells(ligne,2).Value = enr.Fields('N°').Value
Sheets('Memoire').Cells(ligne, 3).Value = ''' & enr.Fields('QUESTION').Value
Sheets('Memoire').Cells(ligne, 4).Value = ''' & enr.Fields('choix1').Value
Sheets('Memoire').Cells(ligne, 5).Value = ''' & enr.Fields('choix2').Value
Sheets('Memoire').Cells(ligne, 6).Value = ''' & enr.Fields('choix3').Value
Sheets('Memoire').Cells(ligne, 7).Value = ''' & enr.Fields('choix4').Value
Sheets('Memoire').Cells(ligne, 8).Value = enr.Fields('REPONSES').Value

mem_id = mem_id & '-' & enr.Fields('N°').Value & '-'

Range('B2').Value = ''' & Sheets('Memoire').Cells(ligne, 3).Value
Range('B5').Value = ''' & Sheets('Memoire').Cells(ligne, 4).Value
Range('F5').Value = ''' & Sheets('Memoire').Cells(ligne, 5).Value
Range('B8').Value = ''' & Sheets('Memoire').Cells(ligne, 6).Value
Range('F8').Value = ''' & Sheets('Memoire').Cells(ligne, 7).Value


Comme toujours, c'est la propriété Fields de l'objet Recordset enr qui permet de pointer sur le champ dont le nom est passé en paramètre. La propriété Value restitue alors l'information que nous inscrivons dans la feuille Mémoire à la suite, grâce à la variable publique ligne que nous avons précédemment incrémentée.

Nous n'oublions pas de mémoriser le numéro de la question dans la variable publique mem_id. Ainsi, elle ne pourra plus être proposée pour la suite de l'évaluation. Puis, nous restituons les questionnaires dans la feuille Evaluations, sans oublier de préfixer les propositions d'une apostrophe, pour les raisons évoquées précédemment.

Pour finaliser le traitement, nous devons fermer les connexions ouvertes et détruire les objets de bases de données.
  • Après le End If, mais toujours dans les bornes de la première instruction conditionnelle, ajouter les lignes VBA suivantes :
enr.Close
base.Close

Set enr = Nothing
Set base = Nothing

Sheets('Evaluations').Protect DrawingObjects:=True, contents:=True, Scenarios:=True


La méthode Close des objets de bases de données ferme les connexions. La réaffectation à Nothing permet de les détruire pour les vider de la mémoire. Enfin, nous n'oublions pas de réactiver la protection de la feuille grâce à la méthode Protect de l'objet Sheets.

Il est temps de simuler une évaluation.
  • Enregistrer les modifications (CTRL + S),
  • Afficher le formulaire Connexion en mode conception,
  • Enfoncer la touche F5 du clavier pour l'exécuter,
  • Après les animations, taper un identifiant valide, par exemple : 999999,
  • Cliquer sur le bouton Ok pour identifier le candidat,
  • Dans la liste déroulante, choisir un thème, par exemple : Anglais Niveau 1,
  • Puis, cliquer sur le bouton Démarrer,
Une fois encore, comme il ne s'agit pas d'une simulation complète, le focus est rendu à l'éditeur de code VBA.
  • Afficher la feuille Evaluations (ALT + TAB),
  • Emettre un choix grâce à la liste déroulante située en cellule C11,
  • Puis cliquer sur le bouton Suivant pour valider la proposition,
Evaluation Excel avec contrôle validité des réponses par le code VBA

Comme vous le constatez, une nouvelle question surgit immédiatement. Elle est bien accompagnée de ses quatre propositions. Le score est incrémenté si la réponse fournie est correcte. Le compteur des questions restantes est décrémenté quant à lui. Le lien entre le bouton et la procédure était prédéfini (Clic droit / Affecter une macro), même si au départ cette dernière n'existait pas encore. C'est pourquoi un clic sur le bouton déclenche l'exécution de son code.

Si vous poursuivez le test jusqu'à la fin, vous constatez que l'évaluation se déroule parfaitement. Rien n'empêche pour l'instant au candidat de continuer de cliquer sur le bouton Suivant, même si la dernière question est atteinte. Nous corrigerons ce souci dans le dernier volet en archivant les résultats en base de données et en basculant l'affichage automatiquement sur la feuille Classements.

Mémoriser dans tableau Excel questions posées lors évaluation avec les scores

Pour valider le bon fonctionnement de l'application, nous proposons de la tester en conditions réelles.
  • Fermer le classeur Excel en l'enregistrant,
  • Puis le rouvrir pour constater l'affichage automatique du formulaire d'identification,
  • Taper un identifiant reconnu et le valider avec le bouton Ok,
  • Choisir un thème et cliquer sur le bouton Démarrer pour débuter le test,
Comme vous le constatez, cette fois l'affichage bascule automatiquement sur la feuille Evaluations. Le candidat peut donc participer jusqu'à la dernière question. Il ne restera plus qu'à valider le test à l'issue.

Le code VBA complet de la procédure Suivant est rappelé ci-dessous :

Sub suivant()
Dim requete As String: Dim chemin_bd As String
Dim enr As Recordset: Dim base As Database

If (Sheets('Evaluations').Range('C11').Value <> '') Then
Sheets('Evaluations').Unprotect

If (Right(Sheets('Evaluations').Range('C11').Value, 1) = Right(Sheets('Memoire').Cells(ligne, 8).Value, 1)) Then
Range('G11').Value = Range('G11').Value + 1
End If

ligne = ligne + 1
nb_rest = nb_rest - 1
Range('B14').Value = 'Nombre de questions restantes : ' & nb_rest

If (nb_rest = 0) Then
'fin
Exit Sub
End If

chemin_bd = ThisWorkbook.Path & 'questionnaires-evaluations.accdb'
Set base = DBEngine.OpenDatabase(chemin_bd)
Set enr = base.OpenRecordset('SELECT TOP 1 * FROM [' & Sheets('Session').Range('C5').Value & '] ORDER BY RND(-(100000*N°)*Time())', dbOpenDynaset)

If (enr.RecordCount > 0) Then
enr.MoveFirst

While (InStr(1, mem_id, '-' & enr.Fields('N°').Value & '-') > 0)
Set enr = base.OpenRecordset('SELECT TOP 1 * FROM [' & Sheets('Session').Range('C5').Value & '] ORDER BY RND(-(100000*N°)*Time())', dbOpenDynaset)
enr.MoveFirst
Wend

Sheets('Memoire').Cells(ligne, 2).Value = enr.Fields('N°').Value
Sheets('Memoire').Cells(ligne, 3).Value = ''' & enr.Fields('QUESTION').Value
Sheets('Memoire').Cells(ligne, 4).Value = ''' & enr.Fields('choix1').Value
Sheets('Memoire').Cells(ligne, 5).Value = ''' & enr.Fields('choix2').Value
Sheets('Memoire').Cells(ligne, 6).Value = ''' & enr.Fields('choix3').Value
Sheets('Memoire').Cells(ligne, 7).Value = ''' & enr.Fields('choix4').Value
Sheets('Memoire').Cells(ligne, 8).Value = enr.Fields('REPONSES').Value

mem_id = mem_id & '-' & enr.Fields('N°').Value & '-'

Range('B2').Value = ''' & Sheets('Memoire').Cells(ligne, 3).Value
Range('B5').Value = ''' & Sheets('Memoire').Cells(ligne, 4).Value
Range('F5').Value = ''' & Sheets('Memoire').Cells(ligne, 5).Value
Range('B8').Value = ''' & Sheets('Memoire').Cells(ligne, 6).Value
Range('F8').Value = ''' & Sheets('Memoire').Cells(ligne, 7).Value

End If

enr.Close
base.Close

Set enr = Nothing
Set base = Nothing

Sheets('Evaluations').Protect DrawingObjects:=True, contents:=True, Scenarios:=True

End If

End Sub


 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn