Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
641 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] While et Vlookup

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] While et Vlookup

n°1264795
tibot
Posté le 12-12-2005 à 18:10:24  profilanswer
 

Lu all  :hello:  
 
 
Je veux faire une recherche V en colonne 37 tant que la colonne 20 n'est pas vide.
 
 
Je décalre la variable i comme ligne, la valeur recherchée est en colonne 20, et la matrice de recherche est dans fichier2.xls (déjà ouvert) de la ligne 3 colonne 1 à la ligne621 colonne 11.
 
Je tappe ce code :
 

Code :
  1. i = 2                                       'Déclaration de la variable i = ligne
  2. While Cells(i, 20) <> ""                         'Tant que ligne i et colonne 20 n'est pas vide
  3.    
  4. Cells(i, 37) = ActiveCell.FormulaR1C1 = VLOOKUP(Cells(i, 20),fichier2.xls!R3C1:R621C11,11,FALSE)
  5.     i = i + 1
  6.    
  7. Wend


 
mais j'ai une erreur de compilation syntaxe
 
 
Une soluce ?
Merci bien

mood
Publicité
Posté le 12-12-2005 à 18:10:24  profilanswer
 

n°1265158
galopin01
Posté le 13-12-2005 à 06:34:01  profilanswer
 

bonjour,
ça devrait donner :

Code :
  1. Sub Test()
  2. i = 4
  3. With Workbooks("fichier2.xls" ).Worksheets("TaBase" )
  4. While Cells(i, 20) <> ""
  5. Cells(i, 37) = Application.WorksheetFunction.VLookup(Cells(i, 20), .Range("A3:K621" ), 11, False)
  6. i = i + 1
  7. Wend
  8. End With
  9. End Sub

Ne pas oublier de remplacer Worksheets("TaBase" ) par le nom de ta feuille source...
A+


Message édité par galopin01 le 13-12-2005 à 06:34:18

---------------
roger
n°1265360
tibot
Posté le 13-12-2005 à 11:59:49  profilanswer
 

Merci beaucoup pour cette réponse matinale fonctionnelle !!!!!
 
J'aimerais l'améliorer en disant que le range prenne toutes les cellule de"TaBase" car il se peut que des données se trouveront en dessous de la ligne 621 ..
 
On peut tres bien mettre K10000 mais je pense que ça ralentira l'execution ...

n°1265387
galopin01
Posté le 13-12-2005 à 12:25:43  profilanswer
 

Bah !
ça se discute, mais je ne pense pas énormément car la boucle se fait sur  
While Cells(i, 20) <> ""
et non pas sur VLOOKUP.
Si on se base sur le fait que le résultat de ton VLOOKUP à une valeur moyenne de 5000, à mon avis la différence de traitement ne doit pas excéder 4 secondes pour une colonne 20 de 10000 lignes également
Enfin c'est le résultat que je trouve sur 10000 test VLOOKUP aléatoires sur 10000 lignes...
A+


---------------
roger
n°1266203
tibot
Posté le 14-12-2005 à 11:40:21  profilanswer
 

exact, la différence n'est pas visible, ici le vlookup est instantané.
 
Pour que la selection du rechercherV prenne toutes les cellules, ont me dit :  
 
à al place du range .Range("A3:K621" ) de mettre .Range.SpecialCells(xlCellTypeLastCell)
 
mais j'obtiens une erreur d'exécution 450 : Nombre d'arguments incorrect ou affectation de propriété incorrecte.
 
Une idée ?

n°1266685
galopin01
Posté le 14-12-2005 à 19:16:37  profilanswer
 

En général on utilise SpécialCell pour déterminer la dernière ligne écrite dans la feuille active.
On l'utilise de cette manière :

Code :
  1. Sub test()
  2. k = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
  3. MsgBox k
  4. End Sub


appliqué à ton code ça doit donner quelque chose comme :

Code :
  1. '...
  2. With Workbooks("fichier2.xls" ).Worksheets("TaBase" )
  3. k = .Cells.SpecialCells(xlCellTypeLastCell).Row
  4. While Cells(i, 20) <> ""
  5. Cells(i, 37) = Application.WorksheetFunction.VLookup(Cells(i, 20), .Range("A3:K" & k ), 11, False)
  6. ...

Ok ?


---------------
roger
n°1267198
tibot
Posté le 15-12-2005 à 13:18:28  profilanswer
 

Ça fonctionne super merci !
 
Mais s'il y a un ligne vide quelque part avant la derniere ligne, le range s'arrête où ?
 

n°1268786
galopin01
Posté le 16-12-2005 à 22:07:58  profilanswer
 

Ben,
A la dernière ligne je pense... Quoique je n'utilise guère cette méthode effectivement un peu floue.
On utilise plutot cette méthode beaucoup plus précise pour déterminer la dernière ligne non vide d'une colonne:

Code :
  1. i = Cells(65535, 1).End(xlUp).Row

(ici la 1ère colonne)
A+


Message édité par galopin01 le 16-12-2005 à 22:08:47

---------------
roger
n°1300830
tibot
Posté le 07-02-2006 à 22:47:17  profilanswer
 

Aie, cela ne fonctionne plus,
 
j'ai integré la feuille "tabase" dans le fichier excel.
 
donc je mets :
 

Code :
  1. Sub Test()
  2. i = 4
  3. With Worksheets("TaBase" )
  4. k = .Cells.SpecialCells(xlCellTypeLastCell).Row
  5. While Cells(i, 20) <> ""
  6. Cells(i, 37) = Application.WorksheetFunction.VLookup(Cells(i, 20), .Range("A3:V" & k), 11, False)
  7. i = i + 1
  8. Wend
  9. End With
  10. End Sub


 
et j'ai une erreur 1004 à la ligne de code  6
impossible de lire la proriété VLookup de la classe WorksheetFunction
 
(je suis passé d'Excel XP à Excel 2002 )


Message édité par tibot le 07-02-2006 à 23:52:04
n°1300872
tibot
Posté le 07-02-2006 à 23:45:12  profilanswer
 

j'ai l'impression que ça ne cherche pas dans la bonne worksheet

mood
Publicité
Posté le 07-02-2006 à 23:45:12  profilanswer
 

n°1300953
galopin01
Posté le 08-02-2006 à 07:39:28  profilanswer
 

Bonjour,
Ben, tout dépend de la feuille cible et de la feuille source
La feuille "source" du Vlookup est "adressée par :
With Worksheets("TaBase" ) tous les ".Range se réfèrent à "la source"
Les autres Range (sans le "." ) se réfèrent à la FeuilleActive au moment du lancement de la macro.
Le cas échéant, il conviendrait de préciser la feuille cible.
While Worksheets("XXXX" ).Cells(i, 20)
Worksheets("XXXX" ).Cells(i, 37) = Application.WorksheetFunction.VLookup(Worksheets("XXXX" ).Cells(i, 20)....
(à vue de nez !)
Sinon, je ne vois pas...  
Une piste, pourquoi dans :  
...Range("A3:V" & k), 11, False)  
avoir mis "V" si tu te réfères toujours à la colonne "K" (11) ?
En bonne logique V = 22
A+


Message édité par galopin01 le 08-02-2006 à 07:51:33
n°1301520
tibot
Posté le 08-02-2006 à 18:43:59  profilanswer
 

bonjour et merci galopin01,
 
Le resultat de la rechercheV est dans la feuille "D1_simulact" (active au lancement de la macro = la feuille cible) colonne S (19) et valeur à chercher en colonne B (2) de la même feuille
La valeur à trouver est dans la feuille "Approv" ( source si je respecte tes notations) colonne V (22)
 
 

Code :
  1. Sub re()
  2. Dim r As Integer
  3. r = 4
  4. With Worksheets("Approv" )
  5. k = .Cells.SpecialCells(xlCellTypeLastCell).Row
  6. While Worksheets("D1_simulact" ).Cells(r, 3) <> ""
  7. Worksheets("D1_simulact" ).Cells(r, 19) = Application.WorksheetFunction.VLookup(Worksheets("D1_simulact" ).Cells(r, 2), .Range("A4:V" & k), 22, False)
  8. r = r + 1
  9. Wend
  10. End With
  11. End Sub


 
toujours la même erreur


Message édité par tibot le 08-02-2006 à 18:45:09
n°1301717
galopin01
Posté le 08-02-2006 à 22:51:37  profilanswer
 

Tu es bien dans un Module Standart (Module1...) ?


---------------
roger
n°1301754
tibot
Posté le 09-02-2006 à 00:37:40  profilanswer
 

oui
 
macro sub dans un module
 
http://img504.imageshack.us/img504/5328/macro2ev.jpg

n°1301789
galopin01
Posté le 09-02-2006 à 06:13:17  profilanswer
 

Ben...  
je vois pas et puis j'ai pas trop le temps de m'amuser à monter un classeur test.
si c'est pas confidentiel ni trop volumineux, tu balances ton classeur "zippé" sur cjoint je déboguerai.
A +


---------------
roger
n°1303464
tibot
Posté le 11-02-2006 à 14:45:14  profilanswer
 

ouf !
J'ai un élément d'explication :
 
En fait ça fonctionne mais s'il ne trouve pas la valeur correspondante, au lieu de mettre un #N/A ça bug comme précedemment
 
exemple tout bete :
 
http://cjoint.com/data/cloPISzU47.htm
 
Une idée pour que ça fonctionne ?
Rechercher si la valeur recherché est présente dans l'autre feuille si oui faire le recherche V sinon afficher " pas de valeur" ?
Est-ce une bonne piste ?

n°1303505
galopin01
Posté le 11-02-2006 à 16:46:08  profilanswer
 

bonjour,
pour  ton classeur démo remplace la ligne VLookup par :

Code :
  1. If Application.IsNA(Application.VLookup(Cells(i, 1), .Range("A2:B" & k), 2, False)) Then
  2. Cells(i, 2) = ""
  3. Else
  4. Cells(i, 2) = Application.VLookup(Cells(i, 1), .Range("A2:B" & k), 2, False)
  5. End If


---------------
roger

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] While et Vlookup

 

Sujets relatifs
[VBA] utiliser une variable dont le nom est dans une variable[VBA Excel] Bloquer les barres de défilement à la fin d'un tableau
Ecriture de formule via VBAFermer Acrobat reader automatiquement [VBA]
Aide sur Projet VBA ExcelCombobox ajouter des valeurs [VBA ACCESS]
Code VBA permettant de supprimer un faux message d'erreur[VBA]Excel - Box de confirmation
VBA Ajout d'un document[VBA EXCEL] RechercheV Multicritère avec boite de dialogue
Plus de sujets relatifs à : [VBA] While et Vlookup


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR