Rechercher et copier la dernière valeur numérique d'une colonne

Bonjour,

Je suis un noob en VBA.

Je voudrais savoir si c'est possible de pouvoir récupérer par une macro la dernière valeur numérique d'une colonne et le copier ailleurs avec sa date associée.

En effet je récupère un fichier qui s'incrémente chaque jour (donc le jean change de ligne chaque jour vers le bas), qui sur une colonne a un titre en texte et fini par une ligne de texte. Il y a également des cellules vides.

J'ai mis un fichier exemple pour être plus clair.

w6osqek

La je voudrais récupérer le "3" et le copier ailleurs.

J'ai essayé en faisant une plage excluant la ligne contenant "jean" mais ça ne fonctionne pas. Peut être une fonction If mais je n'y arrive pas. Je sollicite donc votre aide.

Merci d'avance.

4classeur1.xlsm (15.58 Ko)

Bonjour,

Ci-joint ton fichier test ...

En espèrant que cela t'aide

Bonjour,

Le résultat est bon mais j'en ai besoin dans une macro car j'ai besoin de venir chercher ce résultat depuis un autre fichier.

En gros j'ai plein de fichiers de ce type qui sont générés et j'ai besoin d'avoir dans un fichier de synthèse les derniers résultats disponibles, d'où la volonté d'avoir une macro à lancer qui viendrait chercher la dernière valeur numérique.

Bonjour,

Une piste :

Sub Test()

    Dim Col As Long
    Dim Lig As Long
    Dim Valeur

    Col = 2

    With Worksheets("Feuil1")

        Lig = .Rows.Count

        Do

            Lig = .Cells(Lig, Col).End(xlUp).Row 'sur colonne B
            Valeur = .Cells(Lig, Col).Value

        Loop Until IsNumeric(Valeur) Or Lig = 1

    End With

    If IsNumeric(Valeur) Then MsgBox "Valeur numérique la plus basse : " & Valeur Else MsgBox "Aucune valeur numérique dans la colonne !"

End Sub

La boucle permet d'éviter les valeurs textes.

La voici sous forme de fonction pour pouvoir l'utiliser directement dans Excel :

Function ValeurNum(Col As Long)

    Dim Lig As Long
    Dim Valeur

    With Worksheets("Feuil1")

        Lig = .Rows.Count

        Do

            Lig = .Cells(Lig, Col).End(xlUp).Row 'sur colonne B
            Valeur = .Cells(Lig, Col).Value

        Loop Until IsNumeric(Valeur) Or Lig = 1

    End With

    If IsNumeric(Valeur) Then ValeurNum = Valeur Else ValeurNum = "#N/A"

End Function

que tu utilises de cette façon :

=ValeurNum(2) ou 2 est le numéro de la colonne !

si pas trouvé de valeur numérique, la fonction retourne #N/A

Bonjour,

Un exemple.

Cdlt.

3classeur1.xlsm (18.83 Ko)
Public Sub CopyValues()
Dim rng As Range, lastRow As Long, Lrow As Long
Const LMAX As Double = 9.99999999999999E+307
    With ActiveSheet
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rng = .Cells(1).Resize(lastRow, 2)
        Lrow = Application.Match(LMAX, rng.Columns(2), 1)
        .Cells(4).Value = Application.Index(rng.Columns(1), Lrow)
        .Cells(5).Value = Application.Index(rng.Columns(2), Lrow)
    End With
End Sub

Bonjour à tous,

Sub Recup()
    MsgBox Evaluate("=LOOKUP(9.99999999999999E+307,B1:B20)")
End Sub

Bonjour,

Un exemple.

Cdlt.

Classeur1.xlsm

Public Sub CopyValues()
Dim rng As Range, lastRow As Long, Lrow As Long
Const LMAX As Double = 9.99999999999999E+307
    With ActiveSheet
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rng = .Cells(1).Resize(lastRow, 2)
        Lrow = Application.Match(LMAX, rng.Columns(2), 1)
        .Cells(4).Value = Application.Index(rng.Columns(1), Lrow)
        .Cells(5).Value = Application.Index(rng.Columns(2), Lrow)
    End With
End Sub

Tous d'abord merci à tous pour les réponses et les pistes, et la réactivité.

Je vais partir sur la solution de Jean-Eric en essayant de la comprendre (éviter de recopier bêtement).

Les 2 dernières lignes de codes renvoient les résultats.

Du coup ma question va être la suivante: J'ajoute une 2ème variable en C, et si je veux l'appliquer sur cette colonne et plus sur la B, je dois changer le range je pense ou le lrow.

1classeur1.xlsm (20.21 Ko)

Re,

Une mise à jour de ce que je comprends ?

Tu préciseras !...

Cdlt.

2classeur1.xlsm (19.20 Ko)
Public Sub CopyValues()
'Déclaration des variables
Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long
Const LMAX As Double = 9.99999999999999E+307
    With ActiveSheet
        'Dernière ligne non vide colonne 1 (A)
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        'Plage de cellules variable (x lignes et 3 colonnes)
        Set rng = .Cells(1).Resize(lastRow, 3)
        'Position de la dernière valeur numérique colonne 2 (B)
        Lrow = Application.Match(LMAX, rng.Columns(2), 1)
        'Position de la dernière valeur numérique colonne 3 (C)
        lRow2 = Application.Match(LMAX, rng.Columns(3), 1)
        'Restitution des valeurs suivant position
        'Colonne 2 (B)
        .Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)
        .Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)
        'Colonne 3 (C)
        .Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)
        .Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)
    End With
End Sub

Avec les explications c'est génial merci.

Juste pour parfaitement comprendre.

Set rng = .Cells(1).Resize(lastRow, 3)

Le .cells(1) renvoie à quoi? Le lastRow, 3 je comprends mais pas le .cells(1).

Rebonjour,

Je reviens vers vous car j'ai une question.

Je voudrais exporter les résultats vers un autre classeur.

[code][/Public Sub CopyValues()

'Déclaration des variables

'Ma feuille de départ

Dim sh As Worksheet

Set bilan = ActiveSheet

Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long

Const LMAX As Double = 9.99999999999999E+307

'j'ouvre le classeur qui contient les données à rapatrier

Workbooks.Open Filename:= _

"Bob.xlsm"

With ActiveSheet

'Dernière ligne non vide colonne 1 (A)

lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

'Plage de cellules variable (x lignes et 3 colonnes)

Set rng = .Cells(1).Resize(lastRow, 3)

'Position de la dernière valeur numérique colonne 2 (B)

Lrow = Application.Match(LMAX, rng.Columns(2), 1)

'Position de la dernière valeur numérique colonne 3 (C)

lRow2 = Application.Match(LMAX, rng.Columns(3), 1)

End With

bilan.activate

With ActiveSheet

'Restitution des valeurs suivant position

'Colonne 2 (B)

.Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)

.Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)

'Colonne 3 (C)

.Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)

.Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)

End With

End Subcode]

Ca n'a pas l'air de fonctionner. Si quelqu'un peut m'aider.

Bonjour,

Essaie ceci (sans grande conviction).

Sinon Cells(1)=Cells(1,1) soit A1

A te relire.

Cdlt.

Sub CopyValues()
'Déclaration des variables
Dim sh As Worksheet
Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long
Const LMAX As Double = 9.99999999999999E+307
    'Ma feuille de départ
    Set bilan = ActiveSheet
    'j'ouvre le classeur qui contient les données à rapatrier
    Workbooks.Open Filename:="Bob.xlsm"

    With ActiveWorkbook.Worksheets("xxx")   'xxx nom de la feuille (à définir)
        'Dernière ligne non vide colonne 1 (A)
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        'Plage de cellules variable (x lignes et 3 colonnes)
        Set rng = .Cells(1).Resize(lastRow, 3)
        'Position de la dernière valeur numérique colonne 2 (B)
        Lrow = Application.Match(LMAX, rng.Columns(2), 1)
        'Position de la dernière valeur numérique colonne 3 (C)
        lRow2 = Application.Match(LMAX, rng.Columns(3), 1)
    End With

    With bilan
        'Restitution des valeurs suivant position
        'Colonne 2 (B)
        .Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)
        .Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)
        'Colonne 3 (C)
        .Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)
        .Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)
    End With

End Sub

Bonsoir Jean-Eric,

Sur mon fichier test, le code fonctionne. Je vais le tester sur des vrais données durant le week-end ou début de semaine prochaine.

Merci pour ta pédagogie.

Cordialement

Rechercher des sujets similaires à "rechercher copier derniere valeur numerique colonne"