Erreur code Formulaire de saisie excel

Erreur code Formulaire de saisie excel - VB/VBA/VBS - Programmation

Marsh Posté le 03-06-2019 à 16:09:11    

Bonjour,
 
Je viens là car je deviens fou, à force de me ronger les ongles je vais attaquer les phalanges et c'est pas bon... :pt1cable:  
 
Alors à mon boulot, j'ai une base de données sous excel des dossiers des agents du personnel archivés. A chaque transferts de dossiers de personnels aux archives, je recois la liste des personnes de ce transfert que je renseigne dans mon tableau.

Dans mon tableau j'ai 11 colonnes
:  
- ID (que je n'utilise pas mais qui peut-être utile),  
- Civilité qui se limite à M., Mme et rien quand j'ai un doute (ça arrive si si),  
- Nom d'usage
- Nom de naissance (si besoin)
- Prénom
- Date ou année de naissance
- Année de dossier (facultatif)
- Statut de l'agent (toujours le même en fait)
- Titulaire ou vacataire
- Localisation (numéro de l'armoire ou de la boite)
- Observations
 
Les infos que j'ai systématiquement lorsqu'on m'envoie une liste c'est civilité, nom d'usage, nom de naissance si besoin, date ou année de naissance, statut, titulaire ou vacataire et localisation.
 
Ce tableau a jusqu'à maintenant été rempli par ordre alphabétique sauf que les listes qu'on m'envoie ne le sont pas, bref du coup c'est mega relou à remplir, surtout que c'est une tâche secondaire à mes missions.
 
Bon, vu qu'imaginer un code pour moissonner les données des tableaux (listes) qu'on m'envoie pour le renseigner mon tableau principal est trop compliqué (mais serait tellement pratique). Je me suis lancé dans la création d'un formulaire qui m'évitera au moins de jouer de la roulette.
 
J'ai donc créé le formulaire suivant :
 https://image.noelshack.com/fichiers/2019/23/1/1559570433-capture33.jpg
 
Avec le code suivant :
 

Code :
  1. Option Explicit
  2. Dim Ws As Worksheet
  3. 'Pour le formulaire
  4. Private Sub UserForm1_Initialize()
  5. Dim J As Long
  6. Dim I As Integer
  7.  
  8.   Set Ws = Sheets("BIATSS" ) 'Correspond au nom de votre onglet dans le fichier Excel
  9.   With Me.ComboBox1
  10.       For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
  11.        .AddItem Ws.Range("A" & J)
  12.     Next J
  13. End With
  14. For I = 1 To 9
  15.      Me.Controls("TextBox" & I).Visible = True
  16. Next I
  17. End Sub
  18. 'Pour la liste déroulante ID
  19. Private Sub ComboBox1_AfterUpdate()
  20. Dim Ligne As Long
  21. Dim I As Integer
  22. If Me.ComboBox1.ListIndex = -1 Then Exit Sub
  23.   Ligne = Me.ComboBox1.ListIndex + 2
  24.   ComboBox2 = Ws.Cells(Ligne, "B" )
  25.   For I = 1 To 9
  26.      Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
  27.   Next I
  28. End Sub
  29. 'Pour la liste Rechercher par nom
  30. Private Sub ComboBox3_Change()
  31. Dim Ligne As Long
  32. Dim I As Integer
  33.    If Me.ComboBox3.ListIndex = -1 Then Exit Sub
  34.   Ligne = Me.ComboBox1.ListIndex + 2
  35.   For I = 1 To 9
  36.     Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
  37.   Next I
  38. End Sub
  39. 'Pour le bouton Nouveau contact
  40. Private Sub CommandButton1_Click()
  41. Dim L As Integer
  42. If MsgBox("Confirmez-vous cette nouvelle entrée ?", vbYesNo, "Demande de confirmation d'ajout" ) = vbYes Then
  43.      L = Sheets("BIATSS" ).Range("a65536" ).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
  44.      Range("A" & L).Value = ComboBox1
  45.      Range("B" & L).Value = ComboBox2
  46.      Range("C" & L).Value = ComboBox3
  47.      Range("C" & L).Value = TextBox1
  48.      Range("D" & L).Value = TextBox2
  49.      Range("E" & L).Value = TextBox3
  50.      Range("F" & L).Value = TextBox4
  51.      Range("G" & L).Value = TextBox5
  52.      Range("H" & L).Value = TextBox6
  53.      Range("I" & L).Value = TextBox7
  54.      Range("J" & L).Value = TextBox8
  55.      Range("K" & L).Value = TextBox9
  56. End If
  57. End Sub
  58. 'Pour le bouton Modifier
  59. Private Sub CommandButton3_Click()
  60. Dim Ligne As Long
  61. Dim I As Integer
  62.    If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification" ) = vbYes Then
  63.      If Me.ComboBox1.ListIndex = -1 Then Exit Sub
  64.          Ligne = Me.ComboBox1.ListIndex + 3
  65.          Ws.Cells(Ligne, "C" ) = ComboBox3
  66.      For I = 1 To 9
  67.          If Me.Controls("TextBox" & I).Visible = True Then
  68.             Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
  69.          End If
  70.      Next I
  71.    End If
  72. End Sub
  73. 'Pour le bouton Quitter
  74. Private Sub CommandButton2_Click()
  75.    Unload Me
  76. End Sub



Remarques et problèmes
:  
 
- Lorsque je fais f5, je n'ai aucun résultat...je n'arrive pas à lier mon formulaire à ma feuille excel.
- Aussi, j'aimerais bien avoir ma liste déroulante de recherche fonctionnelle (j'avais réussi tout au début jusqu'à ce que je complexifie mon formulaire).
- J'aimerai aussi mais je crois que c'est impossible ou trop compliqué, que les nouvelles entrées soient classées directement par ordre alpha (mais apparemment il est plus logique de demander ensuite à excel de trier les données)
- Une même personne peut apparaître plusieurs fois car selon son statut de vacataire ou titulaire, on lui ouvre plusieurs dossiers donc plusieurs localisations
- Parfois il y a des homonymes, donc le classement alpha se fait par le prénom
- L'utilisation d'un optionbutton pour la civilité aurait été plus adéquate mais je crois que c'est pas si évident
 
alors si une ou plusieurs bonnes âmes y voient claires, merci de m'aider  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:


Message édité par verballes le 03-06-2019 à 16:22:48

---------------
Papa (softcore gamer en dormance, I'll be back, stronger) : https://www.youtube.com/user/verballes
Reply

Marsh Posté le 03-06-2019 à 16:09:11   

Reply

Marsh Posté le 03-06-2019 à 18:10:59    

Bonjour,
 
Pour lier le formulaire, as-tu essayé d'utiliser la close "With" afin de définir quel objet tu essayes de modifier ?

Code :
  1. With myWb.mySheet
  2. ...
  3. End with


 
Pour le deuxième point, je n'ai aucune idée de ce qu'est une liste déroulante de recherche fonctionnelle.
 
Pour le troisième point, cela dépend de la taille de ton fichier, tu peux toujours te faire une fonction qui recherche la bonne position à laquelle il faut insérer une ligne mais si le fichier est gros ça risque de mouliner.
 
Pour le quatrième point, quelle est l'attente ?
 
Pour le cinquième point, Excel propose le tri sur plusieurs niveaux, à voir si tu utilises la fonction de tri Excel ou si tu tries par une fonction perso l'insertion de données.
 
Pour le dernier point, j'avoue ne pas avoir fait de formulaire depuis bien longtemps mais ce ne doit pas être difficile d'ajouter une liste déroulante ou des boutons radio pour la civilité.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 04-06-2019 à 08:27:06    

1-

Citation :

Pour lier le formulaire, as-tu essayé d'utiliser la close "With" afin de définir quel objet tu essayes de modifier ?


j'utilise

Code :
  1. Set Ws = Sheets("BIATSS" )


BIATSS étant le nom de l'onglet que j'utilise
 
2 -

Citation :

Pour le deuxième point, je n'ai aucune idée de ce qu'est une liste déroulante de recherche fonctionnelle.


Je me suis mal exprimé, je pensais fonctionnel dans le sens "qui fonctionne", j'avais suivi un premier tuto avec une liste déroulante de recherche par nom qui fonctionnait, mais le userform ne prenait pas en compte toutes les spécificités de mon tableau. J'ai voulu essayé un autre tuto et la il ne prend plus rien en compte lol  :sweat:  
 
3 -

Citation :

Pour le troisième point, cela dépend de la taille de ton fichier, tu peux toujours te faire une fonction qui recherche la bonne position à laquelle il faut insérer une ligne mais si le fichier est gros ça risque de mouliner.


Bah j'ai 10516 lignes pour le moment  :o  
 
4 -

Citation :

Pour le quatrième point, quelle est l'attente ?


En fait y'a pas vraiment d'attente, juste que j'avais vu dans certains cas qu'il existait des codes pour éviter les doublons...ouais bon ce 4eme point n'a pas lieu d'être en effet.
 
5 -

Citation :

Pour le cinquième point, Excel propose le tri sur plusieurs niveaux, à voir si tu utilises la fonction de tri Excel ou si tu tries par une fonction perso l'insertion de données.


Va falloir que je me penche là-dessus, excel est complet mais je pense que tout faire à partir du formulaire n'est pas si évident finalement.
 
6 -

Citation :

Pour le dernier point, j'avoue ne pas avoir fait de formulaire depuis bien longtemps mais ce ne doit pas être difficile d'ajouter une liste déroulante ou des boutons radio pour la civilité.


Pour le moment je vais garder le système de liste déroulante, et si je maitrise un peu plus je modifierais le code.
 
En fait je suis assez frustré car j'avais suivi un cours assez complet sur openclassroom sur la gestion de bdd en avec MySQL, c'était assez compliqué mais les possibilités étaient multiples !!!! J'avais l'impression qu'on pouvait tout faire ! Là je rame et ça m'agace ! :fou:  
 
En tout cas merci d'avoir pris le temps de répondre à mon post  :D


Message édité par verballes le 04-06-2019 à 08:27:48

---------------
Papa (softcore gamer en dormance, I'll be back, stronger) : https://www.youtube.com/user/verballes
Reply

Marsh Posté le 04-06-2019 à 09:27:28    

Ben Excel ce n'est pas une bdd, rien à voir avec MySQL.
 
Pour revenir au premier point, tu ne fais jamais référence à ta feuille dans le code suivant :

Code :
  1. Dim L As Integer
  2. If MsgBox("Confirmez-vous cette nouvelle entrée ?", vbYesNo, "Demande de confirmation d'ajout" ) = vbYes Then
  3.      L = Sheets("BIATSS" ).Range("a65536" ).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
  4.      Range("A" & L).Value = ComboBox1
  5.      Range("B" & L).Value = ComboBox2
  6.      Range("C" & L).Value = ComboBox3
  7.      Range("C" & L).Value = TextBox1
  8.      Range("D" & L).Value = TextBox2
  9.      Range("E" & L).Value = TextBox3
  10.      Range("F" & L).Value = TextBox4
  11.      Range("G" & L).Value = TextBox5
  12.      Range("H" & L).Value = TextBox6
  13.      Range("I" & L).Value = TextBox7
  14.      Range("J" & L).Value = TextBox8
  15.      Range("K" & L).Value = TextBox9
  16. End If
  17. End Sub


La seule chose que tu fais c'est déterminer une variable de type Integer en faisant référence à ta feuille. Définir une variable ne suffit pas pour faire référence à un objet, il faut indiquer que tu veux faire référence à cet objet.
Essaye :

Code :
  1. Dim L As Integer
  2. If MsgBox("Confirmez-vous cette nouvelle entrée ?", vbYesNo, "Demande de confirmation d'ajout" ) = vbYes Then
  3.      With ws
  4.        L = .Range("a65536" ).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
  5.        .Range("A" & L).Value = ComboBox1
  6.        .Range("B" & L).Value = ComboBox2
  7.        .Range("C" & L).Value = ComboBox3
  8.        .Range("C" & L).Value = TextBox1
  9.        .Range("D" & L).Value = TextBox2
  10.        .Range("E" & L).Value = TextBox3
  11.        .Range("F" & L).Value = TextBox4
  12.        .Range("G" & L).Value = TextBox5
  13.        .Range("H" & L).Value = TextBox6
  14.        .Range("I" & L).Value = TextBox7
  15.        .Range("J" & L).Value = TextBox8
  16.        .Range("K" & L).Value = TextBox9
  17.      End With
  18. End If
  19. End Sub


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 07-06-2019 à 09:06:05    

Finalement j'ai changé mon fusil d'épaule en faisant plus simple.
 
Via un tuto sur youtube, j'ai créé dans un de mes onglets un formulaire sans passer directement par vba ni par le code, j'utilise aussi quelques listes dans un onglet spécifique.
https://image.noelshack.com/fichiers/2019/23/5/1559890016-formulaire.jpg  
 
J'ai créé ensuite une macro en enregistrant la manipulation pour une entrée puis j'ai inséré un bouton "nouvelle entrée" qui me permet de lancer la macro après chaque saisie.
Ensuite, dans mon onglet de données, toutes mes nouvelles entrées se placent en haut du tableau à partir de la ligne 2. Alors là j'ai enregistré également une macro avec un bouton en mettant en place un système de tri, d'abord par la colonne "nom" puis quand il y'a des homonymes, par la colonne "prénom".
 
Aussi, j'ai ajouté quand même un peu de code dans mon formulaire pour qu'il me mettre en majuscule auto dans certaines cellules lorsque je saisie. :p


Message édité par verballes le 07-06-2019 à 09:34:58

---------------
Papa (softcore gamer en dormance, I'll be back, stronger) : https://www.youtube.com/user/verballes
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed