Microsoft 365 Copier cellule jusqu'à prochaine cellule non vide sur la plage sélectionnée

CHL1234

XLDnaute Nouveau
Bonjour,
Je suis novice en VBA, et je cherche à créer une macro qui me permette de copier le contenu d'une cellule jusqu'à la prochaine cellule non vide (sur la même ligne), le tout sur une plage donnée : par exemple, si seules les cellules A1, A5 et A10 sont remplies, et que je sélectionne la plage A1:A20, je voudrais que A1 soit répété jusqu'en A4, A5 jusqu'en A9 et A10 jusqu'en A20.
J'ai trouvé plusieurs lignes de discussions similaires sur divers forums (https://www.excel-downloads.com/threads/recopie-cellule-jusqua-la-suivante-non-vide-vba.87912/ ou https://forum.excel-pratique.com/ex...a-la-derniere-non-vide-et-repeter-t61497.html pour n'en citer que deux). Toutefois, aucun ne me permet de faire agir la macro seulement sur la plage donnée.
Sauriez-vous m'aider ?
Merci d'avance pour vos retours !
 

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

A tester sur une sélection en colonne.

VB:
Sub RemplirBas2()
    Dim tbl As Variant
    Dim i As Integer
    tbl = Selection.Columns(1).Value ' Valeurs dans un tableau mémoire
    '
    ' Parcours de chaque valeur
    For i = 2 To UBound(tbl)
       '
       ' si la valeur est vide, prendre la précédente
        If IsEmpty(tbl(i, 1)) Then tbl(i, 1) = tbl(i - 1, 1)
    Next
    '
    'Recharger la sélection par les nouvelles valeurs
    Selection.Columns(1).Value = tbl
End Sub

Limitation : la première cellule de la sélection ne doit pas être vide.

Ou celle-ci avec les méthodes VBA
Code:
Sub RemplirBas()
    Dim plg As Range, c1 As Range, c2 As Range
    '
    ' Récupérer les cellules avec constantes
    On Error Resume Next
    Set plg = Selection.SpecialCells(xlCellTypeConstants)
    On Error GoTo 0
    '
    ' si existent
    If Not plg Is Nothing Then
        '
        ' parcourir chacune d'entre elles
        For Each c1 In plg
            '
            ' récupérer la dernière cellule vide de la plage de c1
            Set c2 = c1.End(xlDown).Offset(-1)
            '
            ' Vérifiez qu'on a pas dépassé la sélection
            If c2.Row > Selection.Row + Selection.Rows.Count - 1 Then Set c2 = Selection.Cells(Selection.Cells.Count)
            '
            ' si la ligne de c2 est supérieure à la ligne de c1 alors on remplit
            If c2.Row > c1.Row Then Range(c1, c2).FillDown
        Next
    End If
End Sub




cordialement
 
Dernière édition:

CHL1234

XLDnaute Nouveau
Bonjour,
Merci beaucoup pour votre aide ! Le premier semble fonctionner, donc merci infiniment !
En revanche, le second ne fonctionne pas (la première valeur de la colonne écrase les suivantes).
J'ai une question complémentaire qui empêche la macro (donc le premier code) de fonctionner pleinement : pour reprendre l'exemple de mon premier mail, j'ai isolé les valeurs A1, A5 et A10 au moyen d'une formule de type Si B1 = quelque chose , alors B1, sinon "". Puis j'ai copié-collé la colonne A en valeurs. Pour la macro, il semble que "" veuille dire qu'il y a quelque chose dans la cellule, car la copie s'arrête. Sauriez-vous pourquoi ?
 

Discussions similaires

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 812
dernier inscrit
abdouami