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 If

Bonjour 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 Sub

Bonjour 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)
Next

je 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).Select

il 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
Rechercher des sujets similaires à "resoudre beug"