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 :

Extraction de chaine de caractères


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Par défaut Extraction de chaine de caractères
    Bonjour,

    je me retrouve coincée avec une extraction de chaine de caractère précise.

    Je reçois par mail un texte de cette forme:

    EN COMMANDE - 3 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE
    EN COMMANDE - 25 X 65532 - SONDE FRIGO WHIRLPOOL 481221058078
    EN COMMANDE - 4 X 25641 - MODULE FOUR WHIRLPOOL 480131000053
    EN COMMANDE - 4 X 22228 - GRILLE MICRO-ONDE WHIRLPOOL 481246678434
    EN COMMANDE - 2 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE
    EN COMMANDE - 2 X 23089 - KIT SECHAGE GENTEL DRYING 481281719157
    EN COMMANDE - 1 X 20316 - THERMOSTAT FRIGO WHIRLPOOL 481927128774
    EN COMMANDE - 2 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE
    EN COMMANDE - 2 X 18661 - AQUASTOP UNIVERSEL - BEKO LV 1885090100
    ***** EN COMMANDE - 2 X 92984 - THERMOSTAT FRIGO LIEBHERR* 6151186 - 615118600 - A130417R - K59H2622 - K59L2677
    Je le copie colle dans excel. Ce qui me donne un tableau d'une seule colonne.

    Dans toutes les lignes je n'ai besoin de garder que les chiffres commençant par 48xxxxxxxxxx (toujours 12 chiffres), puis je dois garder aussi la chaine de caractère commençant par C00, et pour les autres lignes je dois juste garder la suite de chiffres ou de chiffre lettres.

    Ex:
    dans la ligne 1 je dois garder : 480131000045 et 481221458442
    dans la ligne 2 je dois garder 481221058078
    dans la ligne 9 je dois garder 1885090100
    dans la ligne 10 je dois garder 6151186 615118600 A130417R K59H2622 K59L2677

    Si je fais cela dans excel c'est que par la suite, une fois ces extractions faite, je devrais les comparer avec un autre tableau afin de savoir si ces références sont déjà passées en commande afin de ne pas commander en double.

    Alors j'ai essayé plein de truc, mais rien ne marche.

    Avez vous une idée de comment faire?

    En sachant que le nombre de lignes à traiter est aléatoire

    Merci
    Elwy

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    Un peu galère ton problème mais à mon avis, tu dois passer par le VBA

    Le nombre de ligne n'est pas spécialement un problème, cependant, sur chacune de tes lignes, tu devras lire tes informations caractères par caractères (fonctions left, right, len...) pour pouvoir récupérer tes informations.
    L'avantage, c'est que tes données semblent séparées par des espaces et/ou des "-".

    Cordialement,

  3. #3
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Par défaut
    ok, donc si je comprend bien je vais devoir pour chaque lignes de mon tableau, regarder en partant du premier caractère et voir si je trouve par exemple 48.
    Si oui a partir de la récupérer les 12 caractères, et faire de même pour C00.

    Jusque la ok, même si cela m'enchante pas trop.

    Mais il va rester un problème avec les autre références qui sont soit des chiffres ou alors des chiffres + des lettres

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici un début de piste, basé uniquement sur tes exemples

    j'ai copié ton modèle en A1, pour travailler sur la colonne 1 de la feuille

    chaque portion extraite est séparée d'une autre par un simple espace, je ne sais pas si tu voulais séparer tes portions dans des colonnes différentes

    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
    Sub Extraction()
    Dim Cell As Range
    Dim Tabl
    Dim Reponse As String
    For Each Cell In ThisWorkbook.Worksheets("Feuil1").UsedRange.Columns(1).Cells
        Reponse = ""
        Tabl = Split(Cell.Value, " ")
        For i = LBound(Tabl) To UBound(Tabl)
            ' les 48XXXXXXXXXX
            If Tabl(i) Like "48??????????" Then
                Reponse = Reponse & " " & Tabl(i)
     
            ' les C00XXXXXXXX
            ElseIf Tabl(i) Like "C00" & "*" Then
                Reponse = Reponse & " " & Tabl(i)
     
            ' les séries de chiffres et de lettres
            ElseIf Val(Mid(Tabl(i), 2)) > 0 _
            And Len(Tabl(i)) > 6 Then
                Reponse = Reponse & " " & Tabl(i)
            End If
        Next i
     
        Cell.Offset(0, 1).Value = Reponse
    Next Cell
    End Sub
    y'a largement moyen d'améliorer la chose, c'est juste une piste

  5. #5
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Par défaut
    Un grand merci, sa extrait bien les données dont j'ai besoin. Il y a juste quelques lignes ou sa marche pas (sur mon fichier complet) mais c'est pas trop grave.

    Il me resterais juste a mettre en forme la colonne de résultats

    Encore merci beaucoup pour ton aide, merci merci

    Elwy

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 842
    Par défaut
    Bonjour,

    Une piste pour extraire toutes les valeurs numériques (entiers et décimales) contenues dans une chaîne : http://silkyroad.developpez.com/VBA/...racteres/#LI-O

    Et éventuellement onglet "Donnés" = > "Convertir".

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    #If VBA7 Then
     Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As LongPtr, ByVal dwBytes As LongPtr) As Long
     Private Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
     Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As Long
     Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
     Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
     Private Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
    #Else
     Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
     Private Declare Function CloseClipboard Lib "User32" () As Long
     Private Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
     Private Declare Function EmptyClipboard Lib "User32" () As Long
     Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
     Private Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
     Private Declare Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
    #End If
    Private Const GHND = &H42
    Private Const CF_TEXT = 1
    Private Const MAXSIZE = 4096
     
     
    Sub test()
     
    Dim txt As String
    txt = "EN COMMANDE - 3 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE" & vbCrLf
    txt = txt & "EN COMMANDE - 25 X 65532 - SONDE FRIGO WHIRLPOOL 481221058078" & vbCrLf
    txt = txt & "EN COMMANDE - 4 X 25641 - MODULE FOUR WHIRLPOOL 480131000053" & vbCrLf
    txt = txt & "EN COMMANDE - 4 X 22228 - GRILLE MICRO-ONDE WHIRLPOOL 481246678434" & vbCrLf
    txt = txt & "EN COMMANDE - 2 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE" & vbCrLf
    txt = txt & "EN COMMANDE - 2 X 23089 - KIT SECHAGE GENTEL DRYING 481281719157" & vbCrLf
    txt = txt & "EN COMMANDE - 1 X 20316 - THERMOSTAT FRIGO WHIRLPOOL 481927128774" & vbCrLf
    txt = txt & "EN COMMANDE - 2 X 57679 - MODULE FOUR WHIRLPOOL 480131000045 - 481221458442 - PUISSANCE" & vbCrLf
    txt = txt & "EN COMMANDE - 2 X 18661 - AQUASTOP UNIVERSEL - BEKO LV 1885090100" & vbCrLf
    txt = txt & "***** EN COMMANDE - 2 X 92984 - THERMOSTAT FRIGO LIEBHERR* 6151186 - 615118600 - A130417R - K59H2622 - K59L2677"
    ClipBoard_SetData Replace(Replace(Replace(txt, "-", vbTab), " ", vbTab), "*", "")
    ActiveSheet.Cells.NumberFormat = "@"
    ActiveSheet.Cells(1,"A").PasteSpecial xlPasteAll
    If Trim("" & ActiveSheet.Cells(Cells.Rows.Count, "B").End(xlUp).Offset(0, -1)) = "" Then ActiveSheet.Cells(Cells.Rows.Count, "B").End(xlUp).Offset(0, -1).Delete Shift:=xlToLeft
     
    End Sub
    Function ClipBoard_GetData() As String
       Dim hClipMemory As Long
       Dim lpClipMemory As Long
       Dim MyString As String
       Dim RetVal As Long
     
       If OpenClipboard(0&) = 0 Then
          MsgBox "Cannot open Clipboard. Another app. may have it open"
          Exit Function
       End If
     
       ' Obtain the handle to the global memory
       ' block that is referencing the text.
       hClipMemory = GetClipboardData(CF_TEXT)
       If IsNull(hClipMemory) Then
          MsgBox "Could not allocate memory"
          GoTo OutOfHere
       End If
     
       ' Lock Clipboard memory so we can reference
       ' the actual data string.
       lpClipMemory = GlobalLock(hClipMemory)
     
       If Not IsNull(lpClipMemory) Then
          MyString = Space$(MAXSIZE)
          RetVal = lstrcpy(MyString, lpClipMemory)
          RetVal = GlobalUnlock(hClipMemory)
     
          ' Peel off the null terminating character.
          MyString = Mid(MyString, 1, InStr(1, MyString, Chr$(0), 0) - 1)
       Else
          MsgBox "Could not lock memory to copy string from."
       End If
     
    OutOfHere:
     
       RetVal = CloseClipboard()
       ClipBoard_GetData = MyString
     
    End Function
    Function ClipBoard_SetData(MyString As String)
       Dim hGlobalMemory As Long, lpGlobalMemory As Long
       Dim hClipMemory As Long, X As Long
     
       ' Allocate moveable global memory.
       '-------------------------------------------
       hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
     
       ' Lock the block to get a far pointer
       ' to this memory.
       lpGlobalMemory = GlobalLock(hGlobalMemory)
     
       ' Copy the string to this global memory.
       lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
     
       ' Unlock the memory.
       If GlobalUnlock(hGlobalMemory) <> 0 Then
          MsgBox "Could not unlock memory location. Copy aborted."
          GoTo OutOfHere2
       End If
     
       ' Open the Clipboard to copy data to.
       If OpenClipboard(0&) = 0 Then
          MsgBox "Could not open the Clipboard. Copy aborted."
          Exit Function
       End If
     
       ' Clear the Clipboard.
       X = EmptyClipboard()
     
       ' Copy the data to the Clipboard.
       hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
     
    OutOfHere2:
     
       If CloseClipboard() = 0 Then
          MsgBox "Could not close Clipboard."
       End If
     
       End Function
    Dernière modification par Invité ; 28/01/2016 à 13h06.

  8. #8
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Par défaut
    Merci modus57 pour le lien, très intéressant.

    Par contre rdurupt pourquoi mettre le texte à traiter dans le code? Il change tous les jours.

  9. #9
    Invité
    Invité(e)
    Par défaut
    j'avais bien besoin d'un exemple! tu replace txt par le contenu de ton fichier et là ça gère l’import par la même occasion!
    Dernière modification par AlainTech ; 31/01/2016 à 17h30. Motif: Suppression de la citation inutile

  10. #10
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Par défaut
    ok.

    Merci a vous tous j'ai réussi à m'en sortir avec toutes vos idées.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Perl- probléme d'extraction de chaine de caractères
    Par shad797 dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2009, 14h43
  2. extractions de chaines de caractères
    Par mouaa dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/12/2007, 13h19
  3. extraction dernière chaine de caractères
    Par m93.fred dans le forum Excel
    Réponses: 3
    Dernier message: 05/12/2007, 15h19
  4. Extraction dans chaine de caractères variable
    Par ginkas31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/08/2007, 17h27
  5. Extraction de chaine de caractères
    Par asterix76-rouen dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 23h17

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