Résoudre un beug
bonjour,
Je débute dans la programmation VBA.J'ai déjà bien avancé sur mon projet pour l'ajout , la recherche et la modification de personnes dans la base de données.Seulement voilà...je coince sur une partie..Lorsque l'utilisateur fait une recherche d'un nom et prénom dans la inputbox. il faut savoir si la personne existe ou pas..jusque là tout va bien.Toute cette partie se fait dans l'initialisation du userform.si la personne n'existe pas, un msgbox apparait avec vbyes ou vbno.En fonction de la réponse, une autre application doit s'effectuer et j'aimerais que du coup cela mette fin à l'ouverture du userform.Seulement actuellement, quand je clique sur yes mon autre procédure s'execute bien mais le formulaire apparait quand meme. ..et quand je clique sur no( pour stopper le programme et activer la page d'acceuil) celà beug...et là je ne vois pas pourquoi??
Alors si vous pouvez m'apporter votre aide pour empecher l'ouverture du formulaire si la personne n'existe pas...votre aide sera la bienvenue
Bonjour,
Essayez d'ajouter ce qui est surligné
If rep = vbYes Then
frmenregistrement.Show
End If
If rep = vbNo Then
Unload frmrecherche
Sheets("accueil").Activate
End IfBonjour robjam,
C'est une etape que j'ai déja essayé pour les deux cas de réponse...mais cela ne fonctionne pas...pour le vbYes, il m'affiche bien mon formulaire d'enregistrement mais quand je le ferme cest mon formulaire de recherche qui s'affiche qd meme...et pour le vbNo, il m'affiche un rapport de beug....."l'indice n'appartient pas à la selection.."
Bonjour à tous
Un essai à tester. Il ne concerne que le bouton "Modification fiche adhérants"
Bye !
Bonjour gmb,
je viens de tester ta modification et celà fonctionne!!
Par contre....j'ai vu que sur les inputbox, tu as fait un test de valeur nul et que ça affiche la page "accueuil"..sauf que celà ne fonctionne pas..
pourrais tu m'apporter quelques infos sur les modifications..:
If i = Range("A" & Rows.Count).End(xlUp).Row + 1 Then => quel est l'intérêt de cette ligne?
rep = MsgBox("Cette personne n'est pas enregistré dans votre centre." & Chr(10) & "Voulez vous procéder à son inscription?", vbYesNo + vbCritical, "INFORMATION")
If rep = "6" Then
frmenregistrement.txtNom = Nom
frmenregistrement.TxtPrénom = prenom
Call dimensionformulaire
frmenregistrement.Show
End If
If rep = "7" Then
Sheets("Accueil").Activate
End => est ceci qui evite d'afficher le formulaire "recherche"
End If
End => A quoi sert-il?
End If
Cells(i, 4).Select
txtNom.Value = ActiveCell.Value
TxtPrénom.Value = ActiveCell.Offset(0, 1)
txtadherant = ActiveCell.Offset(0, -3)
txtdateajout = ActiveCell.Offset(0, -2)
cbostatut = ActiveCell.Offset(0, 2)
txtnaissance = ActiveCell.Offset(0, 4)
TxtAdresse = ActiveCell.Offset(0, 8)
TxtCP = ActiveCell.Offset(0, 9)
TxtVille = ActiveCell.Offset(0, 10)
cboquartier = ActiveCell.Offset(0, 7)
cbosituation = ActiveCell.Offset(0, 6)
Txtquotient = ActiveCell.Offset(0, 3)
Txtmail = ActiveCell.Offset(0, 11):
Txtfixe = ActiveCell.Offset(0, 13)
Txtmobile = ActiveCell.Offset(0, 14)
cboecole = ActiveCell.Offset(0, 19)
'End If
If LCase(Cells(i, 4)) <> LCase(Nom) And LCase(Cells(i, 5)) <> LCase(prenom) Then
Call dimensionformulaire => logiquement c'est ici que la boite de dialogue doit apparaitre???
End If
[code][/code]
Je te remercie pour le temps que tu prendras à me répondre....
par contre...le bouton "retour acceuil" ne veut plus fonctionner non plus...?
et qd on lance le formulaire d'enregistrement... l'incrémention automatique du numéro d'adhérant et la date d'ajout automatique ne s'affiche plus non plus...pourtant tu n'as apporté aucune modification la dessus....?
Excuse moi par avance de toutes ces interrogations...
bonzai49 a écrit :Par contre....j'ai vu que sur les inputbox, tu as fait un test de valeur nul et que ça affiche la page "accueuil"..sauf que celà ne fonctionne pas..
C’est curieux… Avant de te retourner le fichier modifié, j’ai pourtant vérifié. Et je viens de le refaire : ça m’a l’air de marcher.
En fait, c’est vrai que j’ai dû faire des modifications : l’orthographe du nom de la page doit être rigoureusement identique dans la macro et sur le nom de l’onglet. De plus, il ne s’agit pas de ‘’ "accueuil" mais de ‘’Accueil’
If i = Range("A" & Rows.Count).End(xlUp).Row + 1 Then => quel est l'intérêt de cette ligne?
La boucle for i = 1 to ….next i qui précède fait varier i de 1 au nombre de lignes non vides du tableau de la feuille « source ».
Et si la macro en bouclant trouve une ligne qui remplit les conditions, la macro sort de la boucle grace à l’instruction ‘’Exit for’’. Dans ce cas, i sera au maximum égal au numéro de la dernière ligne.
En revanche, si aucune ligne examinée ne remplit les conditions, i prend la valeur du numéro de la denière ligne du tableau incrémenté de 1.
Et donc, si i a la valeur de la première ligne vide du tableau, c’est qu’il n’y a pas, dans le tableau, de nom + prénom tels que demandés. D’où les instructions qui suivent jusqu’au ‘’End If’’ suivant.
Les instructions qui suivent n’ont à mon avis, aucune utilité et ne seront pas lues par la macro. Elles mettent dans les TextBox des valeurs définies à partir de la cellule active. Or, la feuille active est la feuille ‘’Accueil’’ et aucune cellule de cette feuille ne peut jouer ce role..
J’ai laissé ces instructions d’origine car elles ne sont pas de moi mais je me suis assuré qu’elles ne seraient jamais exécutées.
par contre...le bouton "retour acceuil" ne veut plus fonctionner non plus...?Voir plus haut : le nom de la feuille a changé : ce n’est plus ‘’acceuil » mais ‘’Accueil’’
OK ?
Bye !
C’est curieux… Avant de te retourner le fichier modifié, j’ai pourtant vérifié. Et je viens de le refaire : ça m’a l’air de marcher.
En fait, c’est vrai que j’ai dû faire des modifications : l’orthographe du nom de la page doit être rigoureusement identique dans la macro et sur le nom de l’onglet. De plus, il ne s’agit pas de ‘’ "accueuil" mais de ‘’Accueil’
Je viens de regarder et effectivement, c'est l'orthographe du nom de la feuille qui ne correspondait pas. ceci est donc résolu
Les instructions qui suivent n’ont à mon avis, aucune utilité et ne seront pas lues par la macro. Elles mettent dans les TextBox des valeurs définies à partir de la cellule active. Or, la feuille active est la feuille ‘’Accueil’’ et aucune cellule de cette feuille ne peut jouer ce role..
J’ai laissé ces instructions d’origine car elles ne sont pas de moi mais je me suis assuré qu’elles ne seraient jamais exécutées.
Concernant les instructions qui suivent, en fait s'il trouve la ligne correspondant aux Nom et Prénom alors il affiche le formulaire avec les données à l'intérieur correspondant à la ligne (ce qu'il fait à la sortie de la boucle vue que i ne correspond pas à la dernière ligne non vide du tableau.
par contre si i est la dernière ligne vide alors il affiche la msgbox et quand on décide de valider l'enregistrement de cette personne il faut que le n°d'adhérant et la date d'ajout s'affiche automatiquement.hors sur ta version, e n'est pas le cas..ce que je ne comprend pas vu que l'on fait appelle au formuler d'enregistrement et que dans l'initialisation de celui-ci l'instruction est en place.....???
mais je viens de remarquer que quand je lance juste le formulaire d'enregistrement celà n'apparait plus non plus...il ne me semble pas que tu ai fait des modifications à ce niveau..?
Mais déjà merci de m'avoir aiguiller sur la résolution du 1er problème!!
Reste plus qu'à voir maintenant pourquoi le n° et la date d'ajout ne s'effectue plus....
Bonsoir
'If LCase(Cells(i, 4)) <> LCase(Nom) And LCase(Cells(i, 5)) <> LCase(prenom) Then
On supposant que vous recherchez adam rock ,cette instruction veut dire
Si adam pol = faux
Si pol rock = faux
Si junior smith rock = vrai
Alor elle vous interroge seulement sur la tiosieme cas = les deux nom et prenoms sont déferent a la fois Et elle ne fait pas sur les deux premiers cas
Pourquoi il bugs je pense vous le donnez une instruction pour quittez avant qu il termine les taches suivantes (bug pour les userform )
Private Sub UserForm_Initialize()
ThisWorkbook.Sheets("source").Select ' pas de with
Dim i As Integer
Dim Nom As String
Dim prenom As String
Dim rep As String, c
Dim dico
Nom = InputBox("Veuillez indiquer le Nom de la personne :", "RECHERCHE", "veuillez indiquer le Nom ici")
prenom = InputBox("Veuillez indiquer le Prénom de la personne :", "RECHERCHE", "veuillez indiquer le Prénom ici")
Set dico = CreateObject("Scripting.Dictionary")
For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
dico(LCase(Cells(i, 4).Value) & LCase(Cells(i, 5).Value)) = LCase(Cells(i, 4).Value) & LCase(Cells(i, 5).Value)
Next
If dico.Exists(Nom & prenom) Then
For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
Cells(i, 4).Select
txtNom.Value = ActiveCell.Value
TxtPrénom.Value = ActiveCell.Offset(0, 1)
txtadherant = ActiveCell.Offset(0, -3)
txtdateajout = ActiveCell.Offset(0, -2)
cbostatut = ActiveCell.Offset(0, 2)
Txtnaissance = ActiveCell.Offset(0, 4)
TxtAdresse = ActiveCell.Offset(0, 8)
TxtCP = ActiveCell.Offset(0, 9)
TxtVille = ActiveCell.Offset(0, 10)
cboquartier = ActiveCell.Offset(0, 7)
cbosituation = ActiveCell.Offset(0, 6)
Txtquotient = ActiveCell.Offset(0, 3)
Txtmail = ActiveCell.Offset(0, 11)
Txtfixe = ActiveCell.Offset(0, 13)
Txtmobile = ActiveCell.Offset(0, 14)
cboecole = ActiveCell.Offset(0, 19)
Next i
Else 'If LCase(Cells(i, 4)) <> LCase(Nom) And LCase(Cells(i, 5)) <> LCase(prenom) Then
rep = MsgBox("Cette personne n'est pas enregistré dans votre centre." & Chr(10) & "Voulez vous procéder à son inscription?", vbYesNo + vbCritical, "INFORMATION")
If rep = vbYes Then
frmenregistrement.Show
Else
'Unload frmrecherche
Sheets("Acceuil").Activate
End
End If
End If
Call dimensionformulaire
End SubBonjour amir,
On supposant que vous recherchez adam rock ,cette instruction veut dire
Si adam pol = faux
Si pol rock = faux
Si junior smith rock = vrai
Alor elle vous interroge seulement sur la tiosieme cas = les deux nom et prenoms sont déferent a la fois Et elle ne fait pas sur les deux premiers cas
Je ne pense pas avoir assimilé ta remarque...car en fait la procédure va tester la valeurs des inputbox a la valeur des cellules du fichier source...donc si elles ne sont pas identiques il executeras les procédures adequates il me semble.
Set dico = CreateObject("Scripting.Dictionary")
For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
dico(LCase(Cells(i, 4).Value) & LCase(Cells(i, 5).Value)) = LCase(Cells(i, 4).Value) & LCase(Cells(i, 5).Value)
Nextje ne connaissais pas la fonction "CreateObject("Scripting.Dictionary")", il va falloir que je regarde cela de plus pret car elle me parait bien pratique!!
Par contre quel est l'intéret d'écrire la troisième ligne ci-dessus?
If dico.Exists(Nom & prenom) Then
For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
Cells(i, 4).Selectil y a t'il nécessité de répéter la boucle for ici? ne peut on pas lui dire directement que si "dico existe" alors execute les instructions qui suivent?
merci
Tu as raison, j'ai répondu trop vite, dans mon dernier message.
Mais j'ai vu que Amir (Bonjour Amir) est intéressé par le problème. Aussi, je lui passe volontiers la main...
Bye !
et bien grâce à votre aide, mon problème est enfin résolu!!!
Merci à vous gmb et amir de votre aide!! sans vous j'y serais encore
A bientot pour de nouvelles résolutions de problèmes!!!
bonsoir
gmb a écrit :Mais j'ai vu que Amir (Bonjour Amir) est intéressé par le problème. Aussi, je lui passe volontiers la main...
Bye !
salut gmb ,il faut savoir que je ne suis pas content de ce genre de cadeau :lol.:
salut bonzai49
essayez cette version
Private Sub UserForm_Initialize()
ThisWorkbook.Sheets("source").Select ' pas de with
Dim i As Integer, lgn As Integer
Dim Nom As String
Dim prenom As String
Dim rep As String, c
Dim dico As String
Nom = InputBox("Veuillez indiquer le Nom de la personne :", "RECHERCHE", "veuillez indiquer le Nom ici")
prenom = InputBox("Veuillez indiquer le Prénom de la personne :", "RECHERCHE", "veuillez indiquer le Prénom ici")
dico = "non trouvé"
For lgn = 5 To Range("A" & Rows.Count).End(xlUp).Row
If LCase(Nom & prenom) = LCase(Cells(lgn, 4).Value) & LCase(Cells(lgn, 5).Value) Then
dico = "trouvé"
i = lgn
Exit For
End If
Next
If dico = "trouvé" Then
Cells(i, 4).Select
txtNom.Value = ActiveCell.Value
TxtPrénom.Value = ActiveCell.Offset(0, 1)
txtadherant = ActiveCell.Offset(0, -3)
txtdateajout = ActiveCell.Offset(0, -2)
cbostatut = ActiveCell.Offset(0, 2)
Txtnaissance = ActiveCell.Offset(0, 4)
TxtAdresse = ActiveCell.Offset(0, 8)
TxtCP = ActiveCell.Offset(0, 9)
TxtVille = ActiveCell.Offset(0, 10)
cboquartier = ActiveCell.Offset(0, 7)
cbosituation = ActiveCell.Offset(0, 6)
Txtquotient = ActiveCell.Offset(0, 3)
Txtmail = ActiveCell.Offset(0, 11)
Txtfixe = ActiveCell.Offset(0, 13)
Txtmobile = ActiveCell.Offset(0, 14)
cboecole = ActiveCell.Offset(0, 19)
Call dimensionformulaire
Else 'If LCase(Cells(i, 4)) <> LCase(Nom) And LCase(Cells(i, 5)) <> LCase(prenom) Then
rep = MsgBox("Cette personne n'est pas enregistré dans votre centre." & Chr(10) & "Voulez vous procéder à son inscription?", vbYesNo + vbCritical, "INFORMATION")
If rep = vbYes Then
frmenregistrement.Show
Else
Sheets("Acceuil").Activate
End
End If
End If
End Sub