FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Aide boucle remplaçant un autofill
 

Aide boucle remplaçant un autofill

Pinpinguin et 79 utilisateurs inconnus
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Aide boucle remplaçant un autofill
 
Plus d'informations

Bonjour bonjour !
 
Après plusieurs jours de lutte acharnée, je demande finalement ici.
Je ne sais PAS coder en VBA, c'est au taff que je suis obligé de m'y intéresser.
 
Ce que je veux : que mon vlookup se fasse jusqu'à la dernière ligne non vide.
 
Voici le code actuel, le souci étant au niveau du Range(Cells(i,17)).Select :

Code :
  1. Columns("A:A" ).Select
  2.     Selection.Insert Shift:=xlToRight
  3.     Range("A2" ).Select
  4.     ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
  5.     Selection.AutoFill Destination:=Range("A2:A408" )
  6.     Range("A2:A408" ).Select
  7.     Cells.Select
  8.     Selection.Sort Key1:=Range("A3" ), Order1:=xlAscending, Header:=xlYes, _
  9.         OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  10.     ActiveWindow.LargeScroll ToRight:=1
  11.     For i = 3 To 65000
  12.      If Not (Cells(i, 1) = "" ) Then
  13.      Range(Cells(i, 17)).Select
  14.      ActiveCell.FormulaR1C1 = _
  15.         "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  16.      Else: Exit For
  17.      End If
  18.     Next i
  19. End Sub


Message édité par Reito le 08-08-2007 à 10:13:40

zeb
Profil : Modérateur libre
Plus d'informations

Pourquoi d'abord sélectionner la colonne A pour avoir le plaisir ensuite de considérer ce qui est sélectionné. Autant considérer la colonne A sans la sélectionner.

 

Pas beau :

Code :
  1. Columns("A:A" ).Select
  2. Selection.Insert Shift:=xlToRight


Chouette :

Code :
  1. Columns("A:A" ).Insert Shift:=xlToRight


Encore mieux :

Code :
  1. Columns("A" ).Insert Shift:=xlToRight
 

Je te propose un petit exercice : Essaye de comprendre ton code et vire-moi les "Select/Selection/ActiveTruc" inutiles. Ton code va subir une cure d'amaigrissement, il va devenir facile à lire, à comprendre et à corriger.

 

A lire ton nouveau code.

 


EDIT: en me relisant, je m'aperçois que je ne t'ai pas promis un chouette code fonctionnel et facile à comprendre même pour un débutant qu'on torture avec du Excel/VBA. Voilà, c'est fait.


Message édité par zeb le 08-08-2007 à 11:08:05

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

Bah...
 
C'est une macro par enregistrement à la base...
Donc j'ai pas esquissé un seul essai de clean du code, puisque le souci ne vient pas de la, et que comme c'est pour le taff, et que je cherche à le résoudre du taff, ma priorité est de le faire fonctionner parfaitement, pas de le rendre esthétique...
 
Mais bon je vais le faire, puisque tu le demandes >_<

Plus d'informations

Code :
  1. Sub Mise_a_jour_téléphone()
  2. Dim i As Long
  3. '
  4. ' Mise_a_jour_téléphone Macro
  5. ' Macro enregistrée le 02/08/2007 par Sebastien XXXXXXX (a538344)
  6. '
  7. '
  8.     Columns("A" ).Insert Shift:=xlToRight
  9.     Cells(2, 1).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
  10.     Selection.AutoFill Destination:=Range("A2:A408" )
  11.     Range("A2:A408" ).Select
  12.     Cells.Select
  13.     Selection.Sort Key1:=Range("A3" ), Order1:=xlAscending, Header:=xlYes, _
  14.         OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  15.     ActiveWindow.LargeScroll ToRight:=1
  16.     For i = 3 To 65000
  17.      If Not (Cells(i, 1) = "" ) Then
  18.      Cells(i, 17).FormulaR1C1 = _
  19.         "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  20.      Else: Exit For
  21.      End If
  22.     Next i
  23. End Sub


 
Pour le

Code :
  1. Range("A2:A408" ).Select
  2.     Cells.Select

J'ai pas pigé ce que ça faisait. Ca sélectionne deux fois la même chose ? :/
 
Sinan mon problème est toujours sur la boucle For...


Message édité par Reito le 08-08-2007 à 13:54:07
Plus d'informations

Bé du coup j'ai trouvé tout seul :x
 

Code :
  1. Sub Mise_a_jour_téléphone()
  2. Dim i As Long
  3. '
  4. ' Mise_a_jour_téléphone Macro
  5. ' Macro enregistrée le 02/08/2007 par Sebastien XXXXXXX (a538344)
  6. '
  7. '
  8.     Columns("A" ).Insert Shift:=xlToRight
  9.     For i = 2 To 65000
  10.     If Not (Cells(i, 2) = "" ) Then
  11.     Cells(i, 1).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
  12.     Else: Exit For
  13.     End If
  14.     Next i
  15.     Cells.Select
  16.     Selection.Sort Key1:=Range("A3" ), Order1:=xlAscending, Header:=xlYes, _
  17.         OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  18.     ActiveWindow.LargeScroll ToRight:=1
  19.     For i = 3 To 65000
  20.      If Not (Cells(i, 1) = "" ) Then
  21.      Cells(i, 17).FormulaR1C1 = _
  22.         "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  23.      Else: Exit For
  24.      End If
  25.     Next i
  26. End Sub


 
Merci à toi !


Message édité par Reito le 08-08-2007 à 14:21:01
zeb
Profil : Modérateur libre
Plus d'informations

:)


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
zeb
Profil : Modérateur libre
Plus d'informations

Cool tu as trouvé tout seul.
Voici cependant ce que je t'écrivais le temps que tu postes ta soluce :
 
 

Range("A2:A408" ).Select
Cells.Select

Merci de ne pas avoir pigé l'intérêt. ça ne sert effectivement à rien.
 
Tips: Evite de dire que tu n'en as rien à foutre, que ce n'est que pour le boulot, etc.
Sinon tu vas te retrouver avec comme proposition l'adresse d'une SSII ;)
 
Comme tu te prêtes au jeu, j'ai plaisir à t'aider.
 
Alors voici ton code, revu et corrigé :

Code :
  1. Sub Mise_a_jour_téléphone()
  2.     Dim i As Long
  3.     Columns("A" ).Insert Shift:=xlToRight
  4.     Range("A2" ).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"   
  5.     Range("A2" ).AutoFill Destination:=Range("A2:A408" )
  6.     Cells.Sort Key1:=Range("A3" ), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom   
  7.     For i = 3 To 65000
  8.         If Cells(i, 1) <> "" Then
  9.             Cells(i, 17).FormulaR1C1 = "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  10.         Else
  11.             Exit For
  12.         End If
  13.     Next i
  14. End Sub


 
Ta ligne 16 a été supprimée car jugée inutile. Ta ligne 12 aussi. Tous les "Selection" ont été remplacés par une plage de cellules explicite. A ta ligne 10, j'ai remplacé Cells par Range. Ca n'amène pas grand chose. Cells est aussi bien. Mais comme avant et après on considère la colonne A et la zone A2:A408, je l'écris comme ça. Qu'en penses-tu ?
 
---------------------------------------
Bon, ensuite, à ma ligne 12, il y a un "Exit For". C'est à dire que l'on s'arrête à la première ligne vide. Or si je te suis bien, tu voudrais d'arrêter à la dernière ligne non vide.
C'est bien ça ? Si oui, je te propose cette lecture : La dernière ligne
---------------------------------------
Ce qui précède est donc HS.
 
 
Voici ma soluce, qui vaut la tienne :

Code :
  1. Sub Mise_a_jour_téléphone()
  2.     ' (c) Sebastien XXXXXXX + PPC ;)
  3.     Dim i As Long
  4.     dim der As Long
  5.    
  6.     der = Range("A2" ).End(xlDown).Row
  7.     Columns("A" ).Insert Shift:=xlToRight
  8.     For i = 2 To der
  9.         Cells(i, 2).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
  10.     Next
  11.     Cells.Sort Key1:=Range("A3" ), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  12.     For i = 3 To der
  13.         Cells(i, 17).FormulaR1C1 = "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  14.     Next i
  15. End Sub


Tout est dans le End(xlDown).


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

Ah ok bah merci ^^
 
J'ai pas dit que je m'en foutais mdr :( je pensais pas que ça jouerait sur ma résolution, et pourtant si ^^

zeb
Profil : Modérateur libre
Plus d'informations

Difficile de trouver de l'aide sur un site d'entraide tenu par des bénévoles si tu commences par dire ou laisser croire que : "Votre truc je m'en balance, démerdez-vous pour que ça marche !"
 
Et si t'es pas content, je te dénonce à Daniel B. :lol:
 
Mais tu vois, en plus tu l'as trouvé tout seul :)
 
Si je peux me permettre un dernier conseil sur les macros VBA.
Enregistre-les avec l'enregistreur, nettoie-les et simplifie-les. Ca devient ensuite beaucoup plus simple de les adapter. Il reste la soluce de demander sur un forum qu'on te le fasse, mais tu risques de tomber sur un pénible dans mon genre :whistle:


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

Euh ?!
 
Bon s'pas grave :p
 
Et d'où tu sais que je travaille pour Daniel B. ?!


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Aide boucle remplaçant un autofill
 

Annonces Google
Publicité
Les ressources relatives
Les téléchargements