Publicité
Offres partenaires
Actualités relatives

Nouvel objectif macro à réduction de vibrations Nikon

Publié le 23 février 2006

Nikon vient d’annoncer par la voie d’un communiqué de presse la mise sur le marché d’un objectif macro qui a la particularité de disposer d’un système de réduction des vibrations (VR II). L&rsqu Lire la suite

Reclusa : le clavier pour joueurs de Microsoft arrive en France

Publié le 15 mai 2007

Le clavier pour joueurs de Microsoft présenté en début d’année (cf. Reclusa, le clavier pour joueurs de Microsoft) commence à faire son apparition en France. Ce clavier coproduit avec Razer possède 6 touches macro (les macros sont enregistrées dans le c Lire la suite

Bestofmicro : le HTC Touch peut-il concurrencer l'iPhone ?

Publié le 13 août 2007

Présenté comme l’un des principaux concurrents de l’iPhone, le HTC Touch est un PDAPhone fonctionnant sous Windows Mobile 6 et disposant d’un interface tactile particulière permettant d’accéder facilement à l’ensemble de ses fonctionnalités : télépho ... Lire la suite

Le Xacti S70 arrive chez Sanyo

Publié le 23 avril 2007

Sanyo lance un nouvel appareil photo 7 Mpixels, le Xacti VPC-S70. Cet appareil de type point-and-shoot offre un zoom optique 3x, un écran LCD de 2,5" (115 000 pixels) et une sensibilité maximale de 800 ISO. Il possède un mode macro à 5 cm, son mode vidéo Lire la suite

Les derniers tests

Le test des MacBook et MacBook Pro

Publié le 31 octobre 2008

Test des nouveaux MacBook alu et leur version Pro. Les performances sont elle à la hauteur de leur design ? Lire la suite

Comparatif : disques durs externes 1 To

Publié le 30 octobre 2008

Tous les disques durs externes que nous testons aujourd’hui ont une capacité d’un téraoctet, mais les offres, leurs performances et leur consommation diffèrent considérablement. Un produit se démarque clairement de la concurrence. Lire la suite

TNT HD : infos utiles

Publié le 30 octobre 2008

La TNT HD arrive enfin en France. Quelles chaines sont disponibles ? Quelle qualité faut-il attendre ? La TNT HD est-elle vraiment la révolution annoncée ? Lire la suite

Les téléphones tactiles peuvent-ils remplacer les PC ?

Publié le 24 octobre 2008

Les téléphones tactiles sont-ils capables de rivaliser avec les PC ? Lire la suite

  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » C'est une Macro VBA Particulière c'est vrai...
 

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

Il y a 207 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici



Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : C'est une Macro VBA Particulière c'est vrai...
 
Plus d'informations

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 :

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


Message édité par Callou le 09-08-2007 Ã  18:13:43
Liens sponsorisés

Profil : Pointeur
Plus d'informations

Balise [code] :o


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
zeb
Profil : Modérateur libre

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 ?


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

a écrit :

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+


Message édité par Callou le 06-08-2007 Ã  12:50:47
zeb
Profil : Modérateur libre

Bon alors je reprends ton code en moins 1980 :

Code :
  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. Private Sub Vider()
  12.     UserForm2.Désignation.Value    = ""
  13.     UserForm2.Entrée.Value        = ""
  14.     UserForm2.Puht.Value          = ""
  15.     UserForm2.Pvte.Value          = ""
  16.     UserForm2.Dlc.Value            = ""   
  17.     UserForm2.TextBox_Stock.Value  = ""
  18.     UserForm2.TextBox_Etat.Value  = ""
  19.     UserForm2.TextBox_Sortie.Value = ""
  20. End Sub
  21. Private Sub Button_Rechercher_Click()
  22.     Dim x As Long
  23.     Dim Found As Boolean
  24.     Dim Reponse As Integer
  25.    
  26.     Found = False
  27.     If UserForm2.Désignation.Text = "" Then
  28.         MsgBox "Vous devez saisir une Recherche", vbCritical
  29.         Exit Sub ' // Sortir ici, c'est pas con, non ?
  30.     End If
  31.     ' ActiveSheet.Activate  // N'importe quoi ! Activer un truc actif
  32.                             // Pourquoi pas ouvrir une porte ouverte.
  33.     For x = 4 To Range("A65535" ).End(xlUp).Row
  34.         If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.Désignation.Value) & "*" Then
  35.             Found = True
  36.             Remplir ActiveSheet, x
  37.             Exit For
  38.         End If
  39.     Next x
  40.    
  41.     If Not Found Then
  42.    
  43.         Reponse = MsgBox ("Requête non trouvée !", vbRetryCancel + vbExclamation)
  44.         If Reponse = vbRetry Then
  45.             Vider
  46.             Désignation.SetFocus
  47.         End If
  48.     End If
  49. 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 ?".


Message édité par zeb le 07-08-2007 Ã  01:02:48

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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+


Message édité par Callou le 06-08-2007 Ã  16:15:28
zeb
Profil : Modérateur libre

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 !
http://ladytango.hautetfort.com/images/medium_maillon_faible.jpg

 

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 ?


Message édité par zeb le 06-08-2007 Ã  18:48:44

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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é :(


Code :
  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


Message édité par Callou le 06-08-2007 Ã  19:40:51
zeb
Profil : Modérateur libre

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 :

Code :
  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.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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


Message édité par Callou le 07-08-2007 Ã  01:53:07
Plus d'informations

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".

Code :
  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 :

Code :
  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 ...


Message édité par Callou le 08-08-2007 Ã  14:13:39
zeb
Profil : Modérateur libre

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


Message édité par zeb le 08-08-2007 Ã  14:34:05

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Salut Zeb :)

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