Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

remplissage automatique des cellules avec la valeur du dessus

17 réponses
Avatar
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

Merci de votre aid
sharm

10 réponses

1 2
Avatar
garnote
Bonjour sharmi,

Essaie :

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




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




Avatar
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




Avatar
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




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

Avatar
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

Avatar
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
1 2