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 :
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 :
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
Range("A2").Select
ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
Selection.AutoFill Destination:=Range("A2:A408")
Range("A2:A408").Select
Cells.Select
Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveWindow.LargeScroll ToRight:=1
For i = 3 To 65000
If Not (Cells(i, 1) = "") Then
Range(Cells(i, 17)).Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
Else: Exit For
End If
Next i
End Sub
Autres pages sur : aide boucle remplacant autofill
Lassé par la pub ? Créez un compte
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 :
Chouette :
Encore mieux :
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.
Pas beau :
Columns("A:A").Select Selection.Insert Shift:=xlToRight
Chouette :
Columns("A:A").Insert Shift:=xlToRight
Encore mieux :
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 >_<
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 >_<
Sub Mise_a_jour_téléphone()
Dim i As Long
'
' Mise_a_jour_téléphone Macro
' Macro enregistrée le 02/08/2007 par Sebastien XXXXXXX (a538344)
'
'
Columns("A").Insert Shift:=xlToRight
Cells(2, 1).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
Selection.AutoFill Destination:=Range("A2:A408")
Range("A2:A408").Select
Cells.Select
Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveWindow.LargeScroll ToRight:=1
For i = 3 To 65000
If Not (Cells(i, 1) = "") Then
Cells(i, 17).FormulaR1C1 = _
"=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
Else: Exit For
End If
Next i
End Sub
Pour le
J'ai pas pigé ce que ça faisait. Ca sélectionne deux fois la même chose ?
Range("A2:A408").Select
Cells.Select
Sinan mon problème est toujours sur la boucle For...
Bé du coup j'ai trouvé tout seul :x
Merci à toi !
Sub Mise_a_jour_téléphone()
Dim i As Long
'
' Mise_a_jour_téléphone Macro
' Macro enregistrée le 02/08/2007 par Sebastien XXXXXXX (a538344)
'
'
Columns("A").Insert Shift:=xlToRight
For i = 2 To 65000
If Not (Cells(i, 2) = "") Then
Cells(i, 1).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
Else: Exit For
End If
Next i
Cells.Select
Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveWindow.LargeScroll ToRight:=1
For i = 3 To 65000
If Not (Cells(i, 1) = "") Then
Cells(i, 17).FormulaR1C1 = _
"=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
Else: Exit For
End If
Next i
End Sub
Merci à toi !
Cool tu as trouvé tout seul.
Voici cependant ce que je t'écrivais le temps que tu postes ta soluce :
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é :
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 :
Tout est dans le End(xlDown).
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.Cells.Select
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é :
Sub Mise_a_jour_téléphone()
Dim i As Long
Columns("A").Insert Shift:=xlToRight
Range("A2").FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
Range("A2").AutoFill Destination:=Range("A2:A408")
Cells.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For i = 3 To 65000
If Cells(i, 1) <> "" Then
Cells(i, 17).FormulaR1C1 = "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
Else
Exit For
End If
Next i
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 :
Sub Mise_a_jour_téléphone()
' (c) Sebastien XXXXXXX + PPC ;)
Dim i As Long
dim der As Long
der = Range("A2").End(xlDown).Row
Columns("A").Insert Shift:=xlToRight
For i = 2 To der
Cells(i, 2).FormulaR1C1 = "=CONCATENATE(RC[3],RC[4])"
Next
Cells.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For i = 3 To der
Cells(i, 17).FormulaR1C1 = "=VLOOKUP(RC[-16],annuaire!RC[-16]:R[34932]C[-9],8,FALSE)"
Next i
End Sub
Tout est dans le End(xlDown).
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.
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
Et si t'es pas content, je te dénonce à Daniel B.
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
Lassé par la pub ? Créez un compte
je pensais pas que ça jouerait sur ma résolution, et pourtant si ^^