IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupération de données particulières dans une cellule ou plusieurs avant des les additionner.


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut Récupération de données particulières dans une cellule ou plusieurs avant des les additionner.
    Bonjour la communauté.

    Voici mon problème. J'ai des cases situées à différents endroits dans une feuille Excel.
    Chaque case contient ce genre de texte :

    08H00
    1- CHAT
    3,5FH 2FC
    3 LG
    11H30

    J'aimerai pouvoir sélectionner différentes cases et additionner chaque valeurs d'une unité ensemble, c'est à dire tous les FH, tous les FC et tous les LG.
    Actuellement j'ai une macro qui me permet d'extraire les chiffres, j'obtiens en résultat ceci dans une MsgBox (en prenant l'exemple de la case contenant les données ci-dessus) :

    8
    0
    1
    3,5
    2
    3
    11
    30

    Au final, je ne sais pas dire à Excel que seul les chiffres 3,5, 2 et 3 m'intéressent. Et qui plus est, en extraire plusieurs et les additionner.
    Sachant que mes cellules auront toujours les marqueurs FH, FC et LG, je me dis que la solution est peut-être là.
    En disant à Excel, prend le chiffres juste avant le marqueur, met le dans un coin et additionne le avec tous ceux dont j'ai sélectionné les cellules de ma feuille.
    Merci à vous pour votre contribution.

    NOTA : seule la valeur en FH peut avoir une virgule (ou pas). Pour les deux autres marqueurs se sont des valeurs entières.

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Essayez ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Option Explicit
     
    Sub Recup()
        Dim i As Long, j As Long
        Dim Cell As Range
        Dim Parametre As String, Valeur As String
        Dim Total As Double
        Application.ScreenUpdating = False
        For Each Cell In Selection
            On Error Resume Next
            For j = 1 To 3 'tester tous les paramètres
                Parametre = Choose(j, "FH", "FC", "LG") 'choix du paramètre
                If InStr(1, Cell, Parametre, 1) > 0 Then 'détection de la position du paramètre
                    For i = InStr(1, Cell, Parametre, 1) - 1 To 1 Step -1
                        If i <> InStr(1, Cell, Parametre, 1) - 1 Or Mid(Cell, InStr(1, Cell, Parametre, 1) - 1, 1) <> " " Then
                            If Mid(Cell, i, 1) <> " " Then
                                Valeur = Mid(Cell, i, 1) & Valeur
                            Else
                                GoTo Resultat
                            End If
                        End If
                    Next i
                End If
    Resultat:
                Total = Total + Valeur * 1
                Valeur = ""
            Next j
        Next
        MsgBox "Total=" & Total
    End Sub
    Cdlt

  3. #3
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Bonsoir ARTURO83

    Merci pour ce retour,
    Après essai, voilà comment réagit votre procédure.
    Si je prends le cas de deux cellules distinctes comme suit :

    08H00
    1- CHAT
    3,5FH 2FC
    3 LG
    11H30

    Et

    10H00
    1- CHIEN
    2FH 4FC
    7 LG
    13H30

    Le résultat renvoyé est 6. Ce chiffre correspond à la somme des deux valeurs FC: 2+4
    Je suis agréablement surpris par ce retour. Je vous avoue continuer à tenter de comprendre comment vous en êtes arrivé là.
    Mais je vais y arriver, promis ! 😉

    Il manque cependant dans le résultat, la somme des FH: 3,5+2 = 5,5 et des LG: 3+7 = 10

    De plus si je venais à insérer un espace après le mot FC ou encore après le mot CHIEN ou CHAT, alors là, le résultat est celui de la somme des FH.
    En tout cas merci pour ce premier jet qui me permet d’avoir sur une première base.

    Bien à vous 👍🏻

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonsoir,

    Je crois qu'il y a un problème de compréhension, pour moi, ce qui suit était dans 5 cellules différentes (faites l'essai comme je l'avais compris)

    08h00
    1- CHAT
    3,5FH 2FC
    3 LG
    11H30

    or il semblerait qu'en réalité, cela tienne dans une seule cellule, d'où évidemment, un résultat erroné, je regarderai plus tard ce qu'il y a lieu et ce qu'il est possible de faire.


    Cdlt

  5. #5
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    En effet je me suis certainement mal exprimé.

    Mais je confirme votre retour. Ces lignes sont écrites dans une seules cellules à chaque fois.
    Un grand merci pour votre soutien. Ça aide à avancer.
    Un jour j’espère aider à mon tour.

    Un grand merci pour votre temps passé et naturellement au plaisir de vous lire 👍🏻

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Voilà le 2ème jet avec une petite modification de la précédente proposition.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Option Explicit
     
    Sub Recup()
        Dim i As Long, j As Long, k As Long
        Dim Cell As Range
        Dim Parametre As String, Valeur As String
        Dim Item As Variant
        Dim Total As Double
     
        Application.ScreenUpdating = False
        For Each Cell In Selection
            On Error Resume Next
            Item = Split(Chr(10) & Cell, Chr(10)) 'isoler chaque ligne de la cellule
            For k = 1 To UBound(Item)
                For j = 1 To 3 'tester tous les paramètres
                    Parametre = Choose(j, "FH", "FC", "LG") 'choix du paramètre
                    If InStr(1, Item(k), Parametre, 1) > 0 Then 'détection de la position du paramètre
                        For i = InStr(1, Item(k), Parametre, 1) - 1 To 1 Step -1
                            If i <> InStr(1, Item(k), Parametre, 1) - 1 Or Mid(Item(k), InStr(1, Item(k), Parametre, 1) - 1, 1) <> " " Then
                                If Mid(Item(k), i, 1) <> " " Then
                                    Valeur = Mid(Item(k), i, 1) & Valeur
                                Else
                                    GoTo Resultat
                                End If
                            End If
                        Next i
                    End If
    Resultat:
                    Total = Total + Valeur * 1
                    Valeur = ""
                Next j
            Next k
        Next
        MsgBox "Total=" & Total
    End Sub

    Cdlt

  7. #7
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Petit retour quant à votre dernier post.
    Il s’avère qu’avec cette solution, je me suis aperçu que les FH et FC de chaque cellules étaient comptabilisés ensembles.
    Avec la solution ci-dessous, j’obtiens le résultat escompté, c’est à dire la somme de chaque compteur distincts dans un MsgBox. .
    Mais hélas je trouve cela impropre.
    Je m’explique.
    La répétition des boucles et l’intégration de trois recherches différentes sur trois données FH, FC puis LDG me semble rébarbative. J’ai du me débarrasser de la boucle For j = 1 To 3 qui semblait pourtant prometteuse.
    Pour moi qui suis novice il y a trop de paramètres.
    Et pourtant, je suis sur qu’on peut imbriquer ces trois boucles répétitives ! 🤔
    Merci pour votre aide et qui sait une suite à tout cela 👍🏻

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Sub Recup()
        Dim i As Long, j As Long, k As Long
        Dim Cell As Range
        Dim ParametreFH As String, ParametreFC As String, ParametreLDG As String, ValeurFH As String, ValeurFC As String, ValeurLDG As String
        Dim Item As Variant
        Dim TotalFH As Double, TotalFC As Double, TotalLDG As Double
     
     
        Application.ScreenUpdating = False
        For Each Cell In Selection
     
            On Error Resume Next
            Item = Split(Chr(10) & Cell, Chr(10)) 'isoler chaque ligne de la cellule
     
            For k = 0 To UBound(Item)
     
                    If InStr(1, Item(k), "FH", 1) > 0 Then 'détection de la position du paramètre FH
                        For i = InStr(1, Item(k), "FH", 1) - 1 To 1 Step -1
                            If i <> InStr(1, Item(k), "FH", 1) - 1 Or Mid(Item(k), InStr(1, Item(k), "FH", 1) - 1, 1) <> " " Then
                                If Mid(Item(k), i, 1) <> " " Then
                                    ValeurFH = Mid(Item(k), i, 1) & ValeurFH
                                    Else
                                    GoTo Resultat
                                End If
                            End If
                        Next i
                    End If
     
                   If InStr(1, Item(k), "FC", 1) > 0 Then 'détection de la position du paramètre FC
                        For j = InStr(1, Item(k), "FC", 1) - 1 To 1 Step -1
                            If j <> InStr(1, Item(k), "FC", 1) - 1 Or Mid(Item(k), InStr(1, Item(k), "FC", 1) - 1, 1) <> " " Then
                                If Mid(Item(k), j, 1) <> " " Then
                                    ValeurFC = Mid(Item(k), j, 1) & ValeurFC
                                    Else
                                    GoTo Resultat
                                End If
                            End If
                        Next j
                    End If
     
                   If InStr(1, Item(k), "LDG", 1) > 0 Then 'détection de la position du paramètre FC
                        For m = InStr(1, Item(k), "LDG", 1) - 1 To 1 Step -1
                            If j <> InStr(1, Item(k), "LDG", 1) - 1 Or Mid(Item(k), InStr(1, Item(k), "LDG", 1) - 1, 1) <> " " Then
                                If Mid(Item(k), m, 1) <> " " Then
                                    ValeurLDG = Mid(Item(k), m, 1) & ValeurLDG
                                    Else
                                    GoTo Resultat
                                End If
                            End If
                        Next m
                    End If
     
    Resultat:
                TotalFH = TotalFH + ValeurFH * 1
                ValeurFH = ""
                TotalFC = TotalFC + ValeurFC * 1
                ValeurFC = ""
                TotalLDG = TotalLDG + ValeurLDG * 1
                ValeurLDG = ""
     
            Next k
        Next
     
        MsgBox "Total=" & TotalFH & " FH" & " " & TotalFC & " FC" & " " & TotalLDG & " LDG"
     
    End Sub

  8. #8
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonsoir,

    J'avais crû comprendre que vous vouliez une somme de l'ensemble de tous les éléments, j'ai mal interprété votre demande. Là je n'ai pas le temps, je regarderai plus tard les améliorations à apporter à votre code.

    Cdlt

  9. #9
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Pas de soucis.

    C’est déjà tellement sympa à vous de m’offrir de votre temps sans pouvoir apporter à mon tour.
    Donc pas de presse et à votre rythme 🙂

    Mais ça fait plaisir d’appendre 🙏

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Peux-tu préciser ta version d'Excel?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Sub Recup()
        Dim i As Long, j As Long, k As Long
        Dim Cell As Range
        Dim Parametre As String, Valeur As String
        Dim Item As Variant
        Dim TotalFH As Double, TotalFC As Double, TotalLDG As Double
     
        Application.ScreenUpdating = False
        For Each Cell In Selection
            On Error Resume Next
            Item = Split(Chr(10) & Cell, Chr(10)) 'isoler chaque ligne de la cellule
     
            For k = 0 To UBound(Item)
                For j = 1 To 3 'tester tous les paramètres
                    Parametre = Choose(j, "FH", "FC", "LG") 'choix du paramètre
                    If InStr(1, Item(k), Parametre, 1) > 0 Then 'détection de la position du paramètre FH
                        For i = InStr(1, Item(k), Parametre, 1) - 1 To 1 Step -1
                            If i <> InStr(1, Item(k), Parametre, 1) - 1 Or Mid(Item(k), InStr(1, Item(k), Parametre, 1) - 1, 1) <> " " Then
                                If Mid(Item(k), i, 1) <> " " Then Valeur = Mid(Item(k), i, 1) & Valeur Else GoTo Resultat
                            End If
                        Next i
                    End If
     
    Resultat:
                    Select Case j
                        Case 1
                            TotalFH = TotalFH + Valeur * 1
                        Case 2
                            TotalFC = TotalFC + Valeur * 1
                        Case 3
                            TotalLDG = TotalLDG + Valeur * 1
                    End Select
                    Valeur = ""
                Next j
            Next k
        Next
     
        MsgBox "Total=" & TotalFH & " FH" & " " & TotalFC & " FC" & " " & TotalLDG & " LDG"
    End Sub

    Cdlt

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Est-ce normal que LG soit séparé de sa valeur par un espace?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Sub Recup()
        Dim i As Long, j As Long, k As Long
        Dim Cell As Range
        Dim Parametre As String, Valeur As String
        Dim Item As Variant
        Dim TotalFH As Double, TotalFC As Double, TotalLDG As Double
     
        Application.ScreenUpdating = False
        For Each Cell In Selection
            On Error Resume Next
            Item = Split(Chr(10) & Cell, Chr(10)) 'isoler chaque ligne de la cellule
     
            For k = 0 To UBound(Item)
                For j = 1 To 3 'tester tous les paramètres
                    Parametre = Choose(j, "FH", "FC", "LG") 'choix du paramètre
                    If InStr(1, Item(k), Parametre, 1) > 0 Then 'détection de la position du paramètre FH
                        For i = InStr(1, Item(k), Parametre, 1) - 1 To 1 Step -1
                            If i <> InStr(1, Item(k), Parametre, 1) - 1 Or Mid(Item(k), InStr(1, Item(k), Parametre, 1) - 1, 1) <> " " Then
                                If Mid(Item(k), i, 1) <> " " Then Valeur = Mid(Item(k), i, 1) & Valeur Else GoTo Resultat
                            End If
                        Next i
                    End If
     
    Resultat:
                    Select Case j
                        Case 1
                            TotalFH = TotalFH + Valeur * 1
                        Case 2
                            TotalFC = TotalFC + Valeur * 1
                        Case 3
                            TotalLDG = TotalLDG + Valeur * 1
                    End Select
                    Valeur = ""
                Next j
            Next k
        Next
     
        MsgBox "Total=" & TotalFH & " FH" & " " & TotalFC & " FC" & " " & TotalLDG & " LDG"
    End Sub

    Cdlt
    Je teste ARTURO et je vous tiens au courant ce soir.

    Bonne journée.

  14. #14
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    voici une solution en utilisant les expressions régulières. Il faut sélectionner les cellules à prendre en compte avant de lancer la macro.
    Voici le code pour capturer toutes les variables en une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub TestTonyCaptureAllInOne()
        Dim RegEx, REMatches, Cell, Res As Object
        Dim Texte, FH, FC, LG
        Set RegEx = CreateObject("vbscript.regexp")
        With RegEx
            .Global = True
            .IgnoreCase = False
            ' Motif
            .Pattern = "([0-9,]+)FH\s+([0-9,]+)FC\s+([0-9,]+)\s+LG"
        End With
        For Each Cell In Selection
            Texte = Cell.value
            Set REMatches = RegEx.Execute(Texte)
            If REMatches.Count > 0 Then
                For Each Res In REMatches
                    Debug.Print "FH=" & CStr(Res.SubMatches(0))
                    FH = FH + CDbl(Res.SubMatches(0))
                    Debug.Print "FC=" & CStr(Res.SubMatches(1))
                    FC = FC + CDbl(Res.SubMatches(1))
                    Debug.Print "LG=" & CStr(Res.SubMatches(2))
                    LG = LG + CDbl(Res.SubMatches(2))
                Next
            End If
        Next
        Debug.Print "Total=" & CStr(FH) & " FH" & " - " & CStr(FC) & " FC" & " - " & CStr(LG) & " LDG"
        MsgBox "Total=" & CStr(FH) & " FH" & " - " & CStr(FC) & " FC" & " - " & CStr(LG) & " LDG"
    End Sub
    Explication du motif (Pattern) : ([0-9,]+)FH\s+([0-9,]+)FC\s+([0-9,]+)\s+LG
    Les parenthèses permettent de capturer un groupe : il y a donc 3 groupes dans ce motif.
    ([0-9,]+)FH\s+ : on capture les chiffres et virgule (au moins 1 (+) ) collé à FH suivi par un ou plusieurs caractères d'espacement ou retour chariot ( \s (au moins 1 (+))
    les autres groupes sont similaires.
    Si les groupes ne s'enchaînent pas toujours de la même façon, il faut les capturer 1 par 1 comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub TestTonyCaptureOneByOne()
        Dim RegEx, REMatches, Cell, Res As Object
        Dim Texte, FH, FC, LG
        Set RegEx = CreateObject("vbscript.regexp")
        With RegEx
            .Global = True
            .IgnoreCase = False
        End With
        For Each Cell In Selection
            Texte = Cell.value
            RegEx.Pattern = "([0-9,]+)FH\s+"
            Set REMatches = RegEx.Execute(Texte)
            If REMatches.Count > 0 Then
                For Each Res In REMatches
                    Debug.Print Res.SubMatches(0)
                    FH = FH + CDbl(Res.SubMatches(0))
                Next
            End If
            Debug.Print "FH = " & CStr(FH)
            RegEx.Pattern = "FH\s+([0-9,]+)FC\s+"
            Set REMatches = RegEx.Execute(Texte)
            If REMatches.Count > 0 Then
                For Each Res In REMatches
                    Debug.Print Res.SubMatches(0)
                    FC = FC + CDbl(Res.SubMatches(0))
                Next
            End If
            Debug.Print "FC = " & CStr(FC)
            RegEx.Pattern = "\s+([0-9,]+)\s+LG"
            Set REMatches = RegEx.Execute(Texte)
            If REMatches.Count > 0 Then
                For Each Res In REMatches
                    Debug.Print Res.SubMatches(0)
                    LG = LG + CDbl(Res.SubMatches(0))
                Next
            End If
            Debug.Print "LG = " & CStr(LG)
        Next
        Debug.Print "Total=" & CStr(FH) & " FH" & " - " & CStr(FC) & " FC" & " - " & CStr(LG) & " LDG"
        MsgBox "Total=" & CStr(FH) & " FH" & " - " & CStr(FC) & " FC" & " - " & CStr(LG) & " LDG"
    End Sub

    Ami calmant, J.P

  15. #15
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Pour ARTURO83.

    Merci pour ton dernier post 😉
    Ça fonctionne nickel. Joliment écrit, c’est propre comme tout. Encore un grand bravo et un immense merci.

    Petit NOTA :
    J’ai un petit supplément à demander.
    Dans les cellules cités, il y a une demande et un résultat attendu chaque fois. Je m’explique.
    Après chaque événement effectué (car chaque cellule correspond à un événement attendu), on retrouve un résultat dans ladite cellule comme suit :

    08H30
    3-CHAT
    4,5FH 3FC
    5LDG
    11H30

    2h45 2FC
    4LDG

    Ces deux dernières lignes sont le résultat.

    Le fait de rajouter dans cette cellule des valeurs 2FC et 4LDG, ceux sont ces nouvelles valeurs qu’il faut prendre en compte et non plus les 3FC et 5LDG du départ.

    Comment puis-je dire à EXCEL que s’il n’y a pas de résultat, tu prends les premiers FC et FH et s’il y a un résultat, tu prends les nouvelles valeurs FC et LDG située à la fin dans la cellule ?

    Je sais c’est chaud 🥵 mais j’ai grenouillé toute la journée sans hélas avoir une once de début d’idée 🤔

    Sinon encore une fois, job au poil. Merci Arturo

  16. #16
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Pour Jurrassik Pork.

    Hélas cela ne fonctionne pas. J’ai la formule qui s’affiche à la fin mais sans les résultats. Les sommes ne sont donc pas effectuées.

    Merci quand même.

  17. #17
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 51
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Est-ce normal que LG soit séparé de sa valeur par un espace?
    Bonsoir Pierre.

    EXCEL 2007

  18. #18
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Sub Recup3()
        Dim i As Long, j As Long, k As Long
        Dim Cell As Range
        Dim Parametre As String, Valeur As String
        Dim Item As Variant, Plage As String
        Dim TotalFH As Double, TotalFC As Double, TotalLDG As Double
     
        Application.ScreenUpdating = False
        For Each Cell In Selection
            On Error Resume Next
            If InStr(1, Cell, Chr(10) & Chr(10), 1) > 0 Then   'Détection de la présence de 2 retours chariots consécutifs
                Plage = Mid(Cell, InStr(1, Cell, Chr(10) & Chr(10), 1) + 2, Len(Cell) - InStr(1, Cell, Chr(10) & Chr(10), 1))
                Item = Split(Chr(10) & Plage, Chr(10)) 'ne retenir que les lignes "résultat"
                For k = 0 To UBound(Item)
                    For j = 1 To 3 'tester tous les paramètres
                            Parametre = Choose(j, "FC", "LDG") 'choix du paramètre
                        If InStr(1, Item(k), Parametre, 1) > 0 Then 'détection de la position du paramètre FH, FC ou LG
                            For i = InStr(1, Item(k), Parametre, 1) - 1 To 1 Step -1
                                If i <> InStr(1, Item(k), Parametre, 1) - 1 Or Mid(Item(k), InStr(1, Item(k), Parametre, 1) - 1, 1) <> " " Then
                                    If Mid(Item(k), i, 1) <> " " Then Valeur = Mid(Item(k), i, 1) & Valeur Else GoTo Resultat1
                                End If
                            Next i
                        End If
     
    Resultat1:
                        Select Case j
                            Case 1
                                TotalFC = TotalFC + Valeur * 1
                            Case 2
                                TotalLDG = TotalLDG + Valeur * 1
                        End Select
                        Valeur = ""
                    Next j
                Next k
     
            Else
                Item = Split(Chr(10) & Cell, Chr(10)) 'isoler chaque ligne de la cellule
                For k = 0 To UBound(Item)
                    For j = 1 To 3 'tester tous les paramètres
                            Parametre = Choose(j, "FH", "FC", "LG") 'choix du paramètre
                        If InStr(1, Item(k), Parametre, 1) > 0 Then 'détection de la position du paramètre FH, FC ou LG
                            For i = InStr(1, Item(k), Parametre, 1) - 1 To 1 Step -1
                                If i <> InStr(1, Item(k), Parametre, 1) - 1 Or Mid(Item(k), InStr(1, Item(k), Parametre, 1) - 1, 1) <> " " Then
                                    If Mid(Item(k), i, 1) <> " " Then Valeur = Mid(Item(k), i, 1) & Valeur Else GoTo Resultat2
                                End If
                            Next i
                        End If
     
    Resultat2:
                        Select Case j
                            Case 1
                                TotalFH = TotalFH + Valeur * 1
                            Case 2
                                TotalFC = TotalFC + Valeur * 1
                            Case 3
                                TotalLDG = TotalLDG + Valeur * 1
                        End Select
                        Valeur = ""
                    Next j
                Next k
            End If
        Next
     
        MsgBox "Total=" & TotalFH & " FH" & " " & TotalFC & " FC" & " " & TotalLDG & " LDG"
    End Sub
    Quant à la proposition de jurassic pork, elle fonctionne bien, et à ce propos je voudrais préciser ceci, j'avais pensé aussi à l'utilisation des expressions régulières mais n'ayant pas encore suffisamment de maîtrise sur cette technique, je me suis contenté de faire un travail à l'ancienne, je dis ça parce que, lorsque je vois qu'on a gentiment affublé ma proposition d'un -1 (alors que cela fonctionne bien et que cela satisfait le demandeur), de par le fait que je n'ai pas utilisé les outils les plus performants, je trouve cela un peu injuste et surtout décourageant.
    A mes yeux, l'important c'est d'avoir essayer de donner un coup de main, rien n'empêche quiconque de faire une proposition bien meilleure sans dénigrer l'effort fourni par d'autres.
    Je n'ai rien contre les dernières avancées techniques, bien au contraire, mais ce n'est pas parce qu'on a un GPS dans sa voiture qu'on doit jeter les cartes routières et j'ajouterai que les trop bons outils, ça facilite tellement la vie qu'on fini par ne plus se creuser les méninges, mais ce n'est que mon avis.

    Cdlt

  19. #19
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    Citation Envoyé par ARTURO83 Voir le message
    Quant à la proposition de jurassic pork, elle fonctionne bien, et à ce propos je voudrais préciser ceci, j'avais pensé aussi à l'utilisation des expressions régulières mais n'ayant pas encore suffisamment de maîtrise sur cette technique, je me suis contenté de faire un travail à l'ancienne, je dis ça parce que, lorsque je vois qu'on a gentiment affublé ma proposition d'un -1 (alors que cela fonctionne bien et que cela satisfait le demandeur), de par le fait que je n'ai pas utilisé les outils les plus performants, je trouve cela un peu injuste et surtout décourageant.
    Il a raison ARTURO83, chacun répond avec ses connaissances et le but principal c'est de donner à disposition du demandeur une solution à son problème. Il y a du temps investi dans la recherche de la solution alors mettre un -1 pour une solution qui fonctionne c'est franchement injuste. Dans la même lignée de choses qui ne sont pas très cools, il y a les demandeurs qui ignorent ou ne s'intéressent pas à des solutions proposées sans en indiquer la raison, ceux qui ne répondent pas aux questions posées par un intervenant, et il y a aussi ceux qui ne remercient pas et en demandent toujours plus.
    Ami calmant, J.P

Discussions similaires

  1. [XL-2007] Problème Macro. Récupération de l'année dans une cellule
    Par PC1967 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2010, 11h08
  2. Insérer une donnée RTF dans une cellule de tableau
    Par HomoErectus dans le forum VBA Word
    Réponses: 6
    Dernier message: 14/08/2009, 14h00
  3. Récuperer donnée MySQL dans une cellule
    Par me-to-you93 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2008, 12h58
  4. Récupération de données javascript dans une variable PHP
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/05/2006, 15h23
  5. Récupération de données validées dans une pop-up
    Par hdd dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo