remplissage automatique des cellules avec la valeur du dessus
17 réponses
sharmi
Bonjour
Je voudrais automatiser à l'aide d'une macro le remplissage des cellules vide avec le contenu de la cellule juste au-dessus
ex : liste sur une seule colonn
A
vide ==> à remplacer par A
vide ==> ide
CE
vide==> à remplacer par CE
Sub Remplace() Set ici = Selection For i = 2 To ici.Rows.Count If ici(i) = "" Then ici(i) = ici(i - 1) Next i End Sub
Serge
"sharmi" a écrit dans le message de news:
Bonjour, Je voudrais automatiser à l'aide d'une macro le remplissage des cellules vide avec le contenu de la cellule juste au-dessus.
ex : liste sur une seule colonne AA vide ==> à remplacer par AA vide ==> idem CER vide==> à remplacer par CER
Merci de votre aide sharmi
AV
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Ave garnote,
Juste pour le smilblick
Ton code est plus court mais le temps d'exécution sur une longue plage est
nettement plus long (passage en revue de toutes les cellules)
Sur une plage moyenne c'est pas significatif
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
garnote
Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Plus court, plus court !
Plus court que quoi ?
En le rédigeant, je pensais bien qu'il y avait des
méthodes «plus fortes». Mais elle est où
la méthode forte ?
;-)
Serge
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de news:
ewLttYrsDHA.2392@TK2MSFTNGP10.phx.gbl...
Ave garnote,
Juste pour le smilblick
Ton code est plus court mais le temps d'exécution sur une longue plage est
nettement plus long (passage en revue de toutes les cellules)
Sur une plage moyenne c'est pas significatif
Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Denis Michon
Bonjour Garnote,
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------ Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long With Worksheets("Feuil1") Set Rg = Range("A1") C = .Range("A65536").End(xlUp).Row End With
If C < Rg.Row + 2 Then Exit Sub
Do A = Rg.End(xlDown).Row - Rg(1).Row Rg.Resize(A).FillDown Set Rg = Rg(A + 1) Loop Until C = Rg.Row
End Sub '------------------------------
Salutations!
"garnote" a écrit dans le message de news:edswb.64547$ Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Bonjour Garnote,
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------
Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long
With Worksheets("Feuil1")
Set Rg = Range("A1")
C = .Range("A65536").End(xlUp).Row
End With
If C < Rg.Row + 2 Then Exit Sub
Do
A = Rg.End(xlDown).Row - Rg(1).Row
Rg.Resize(A).FillDown
Set Rg = Rg(A + 1)
Loop Until C = Rg.Row
End Sub
'------------------------------
Salutations!
"garnote" <rien@absent.net> a écrit dans le message de news:edswb.64547$Ng3.30219@charlie.risq.qc.ca...
Plus court, plus court !
Plus court que quoi ?
En le rédigeant, je pensais bien qu'il y avait des
méthodes «plus fortes». Mais elle est où
la méthode forte ?
;-)
Serge
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de news:
ewLttYrsDHA.2392@TK2MSFTNGP10.phx.gbl...
Ave garnote,
Juste pour le smilblick
Ton code est plus court mais le temps d'exécution sur une longue plage est
nettement plus long (passage en revue de toutes les cellules)
Sur une plage moyenne c'est pas significatif
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------ Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long With Worksheets("Feuil1") Set Rg = Range("A1") C = .Range("A65536").End(xlUp).Row End With
If C < Rg.Row + 2 Then Exit Sub
Do A = Rg.End(xlDown).Row - Rg(1).Row Rg.Resize(A).FillDown Set Rg = Rg(A + 1) Loop Until C = Rg.Row
End Sub '------------------------------
Salutations!
"garnote" a écrit dans le message de news:edswb.64547$ Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Denis Michon
Et si tu préfères, la boucle Do ... loop until peut s'écrire de cette façon
Do With Rg.Resize(Rg.End(xlDown).Row - Rg(1).Row) .FillDown Set Rg = .Offset(1) End With Loop Until C = Rg.Row
Salutations!
"Denis Michon" a écrit dans le message de news:pCtwb.64746$ Bonjour Garnote,
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------ Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long With Worksheets("Feuil1") Set Rg = Range("A1") C = .Range("A65536").End(xlUp).Row End With
If C < Rg.Row + 2 Then Exit Sub
Do A = Rg.End(xlDown).Row - Rg(1).Row Rg.Resize(A).FillDown Set Rg = Rg(A + 1) Loop Until C = Rg.Row
End Sub '------------------------------
Salutations!
"garnote" a écrit dans le message de news:edswb.64547$ Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
Et si tu préfères, la boucle Do ... loop until peut s'écrire de cette façon
Do
With Rg.Resize(Rg.End(xlDown).Row - Rg(1).Row)
.FillDown
Set Rg = .Offset(1)
End With
Loop Until C = Rg.Row
Salutations!
"Denis Michon" <denis.michon@cgocable.ca> a écrit dans le message de news:pCtwb.64746$Ng3.8268@charlie.risq.qc.ca...
Bonjour Garnote,
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------
Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long
With Worksheets("Feuil1")
Set Rg = Range("A1")
C = .Range("A65536").End(xlUp).Row
End With
If C < Rg.Row + 2 Then Exit Sub
Do
A = Rg.End(xlDown).Row - Rg(1).Row
Rg.Resize(A).FillDown
Set Rg = Rg(A + 1)
Loop Until C = Rg.Row
End Sub
'------------------------------
Salutations!
"garnote" <rien@absent.net> a écrit dans le message de news:edswb.64547$Ng3.30219@charlie.risq.qc.ca...
Plus court, plus court !
Plus court que quoi ?
En le rédigeant, je pensais bien qu'il y avait des
méthodes «plus fortes». Mais elle est où
la méthode forte ?
;-)
Serge
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de news:
ewLttYrsDHA.2392@TK2MSFTNGP10.phx.gbl...
Ave garnote,
Juste pour le smilblick
Ton code est plus court mais le temps d'exécution sur une longue plage est
nettement plus long (passage en revue de toutes les cellules)
Sur une plage moyenne c'est pas significatif
Et si tu préfères, la boucle Do ... loop until peut s'écrire de cette façon
Do With Rg.Resize(Rg.End(xlDown).Row - Rg(1).Row) .FillDown Set Rg = .Offset(1) End With Loop Until C = Rg.Row
Salutations!
"Denis Michon" a écrit dans le message de news:pCtwb.64746$ Bonjour Garnote,
Une alternative, Tu adaptes le nom de la feuille et la cellule de départ.
'------------------------------ Private Sub Remplir()
Dim Rg As Range, C As Long, A As Long With Worksheets("Feuil1") Set Rg = Range("A1") C = .Range("A65536").End(xlUp).Row End With
If C < Rg.Row + 2 Then Exit Sub
Do A = Rg.End(xlDown).Row - Rg(1).Row Rg.Resize(A).FillDown Set Rg = Rg(A + 1) Loop Until C = Rg.Row
End Sub '------------------------------
Salutations!
"garnote" a écrit dans le message de news:edswb.64547$ Plus court, plus court ! Plus court que quoi ? En le rédigeant, je pensais bien qu'il y avait des méthodes «plus fortes». Mais elle est où la méthode forte ?
;-)
Serge
"AV" a écrit dans le message de news:
Ave garnote,
Juste pour le smilblick Ton code est plus court mais le temps d'exécution sur une longue plage est nettement plus long (passage en revue de toutes les cellules) Sur une plage moyenne c'est pas significatif
AV
AV
Salut Denis,
Qques trucs : Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2° proposition) Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein; 2vides......
C'était juste pour le smilblick AV
Salut Denis,
Qques trucs :
Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide
Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2°
proposition)
Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein;
2vides......
Qques trucs : Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2° proposition) Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein; 2vides......
C'était juste pour le smilblick AV
michdenis
Bonjour AV,
Tu as raison pour ceci A1:A3 =plein;plein;vide, et cela est applicable seulement pour le début de la procédure.... et c'est un truc chi..nt bien connu avec la méthode ".end(xldown)" ...
Mais plus troublant encore si dans la plage de cellules, il y a 2 cellules consécutives ou plus avec des données différentes...le contenu de certaines cellules va être effacé par le contenu de la première cellule de cette même suite de cellules consécutives...
Cette procédure se voulait seulement un exemple de la méthode "FillDown" et non pas une panacée à tous les cas de figures possibles quant à la disposition possible des données sur une plage de cellules..
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami. puisque ce dernier ne fait aucune allusion à ces types de dispositions particulières des données , la procédure "répondant aux exigences" de la question...2 fois plutôt qu'une !
;-)
Salutations!
"AV" a écrit dans le message de news: Salut Denis,
Qques trucs : Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2° proposition) Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein; 2vides......
C'était juste pour le smilblick AV
Bonjour AV,
Tu as raison pour ceci A1:A3 =plein;plein;vide, et cela est applicable seulement pour le début de la procédure.... et
c'est un truc chi..nt bien connu avec la méthode ".end(xldown)" ...
Mais plus troublant encore si dans la plage de cellules, il y a 2 cellules consécutives ou plus avec des données
différentes...le contenu de certaines cellules va être effacé par le contenu de la première cellule de cette même suite
de cellules consécutives...
Cette procédure se voulait seulement un exemple de la méthode "FillDown" et non pas une panacée à tous les cas de
figures possibles quant à la disposition possible des données sur une plage de cellules..
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami. puisque ce
dernier ne fait aucune allusion à ces types de dispositions particulières des données , la procédure "répondant aux
exigences" de la question...2 fois plutôt qu'une !
;-)
Salutations!
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de news:ecy5qwwsDHA.700@TK2MSFTNGP11.phx.gbl...
Salut Denis,
Qques trucs :
Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide
Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2°
proposition)
Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein;
2vides......
Tu as raison pour ceci A1:A3 =plein;plein;vide, et cela est applicable seulement pour le début de la procédure.... et c'est un truc chi..nt bien connu avec la méthode ".end(xldown)" ...
Mais plus troublant encore si dans la plage de cellules, il y a 2 cellules consécutives ou plus avec des données différentes...le contenu de certaines cellules va être effacé par le contenu de la première cellule de cette même suite de cellules consécutives...
Cette procédure se voulait seulement un exemple de la méthode "FillDown" et non pas une panacée à tous les cas de figures possibles quant à la disposition possible des données sur une plage de cellules..
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami. puisque ce dernier ne fait aucune allusion à ces types de dispositions particulières des données , la procédure "répondant aux exigences" de la question...2 fois plutôt qu'une !
;-)
Salutations!
"AV" a écrit dans le message de news: Salut Denis,
Qques trucs : Me semble que tes 2 méthodes échoueront si A1:A3 =plein;plein;vide Les temps d'exécution me semble relativement bcp plus long (notamment pour la 2° proposition) Tests sur plage A1:A20000 avec série de valeurs = 2 plein; 2vides;2 plein; 2vides......
C'était juste pour le smilblick AV
AV
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami
C'était quoi la question ? ;-) C'était juste pour faire un petit tour dans la propriété Areas et une histoire d'optimisation de code...
AV
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la
problématique posée par Shami
C'était quoi la question ? ;-)
C'était juste pour faire un petit tour dans la propriété Areas et une histoire
d'optimisation de code...
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami
C'était quoi la question ? ;-) C'était juste pour faire un petit tour dans la propriété Areas et une histoire d'optimisation de code...
AV
Denis Michon
Bonjour AV,
Voici un spécial....les 2 mêmes procédures avec Areas ....ça devrait rencontrer tous les cas de figures ! La deuxième étant toujours un peu plus rapide ... bien que je n'aie pas fait de test !
'--------------------------------- Sub Remplir3()
Dim Rg As Range, R As Range, C As Long
With Worksheets("Feuil1") Set Rg = .Range("A1:A" & .Range("A6555"). _ End(xlUp).Row).SpecialCells(xlCellTypeConstants) C = .Range("A65536").End(xlUp).Row End With
For Each are In Rg.Areas If are.Row = C Then Exit Sub Set R = are(are.Rows.Count) With R.Resize(R.End(xlDown).Row - R.Row) .FillDown End With Next Set Rg = Nothing: Set R = Nothing End Sub '---------------------------------
'--------------------------------- Sub Remplir4()
Dim R As Range, C As Long, A As Long
With Worksheets("Feuil1") Set Rg = .Range("A1:A" & .Range("A6555"). _ End(xlUp).Row).SpecialCells(xlCellTypeConstants) C = .Range("A65536").End(xlUp).Row End With
For Each are In Rg.Areas If are.Row = C Then Exit Sub Set R = are(are.Rows.Count) A = R.End(xlDown).Row - R.Row R.Resize(A).FillDown Next Set R = Nothing End Sub '---------------------------------
Salutations!
P.S. Est-ce qu'il y a une adresse pour la facturation ? ;-))
"AV" a écrit dans le message de news:%
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami
C'était quoi la question ? ;-) C'était juste pour faire un petit tour dans la propriété Areas et une histoire d'optimisation de code...
AV
Bonjour AV,
Voici un spécial....les 2 mêmes procédures avec Areas ....ça devrait rencontrer tous les cas de figures ! La deuxième
étant toujours un peu plus rapide ... bien que je n'aie pas fait de test !
'---------------------------------
Sub Remplir3()
Dim Rg As Range, R As Range, C As Long
With Worksheets("Feuil1")
Set Rg = .Range("A1:A" & .Range("A6555"). _
End(xlUp).Row).SpecialCells(xlCellTypeConstants)
C = .Range("A65536").End(xlUp).Row
End With
For Each are In Rg.Areas
If are.Row = C Then Exit Sub
Set R = are(are.Rows.Count)
With R.Resize(R.End(xlDown).Row - R.Row)
.FillDown
End With
Next
Set Rg = Nothing: Set R = Nothing
End Sub
'---------------------------------
'---------------------------------
Sub Remplir4()
Dim R As Range, C As Long, A As Long
With Worksheets("Feuil1")
Set Rg = .Range("A1:A" & .Range("A6555"). _
End(xlUp).Row).SpecialCells(xlCellTypeConstants)
C = .Range("A65536").End(xlUp).Row
End With
For Each are In Rg.Areas
If are.Row = C Then Exit Sub
Set R = are(are.Rows.Count)
A = R.End(xlDown).Row - R.Row
R.Resize(A).FillDown
Next
Set R = Nothing
End Sub
'---------------------------------
Salutations!
P.S. Est-ce qu'il y a une adresse pour la facturation ? ;-))
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de news:%23UZ3ysxsDHA.2380@TK2MSFTNGP09.phx.gbl...
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la
problématique posée par Shami
C'était quoi la question ? ;-)
C'était juste pour faire un petit tour dans la propriété Areas et une histoire
d'optimisation de code...
Voici un spécial....les 2 mêmes procédures avec Areas ....ça devrait rencontrer tous les cas de figures ! La deuxième étant toujours un peu plus rapide ... bien que je n'aie pas fait de test !
'--------------------------------- Sub Remplir3()
Dim Rg As Range, R As Range, C As Long
With Worksheets("Feuil1") Set Rg = .Range("A1:A" & .Range("A6555"). _ End(xlUp).Row).SpecialCells(xlCellTypeConstants) C = .Range("A65536").End(xlUp).Row End With
For Each are In Rg.Areas If are.Row = C Then Exit Sub Set R = are(are.Rows.Count) With R.Resize(R.End(xlDown).Row - R.Row) .FillDown End With Next Set Rg = Nothing: Set R = Nothing End Sub '---------------------------------
'--------------------------------- Sub Remplir4()
Dim R As Range, C As Long, A As Long
With Worksheets("Feuil1") Set Rg = .Range("A1:A" & .Range("A6555"). _ End(xlUp).Row).SpecialCells(xlCellTypeConstants) C = .Range("A65536").End(xlUp).Row End With
For Each are In Rg.Areas If are.Row = C Then Exit Sub Set R = are(are.Rows.Count) A = R.End(xlDown).Row - R.Row R.Resize(A).FillDown Next Set R = Nothing End Sub '---------------------------------
Salutations!
P.S. Est-ce qu'il y a une adresse pour la facturation ? ;-))
"AV" a écrit dans le message de news:%
Ceci étant dit, tes propos et ceux de ce message sortent du cadre de la problématique posée par Shami
C'était quoi la question ? ;-) C'était juste pour faire un petit tour dans la propriété Areas et une histoire d'optimisation de code...
AV
AV
Pour savoir si je te décerne un satisfecit, je testerais ça ultérieurement sur grandes plages A l'intuition, me semble que le Resize devrait ralentir mais c'est juste au feeling !
AV
Pour savoir si je te décerne un satisfecit, je testerais ça ultérieurement sur
grandes plages
A l'intuition, me semble que le Resize devrait ralentir mais c'est juste au
feeling !
Pour savoir si je te décerne un satisfecit, je testerais ça ultérieurement sur grandes plages A l'intuition, me semble que le Resize devrait ralentir mais c'est juste au feeling !