Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 ?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Essayez le test suivant :

VB:
 If tbl(i, 1)="" Then tbl(i, 1) = tbl(i - 1, 1)

Et si cela ne fonctionne pas payez nous le luxe d'un classeur exemple !

Cordialement
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…