Récupérer valeur dernière ligne vide puis copier au dessus

choup67

XLDnaute Occasionnel
Bonjour à tous,

Je rencontre un petit soucis avec un fichier qui provient d'une base de données. L'extraction laisse parfois des lignes vides alors qu'il devrait y figurer un numéro de commande. J'ai simplifié le fichier pour l'exemple.

Dans la colonne A, j'ai une adresse de livraison, dans la colonne B, le numéro de commande. Comme on peut le voir, le numéro de commande n'apparaît pas sur toutes les lignes. Parfois il n'y a qu'une ligne vide, dans ce cas la formule que j'ai essayé fonctionne mais parfois il y en a 2, 3, voir plus. Du coup, je ne sais pas comment faire pour récupérer le numéro de commande sur toutes les lignes.

1 commande = 1 adresse, peut être faut-il jouer sur ce champ?

Plus d'explications dans le fichier joint.

Merci pour votre aide.
 

Pièces jointes

  • choup67.xls
    23 KB · Affichages: 84
  • choup67.xls
    23 KB · Affichages: 91
  • choup67.xls
    23 KB · Affichages: 119

mth

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Bonjour choup67,

Tu peux essayer avec cette formule:
Code:
=SI(B2="";D3;B2)

ou alors une boucle:
Code:
Sub remplir()
Dim lig As Long
With Sheets("Feuil1")
lig = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = lig To 2 Step -1
        If .Cells(i, 2) = "" Then
            .Cells(i, 3) = .Cells(i + 1, 3)
        Else
            .Cells(i, 3) = .Cells(i, 2)
        End If
    Next i
End With
End Sub

Bien à toi,

mth
 

Pièces jointes

  • choup67(1).xls
    42.5 KB · Affichages: 88

choup67

XLDnaute Occasionnel
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Super merci beaucoup MTH, ça fonctionne nickel. Maintenant je vais essayer d'adapter ça à mon fichier mais le code n'a pas trop l'air compliqué même pour une débutante en macro ;)
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Bonsoir le fil, choup67, mth, 00


Sans boucle
Code:
Sub Macro1()
With Range([B2], [B65536].End(xlUp))
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[1]C"
.Value = .Value
End With
End Sub
EDITION: Houps, désolé j'ai posté avant d'ouvrir le fichier de 00.
 
Dernière édition:

DoubleZero

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re-bonjour, le Fil, le Forum, bonjour, Staple1600,

... Houps, désolé j'ai posté avant d'ouvrir le fichier de 00.

Pour une fois que je parviens à faire « maigrir » une macro :D (cf. post #4)…

Code:
Private Sub CommandButton1_Click()
Columns("B:B").SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[1]C"
Columns("B:B").Value = Columns("B:B").Value
End Sub

A moins que la fiabilité de cette dernière ne soit douteuse :confused:… J’ai tellement à apprendre :eek: !

Je vous remercie pour vos conseils :).

Bon dodo :).
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re

00
Sa seule différence c'est que tu parcours la colonne dans son intégralité.
Ma proposition ne s'applique que sur la plage en cours de la colonne B
L'autre différence est que j'ai sorti mes endives.

Et comme je l'ai précisé dans mon édition, j'ai ouvert ton fichier après avoir posté mon message
(Message motivé par celui de mth - rapport à la boucle - qu'on évite toi et moi.)

Bonne nuit 00, mes amitiés à Morphée.
 

DoubleZero

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re-bonjour,

... Sa seule différence c'est que tu parcours la colonne dans son intégralité...

Je te remercie :) pour cette explication.

Dès lors, pour éviter de parcourir l’intégralité des cellules de la colonne B, l’emploi d’un nom (champ) dynamique génèrerait-il la même efficacité que ta proposition ?

Bon dodo itou :cool:.
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re


Ce bout de code
Code:
With Range([B2], [B65536].End(xlUp))
évite de parcourir toute la colonne B

Utiliser une plage nommée (si j'ai bien compris ton dernier message)
n'aurait (à mon sens) aucune incidence positive ou négative.

Cela serait équivalent.

EDITION: Voici la macro avec une plage nommée
Code:
Sub Macro2()
Dim plg As Range
Set plg = Range([B2], [B65536].End(xlUp))
With plg
.SpecialCells(4).FormulaR1C1 = "=R[1]C": .Value = .Value
End With
End Sub
 
Dernière édition:

DoubleZero

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re-bonjour - soir - nuit :),

... Voici la macro avec une plage nommée
Code:
Sub Macro2()
Dim plg As Range
Set plg = Range([B2], [B65536].End(xlUp))
With plg
.SpecialCells(4).FormulaR1C1 = "=R[1]C": .Value = .Value
End With
End Sub

Dans ce cas, est-il normal que ladite plage n'apparaisse pas dans le gestionnaire de noms :confused: ?

Merci, encore :).
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Bonjour

00:
Houps, désolé, je devais déjà être dans les bras de Morphée
Le temps d'ouvrir Excel et je poste la macro avec la plage nommée.

VB:
Sub Macro3()
        Dim plg As Range
        Set plg = Range([B2], [B65536].End(xlUp)): plg.Name = "MonNomEstPlageNommee"
        With [MonNomEstPlageNommee]
        .SpecialCells(4).FormulaR1C1 = "=R[1]C": .Value = .Value
        End With
        'Pour vérifier l'existence de la plage nommée
        Range("D1").ListNames
        Range("D1:E1").Columns.AutoFit
        Range("D1:E1").Font.Bold = True
        End Sub
 
Dernière édition:

choup67

XLDnaute Occasionnel
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Wow merci à tous pour cet engouement, malheureusement je suis trop nulle, je n'arrive pas à l'adapter à mon fichier.

J'ai mis un bouton et mis le code de la macro dans un module et je l'ai associé au bouton mais lorsque je clique, j'ai l"erreur d'exécution 1004, pas de cellule correspondante.

J'ai utilisé le code de staple1600 mais j'avais aussi essayé avec celui de 00 :
Code:
Sub Macro1()
With Range([B2], [B65536].End(xlUp))
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[1]C"
.Value = .Value
End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Bonjour


Cela veut dire qu'il n'y a plus de cellules vides.

La macro que je t'ai proposé fonctionne sur la colonne B
(Et il faut qu'il y ait des cellules vides) pour qu'elle fonctionne sans message d'erreur.
Voir ci dessous
vides.png
Selon ce que tu veux faire utiliser la formule adéquate
Code:
.FormulaR1C1 = "=R[-1]C"
ou
Code:
.FormulaR1C1 = "=R[1]C"
 
Dernière édition:

mth

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Bonjour à tous :)

Ca peut aussi vouloir dire qu'il manque une gestion d'erreurs, en partant du code de Staple1600, peut-être peut-on faire ceci?:

Code:
With Range([B2], [B65536].End(xlUp))
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[1]C"
.Value = .Value
End With

Très bon après-midi à tous :)

mth
 

Staple1600

XLDnaute Barbatruc
Re : Récupérer valeur dernière ligne vide puis copier au dessus

Re, bonjour mth

Cela veut d'abord dire qu'il n'y a plus de cellules vides
Ce qui génère un message d'erreur
Ce qui montre l'absence de gestion d'erreur dans le code que je proposai.
(Et là c'est mal de ma part, mea culpa) :eek:

On Error Resume Next ne gère pas l'erreur, il la zappe ;)
 

Discussions similaires

Réponses
21
Affichages
949
Réponses
6
Affichages
386

Statistiques des forums

Discussions
312 322
Messages
2 087 275
Membres
103 506
dernier inscrit
L_APPRENANT