Se connecter avec
S'enregistrer | Connectez-vous
Votre question

C'est une Macro VBA Particulière c'est vrai...

Dernière réponse : dans Programmation
Partagez
6 Août 2007 00:17:20

Salut Forum,

J'utilise un UserForm avec plusieurs TextBox pour renseigner un tableau Excel.
En Bidouillant un peu dans mon code VBa, j'ai reussi à récupérer la valeur des cellules du tableau qui m'interresent dans mes TextBox. Le Hic c'est que je ne peux pas boucler sur la recherche alors si quelqu'un a une idée ...

A +

Voici le Code :

  1. Private Sub Button_Rechercher_Click()
  2.  
  3. If UserForm2.Désignation.Text = "" Then
  4. MsgBox "Vous devez saisir une Recherche", vbCritical
  5. End If
  6.  
  7. Dim x As Long
  8.  
  9. ActiveSheet.Activate
  10.  
  11. For x = 4 To Range("A65535").End(xlUp).Row
  12. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.Désignation.Value) & "*" Then
  13.  
  14. GoTo Trouve
  15.  
  16. Exit For
  17.  
  18. End If
  19.  
  20. Next x
  21.  
  22.  
  23. GoTo Erreur
  24.  
  25. Exit Sub
  26.  
  27. Trouve: LigneActive = x
  28.  
  29. UserForm2.Désignation.Value = ActiveSheet.Cells(LigneActive, "A").Value
  30. UserForm2.Entrée.Value = ActiveSheet.Cells(LigneActive, "D").Value
  31. UserForm2.Puht.Value = ActiveSheet.Cells(LigneActive, "E").Value
  32. UserForm2.Pvte.Value = ActiveSheet.Cells(LigneActive, "G").Value
  33. UserForm2.Dlc.Value = ActiveSheet.Cells(LigneActive, "J").Value
  34. UserForm2.TextBox_Stock.Value = ActiveSheet.Cells(LigneActive, "F").Value
  35. UserForm2.TextBox_Etat.Value = ActiveSheet.Cells(LigneActive, "I").Value
  36. UserForm2.TextBox_Sortie.Value = ActiveSheet.Cells(LigneActive, "H").Value
  37.  
  38. Exit Sub
  39.  
  40.  
  41.  
  42. Erreur: MsgBox ("Requête non trouvée !"), vbRetryCancel + vbExclamation
  43.  
  44.  
  45. If Response = Retry Then
  46.  
  47. Désignation.Text = ""
  48. Entrée.Text = ""
  49. Puht.Text = ""
  50. Pvte.Text = ""
  51. Dlc.Text = ""
  52. TextBox_Stock = ""
  53. TextBox_Etat = ""
  54. TextBox_Sortie = ""
  55.  
  56. Désignation.SetFocus
  57.  
  58.  
  59. End If
  60.  
  61. End Sub

Autres pages sur : macro vba particuliere vrai

6 Août 2007 00:31:14

Balise [code] :o 
a b L Programmation
6 Août 2007 11:28:44

Ligne 9: ActiveSheet.Activate
Celle-là, on ne me l'avait encore jamais faite ! lol

--------------------------

Beurk des GoTo !
Tu programmes comme en l'an 1980 !

--------------------------

Bon, je veux bien t'aider, mais à toi de commencer :
Où sont tes TextBox ?
Contenus similaires
6 Août 2007 12:45:31

Citation :
Ligne 9: ActiveSheet.Activate
Celle-là, on ne me l'avait encore jamais faite ! lol

--------------------------

Beurk des GoTo !
Tu programmes comme en l'an 1980 !

--------------------------

Bon, je veux bien t'aider, mais à toi de commencer :
Où sont tes TextBox ?



Bonjour Zeb,

Le Prog est pas beau c'est vrai ... mais je débute en VBA depuis environ 1 mois. Pour les années 80 c'est vrai j'ai quelques notions de Basic assez lointaines Nostalgie :lol: 

Concernant mon Pb je vais essayé d'être un peu plus clair

Départ sur un UserForm (Userform2)
Et les TextBox :

Désignation (A)
Entrée (D)
Puht (E)
Pvte (G)
Dlc.Value (J)
TextBox_Stock (F)
TextBox_Etat (I)
TextBox_Sortie (H)

A coté des noms TextBox entre () colonnes du tableau Excel concernant les valeurs pour Info

Donc en fait je saisis le mot recherché dans le TextBox "Désignation" puis Click sur le "Bouton Rechercher"
Private Sub Button_Rechercher_Click()

Là, je récupére bien dans les TextBox de l'Userform2 le nom cherché (D'accord ... il déjà tapé ;)  ) et ainsi que les valeurs de la ligne correspondante (Puht, Pvte, Dlc etc...)

Mais le hic c'est que j'aurai voulu poursuivre la recherche dans le tableau Excel sur les mots analogues et de surcroît récupérer une fois de plus les valeurs de la ligne de cette proposition dans mes TextBox...

[#0000ff]Exemple première recherche
:Je tapeCitron
Résultat en TextBox : Citron (Ok c'est déjà tapé en désignation) mais récup. des valeurs Puht, Pvte, Dlc ...

Ensuite je place un Msgbox ("Voulez-vous poursuivre ?"), vbYesNo

et donc je repars du premier mot trouvé au suivant...

Exemple deuxième recherche sur réponse "Yes":

on me propose :

Résultat en TextBox :Tarte Citron + les nouvelles valeurs Puht, Pvte, Dlc ... (Tjrs en textBox)

Et ainsi de suite jusquà revenir à la "première proposition" si il n'y a plus de mot identique.

C'est simple à expliquer, mais je n'ai pas assez de connaissance en VBa :) 

En fait c'est Ctrl+F à ceci-près c'est que les valeurs se placent dans des TextBox...

A te lire

A+
a b L Programmation
6 Août 2007 14:49:32

Bon alors je reprends ton code en moins 1980 :
  1. Private Sub Remplir(sh As WorkSheet, ligne As Long)
  2. UserForm2.Désignation.Value = sh.Cells(ligne, "A" ).Value
  3. UserForm2.Entrée.Value = sh.Cells(ligne, "D" ).Value
  4. UserForm2.Puht.Value = sh.Cells(ligne, "E" ).Value
  5. UserForm2.Pvte.Value = sh.Cells(ligne, "G" ).Value
  6. UserForm2.Dlc.Value = sh.Cells(ligne, "J" ).Value
  7. UserForm2.TextBox_Stock.Value = sh.Cells(ligne, "F" ).Value
  8. UserForm2.TextBox_Etat.Value = sh.Cells(ligne, "I" ).Value
  9. UserForm2.TextBox_Sortie.Value = sh.Cells(ligne, "H" ).Value
  10. End Sub
  11.  
  12. Private Sub Vider()
  13. UserForm2.Désignation.Value = ""
  14. UserForm2.Entrée.Value = ""
  15. UserForm2.Puht.Value = ""
  16. UserForm2.Pvte.Value = ""
  17. UserForm2.Dlc.Value = ""
  18. UserForm2.TextBox_Stock.Value = ""
  19. UserForm2.TextBox_Etat.Value = ""
  20. UserForm2.TextBox_Sortie.Value = ""
  21. End Sub
  22.  
  23. Private Sub Button_Rechercher_Click()
  24. Dim x As Long
  25. Dim Found As Boolean
  26. Dim Reponse As Integer
  27.  
  28. Found = False
  29.  
  30. If UserForm2.Désignation.Text = "" Then
  31. MsgBox "Vous devez saisir une Recherche", vbCritical
  32. Exit Sub ' // Sortir ici, c'est pas con, non ?
  33. End If
  34.  
  35. ' ActiveSheet.Activate // N'importe quoi ! Activer un truc actif
  36. // Pourquoi pas ouvrir une porte ouverte.
  37.  
  38. For x = 4 To Range("A65535").End(xlUp).Row
  39. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.Désignation.Value) & "*" Then
  40. Found = True
  41. Remplir ActiveSheet, x
  42. Exit For
  43. End If
  44. Next x
  45.  
  46. If Not Found Then
  47.  
  48. Reponse = MsgBox ("Requête non trouvée !", vbRetryCancel + vbExclamation)
  49. If Reponse = vbRetry Then
  50. Vider
  51. Désignation.SetFocus
  52. End If
  53. End If
  54. End Sub


Ligne 32 : Qu'en penses-tu ?
Partout ailleurs : Pas de GoTo ! C'est beaucoup beaucoup mieux. On voit bien les choses !
Et surtout, on voit que pour continuer, il suffit de virer le Exit For de la ligne 42. Ou de le remplacer par un judicieux "On continue ?".
6 Août 2007 16:14:10

Merci Zeb,

C'est un cours Magistral... C'est vrai C+ clair ...
J'ai remplacer X As Long par X As Integer (Pb sur la Réf)
Ligne 42 Ok
Mais comment poursuivre depuis la nouvelle valeur de X à la suivante ?

Msge n°34471:

Mais le hic c'est que j'aurai voulu poursuivre la recherche dans le tableau Excel sur les mots analogues et de surcroît récupérer une fois de plus les valeurs de la ligne de cette proposition dans mes TextBox...

Exemple première recherche :Je tape Citron
Résultat en TextBox : Citron (Ok c'est déjà tapé en désignation) mais récup. des valeurs Puht, Pvte, Dlc ...

Ensuite je place un Msgbox ("Voulez-vous poursuivre ?" ), vbYesNo

et donc je repars du premier mot trouvé au suivant...

A+
a b L Programmation
6 Août 2007 18:48:23

Non, x est bien un Long. Puisqu'il peut a priori aller jusqu'à 65536.
C'est donc ma fonction Remplir qu'il faut modifier. Ah bah c'est fait :whistle: 

Pour le reste : REFLECHISSEZ !


C'est la boucle For qui va t'emmener au suivant !
As-tu essayé de virer le Exit For de la ligne 42, juste pour voir ?
6 Août 2007 19:29:48

Re Zeb,

Pour le reste : REFLECHISSEZ !
A la vue de ma première Procèdure car on peut pas parler de Code
t'es plus fort que moi :lol: 

Le Integer à l'air de bien fonctionner ? y'a pas de Bug

C'est la boucle For qui va t'emmener au suivant !
As-tu essayé de virer le Exit For de la ligne 42, juste pour voir ?


Remplacé par MsgBox comme convenu mais après ... ma connaissance dans les fonctions reste limité :( 


  1. For x = 4 To Range("A65535").End(xlUp).Row
  2. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.Désignation.Value) & "*" Then
  3. Found = True
  4. Remplir ActiveSheet, x
  5. MsgBox "Poursuivre la recherche ?", vbYesNo
  6. If vbYes Then
  7. // ' Là faut Voir ??? car comment indiquer l'adresse de la celulle trouvèe et poursuivre ??
  8. End If
  9. End If
  10. Next x
a b L Programmation
7 Août 2007 01:06:57

NON le integer ne fonctionne pas.
Lis l'aide d'Excel, tu verras qu'un integer s'arrête à 32767, donc bien en deça des 65536 lignes d'une feuille Excel. Tu n'as pas 32767 lignes de données. Qu'est-ce que j'en ai à faire : Par principe, les lignes c'est Long.

Pas mal, l'idée du YesNo. Regarde comment lignes 48 et 49 du code précédent je mets le résultat dans une variable et je compare ce résultat à quelque chose de connu.

Pourquoi veux-tu que l'adresse de la cellule ne soit pas connue ? L'adresse de la cellule, c'est "A" & x. Comme x varie avec la boucle For, on poursuit.

Je crois que tu n'as rien compris à ton propre code. Essaye ça :
  1. For x = 4 To Range("A65535" ).End(xlUp).Row
  2. MsgBox "Je suis la cellule A" & x"
  3. Next


Tiens, un truc. Et si au lieu de se dire, "Si la réponse est Yes, alors on continue", on écrivait "Si la réponse n'est pas Yes, alors on s'arrête".

"On s'arrête" ça tu sais le faire.
7 Août 2007 01:51:54

RE:
Je crois que tu n'as rien compris à ton propre code. Essaye ça :

C'est vrai j'ai pas toutes "les articulations" du Code VBA en général
mais L'adresse de la cellule, "c'est "A" & x" j'ai bien compris...

mais au vu du Msbox "A & x" je m'aperçois qu'il y a bien un passage sur chaque ligne sans tenir compte de "la valeur" de la la première recherche.

A+ et merci
8 Août 2007 14:00:36

Récupérer la valeur recherché ici "X" et la récupérer en même temps que les autre valeurs de la ligne dans lesTextBox de l'Userform. Mais je n'arrive pas à repartir en recherche sur la nouvelle Occurence.

Normal me direz-vous en regardant le fichier car la saisie "demande" et le "résultat" se font dans le même TextBox donc redondance. Désignation.TextBox

Il faut donc une valeur de comparaision donc une autre TextBox de "Saisie".
  1. For x = 4 To Range("A65535" ).End(xlUp).Row
  2. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.//"ici unTextBox de première Occurence".Value) & "*" Then


Et non pas :

  1. For x = 4 To Range("A65535" ).End(xlUp).Row
  2. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.//Désignation.Value) & "*" Then


Voir + haut les Conditions "Remplir" du Code complet

Et ça fonctionne mieux ...
a b L Programmation
8 Août 2007 14:33:39

Bon, moi je ne comprends bien que le code, et je n'avais donc pas bien compris tes explications. Avec ta soluce sous les yeux, je comprends enfin ce que tu voulais dire. Tu as trouvé tout seul, j'en suis ravi. Si en plus, j'ai pu t'aider ... :D 
8 Août 2007 16:43:05

Salut Zeb :) 

Non seulement tu m'a aidé mais en plus ton code est "Propre". :jap: 

En faisant ma première tentative sur le code du début (le miens) j'avais eu un doute ... mais n'avais pas essayé tout de suite de changer de TextBox de Saisie. Mais en regardant ton code bien structuré le doute était confirmé.

Mais je me demande si il existe pas une solution pour "Capter" la valeur "x" première en "tampon" et de récupérer ainsi la seconde occurence, afin de n'utiliser qu'une seule et même TextBox :??: 

Si il existe une solution ... :hello: 

A+
9 Août 2007 18:17:24

Voir aussi Discussion concernat le Sujet:
http://www.presence-pc.com/forum/ppc/Programmation/fonc...


Parallèlement à celà un autre souci survient sur une autre partie du

  1. Private Sub Button_Suivant_Click()
  2. Dim x As Long
  3. Dim Found As Boolean
  4. Dim Reponse As Integer
  5.  
  6. Button_Rechercher.Visible = False
  7. Button_Suivant.Visible = True
  8.  
  9.  
  10. Found = False
  11.  
  12.  
  13. For x = 4 To Range("A65535" ).End(xlUp).Row
  14. If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then
  15. Found = True
  16. Remplir ActiveSheet, x
  17. // Ici initialement j'avais un MsgBox vbYesNo pour suivre les Occurences, d'après le contenu TextBox_Nom_Frn - Comment obtenir le suivi des Occurences à partir d'un nouveau Click sur le Button_Suivant ?
  18. End If
  19.  
  20. Next x
  21.  
  22. If Not Found Then
  23.  
  24. Reponse: MsgBox ("Requête non trouvée !" ), vbRetryCancel + vbExclamation
  25. If Reponse = Retry Then
  26. Vider
  27. TextBox_Nom_Frn.SetFocus
  28. End If
  29. End If
  30. End Sub


Merci d'avance