Se connecter avec
S'enregistrer | Connectez-vous

Aide boucle remplaçant un autofill

Dernière réponse : dans Programmation

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

Autres pages sur : aide boucle remplacant autofill

Lassé par la pub ? Créez un compte
Expert Programmation

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 :
  1. Columns("A:A").Select
  2. Selection.Insert Shift:=xlToRight

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

Encore mieux :
  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.

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 >_<

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


Pour le
  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...

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

  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. '
  9. Columns("A").Insert Shift:=xlToRight
  10. For i = 2 To 65000
  11. If Not (Cells(i, 2) = "") Then
  12. Cells(i, 1).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
  13. Else: Exit For
  14. End If
  15. Next i
  16. Cells.Select
  17. Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, _
  18. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  19. ActiveWindow.LargeScroll ToRight:=1
  20. For i = 3 To 65000
  21. If Not (Cells(i, 1) = "") Then
  22. Cells(i, 17).FormulaR1C1 = _
  23. "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
  24. Else: Exit For
  25. End If
  26. Next i
  27. End Sub


Merci à toi !
Expert Programmation

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

Tout est dans le End(xlDown).
Expert Programmation

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: 
Lassé par la pub ? Créez un compte