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 :

Extraire une chaîne de caractères dans une macro EXCEL


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut Extraire une chaîne de caractères dans une macro EXCEL
    Bonjour à tous,

    Dans ma macro, j'ai une variable Fichier qui contient cette valeur:
    "D:\A graver\Catalogue France"\Bacchus_Dispo_France.xls"

    A partir de là, j'aimerais récupérer "Bacchus" dans une autre variable que l'on pourrait appeler Pseudo.

    J'ai bien essayé, mais je n'y arrive pas.

    Si qqn a les quelques lignes de code pour le faire, cela m'arrangerait.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Réponse lorsque tu auras bien voulu (c'est un minimum) prendre le soin de mettre ici un copié/collé de ton vrai code.
    "D:\A graver\Catalogue France"\Bacchus_Dispo_France.xls"
    ne saurait en aucun cas être sous VBA l'expression d'une chaîne de caractères.

    PS :
    J'ai bien essayé, mais je n'y arrive pas.
    Montre donc ce que tu as "essayé" .

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, une occasion de lire et pratiquer : Manipuler les chaînes de caractères en VB6 et VBA Excel

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut
    Bonjour à tous (sauf vous 2),

    J'ai trouvé tout seul...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fichier = "D:\A graver\Catalogue France"\Bacchus_Dispo_France.xls"
     
        I = InStrRev(Fichier, "\")
        J = InStr(Fichier, "_")
        Pseudo = Mid(Fichier, I + 1, J - I - 1)
    Et dans la foulée, j'ai même pu récupérer le nom du Pays

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        I = InStrRev(Fichier, "_")
        J = InStr(Fichier, ".xls")
        Pays = Mid(Fichier, I + 1, J - I - 1)
    J'ai fait carrière au Chemin de Fer (Je n'ose plus dire "SNCF") où j'ai pratiqué le métier d'agent-circulation où il faut tout de même avoir l'esprit carré.
    Lorsqu'on ne respectait pas les procédures, ce n'était pas un simple "Bug" qui pouvait arriver et on ne manquait pas de nous le rappeler à chaque occasion.
    Durant ce grand nombre d'années, j'ai pu fréquenter de temps à autres quelques informaticiens sur lesquels je me suis fait une petite idée.
    Néanmoins, intéressé par l'informatique, j'essaie d'apprendre et je ne suis donc qu'un autodidacte mais persévérant.
    Je vois que mon préjugé sur votre caste n'était pas infondé...

    Merci encore aux 2 "experts éminemment seniors" de m'avoir aidé...

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Incroyable, mais vrai --->>
    tu insistes avec cette ineptie en dépit de ce qui t'a été dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier = "D:\A graver\Catalogue France"\Bacchus_Dispo_France.xls"
    Bonjour à tous (sauf vous 2),
    tu peux le garder, ton "bonjour". Il ne m'intéresse pas du tout
    Je vois que mon préjugé sur votre caste n'était pas infondé...
    En ce qui concerne le regard que je pose sur certains dans certains cas : ce n'est pas du tout un "préjugé", mais le résultat de constats.
    Bonne chance, donc.

  6. #6
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à lire

    J'ai fait carrière au Chemin de Fer (Je n'ose plus dire "SNCF") où j'ai pratiqué le métier d'agent-circulation ...
    Moi aussi dans un bureau d'étude du département signalisation à PMP, mais moi j'ai démissionné au bout de 2 ans ...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut
    Citation Envoyé par unparia Voir le message
    Incroyable, mais vrai --->>
    tu insistes avec cette ineptie en dépit de ce qui t'a été dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier = "D:\A graver\Catalogue France"\Bacchus_Dispo_France.xls"
    Sur le fond, bien sûr que si:

    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
        ' On sélectionne la dispoliste du correspondant
    Fichier = "Vrai"
    MsgBox "Sélectionnez la dispoliste de votre correspondant dans la boîte de dialogue qui va s 'ouvrir.", vbOKOnly, "Recherche Dispoliste - " & Pays & " -"
    Fichier = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
    Workbooks.Open Fichier
        If Fichier = "Faux" Then
        MsgBox "Pas de fichier trouvé!", vbExclamation + vbOKOnly, "Fichier inexistant!"
        Exit Sub
        End If
        If ActiveWorkbook.Sheets(2).Cells(1, 1) <> "LISTE TIMBRES" Then
        MsgBox "Opération abandonnée!", vbExclamation + vbOKOnly, "Fichier sélectionné invalide!"
        ActiveWorkbook.Close SaveChanges:=False
        Exit Sub
        End If
     
        I = InStrRev(Fichier, "\")
        J = InStr(Fichier, "_")
        Pseudo0 = Mid(Fichier, I + 1, J - I - 1)
    La valeur qui est qui est retournée dans la variable "Fichier" (Quand on a sélectionné le Bon fichier) est bien de ce style...
    Et cela fonctionne...

  8. #8
    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.

    Je propose une autre solution par les RegExp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ExtractPseudoCountry()
      Dim RegExp As Object, Matches As Object
      Dim Filename As String
     
      Set RegExp = CreateObject("VBScript.RegExp")
      RegExp.Pattern = "\\(\w+)(?:_\w+_)(\w+)\.(?:\w+)$"
      Set Matches = RegExp.Execute("D:\A graver\Catalogue France\Bacchus_Dispo_France.xls")
      Debug.Print "Pseudo: " & Matches(0).SubMatches(0)
      Debug.Print "Pays: " & Matches(0).SubMatches(1)
    End Sub
    Et si tu peux avoir autre chose que des lettres/chiffres dans le pseudo ou le pays, tu modifies simplement le pattern, par exemple comme ceci "\\([^\\]+)(?:_[^\\]+_)([^\\]+)\.(?:[^\\]+)$"


    Explications du pattern présenté dans le code

    Le $ à la fin du pattern spécifie que c'est la fin de la chaîne qui doit correspondre au pattern. Après avoir fixé cela, on lit les symboles de gauche à droite pour tester la fin de la chaine:
    • \\ signifie que la fin de chaîne doit commencer par \ (on le double pour qu'il soit considéré comme sa valeur littérale car c'est un méta caractère);
    • (\w+) signifie qu'on va extraire un premier groupe qui sera renvoyé dans Matches. \w signifie une lettre non accentuée ou un chiffre. + signifie au moins une fois. Les parenthèses forment le groupe. Dans le cas présent, c'est le groupe du pseudo;
    • (?:_\w+_) signifie la création d'un deuxième groupe qui ne sera pas envoyé dans Matches (à cause du ?: en début de groupe). Ce groupe doit commencer par _ puis doit contenir uniquement des lettres non accentuées ou des chiffres { signification de \w } et doit en contenir au moins un de ces caractères { signification de + } puis se terminer par _ Dans le cas présent, il permet d'isoler le statut;
    • (\w+) déjà vu plus haut. C'est le troisième groupe du pattern. Il sera renvoyé dans le Matches. Dans le cas présent, il représente le pays;
    • \. signifie le point. Il est échappé car c'est un méta caractère. L'échappement lui attribue sa valeur littérale et non symbolique. Il n'est pas renvoyé dans Matches car pas entre des ();
    • (?:\w+) représente le quatrième groupe qui ne sera pas, lui, repris dans le matches à cause du ?: au début du groupe.



    On aurait pu inclure \. dans le quatrième groupe et avoir le pattern \\(\w+)(?:_\w+_)(\w+)(?:\.\w+)$.

    Nous avons donc deux groupes qui sont renvoyés dans l'objet Matches. Matches contient donc un élément (l'élément 0) qui représente la fin de la chaine (le nom du fichier), et contient également deux submatches ( 0 et 1) contenant les deux groupes renvoyés (le pseudo et le pays). Tu remarqueras que les objets Matches et submatches sont numérotés à partir de 0.

    Il conviendrait, pour éviter une erreur d'exécution, de tester matches.count>0. En l'absence du test, on considère que la chaine testée valide le pattern à tous les coups.
    "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...
    ---------------

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/10/2015, 09h05
  2. Réponses: 3
    Dernier message: 21/07/2014, 02h31
  3. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  4. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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