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

Y compris Power BI, Power Query et toute autre question en lien avec Excel
G
Guizmonster
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 22 juillet 2018
Version d'Excel : 2013 fr

Message par Guizmonster » 9 juin 2019, 09:21

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.jpg
W6oSQeK.jpg (14.07 Kio) Vu 13 fois
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.
Classeur1.xlsm
(15.58 Kio) Téléchargé 4 fois
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 421
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 9 juin 2019, 09:38

Bonjour,

:bv:

Ci-joint ton fichier test ...

En espèrant que cela t'aide
Test Guizmonster.xlsx
(11.45 Kio) Téléchargé 5 fois
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
G
Guizmonster
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 22 juillet 2018
Version d'Excel : 2013 fr

Message par Guizmonster » 9 juin 2019, 09:44

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.
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'019
Appréciations reçues : 306
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 9 juin 2019, 09:44

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
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'712
Appréciations reçues : 702
Inscrit le : 27 août 2012
Version d'Excel : 365 Personnel

Message par Jean-Eric » 9 juin 2019, 09:48

Bonjour,
Un exemple.
Cdlt.
Classeur1.xlsm
(18.83 Kio) Téléchargé 3 fois
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
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 421
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 9 juin 2019, 10:00

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

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
G
Guizmonster
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 22 juillet 2018
Version d'Excel : 2013 fr

Message par Guizmonster » 9 juin 2019, 10:35

Jean-Eric a écrit :
9 juin 2019, 09:48
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.
Classeur1.xlsm
(20.21 Kio) Téléchargé 1 fois
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'712
Appréciations reçues : 702
Inscrit le : 27 août 2012
Version d'Excel : 365 Personnel

Message par Jean-Eric » 9 juin 2019, 10:51

Re,
Une mise à jour de ce que je comprends ?
Tu préciseras !...
Cdlt.
Classeur1.xlsm
(19.2 Kio) Téléchargé 2 fois
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
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
G
Guizmonster
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 22 juillet 2018
Version d'Excel : 2013 fr

Message par Guizmonster » 9 juin 2019, 11:07

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).
G
Guizmonster
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 22 juillet 2018
Version d'Excel : 2013 fr

Message par Guizmonster » 14 juin 2019, 15:56

Rebonjour,

Je reviens vers vous car j'ai une question.
Je voudrais exporter les résultats vers un autre classeur.
[/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.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message