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 :

Extraite sous chaîne en fonction présence et position de caractère


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 61
    Points : 41
    Points
    41
    Par défaut Extraite sous chaîne en fonction présence et position de caractère
    Bonjour,

    J'ai plusieurs cellules avec des chaines de caractère dont certaines contiennent par exemple "CP du 01/01 au 03/01", entre autres caractères.

    Je voudrais alors vérifier la présence de la sous chaîne "CP" avant d'extraire chaque date, dont le positionnement sera toujours le même après la sous chaîne. Je chercherais alors les 5èmes caractères à 9ème caractères après la sous chaîne "CP" puis 14ème caractère à 18ème caractère après la sous chaîne "CP".

    J'ai chercher avec la fonction Mid (par exemple Mid(Range("A1"), 5, 9)), mais je ne vois pas comment l'appliquer à compter de la fin de ma sous chaîne "CP".

    Je précise que la sous chaîne "CP" ne sera pas toujours située à la même position au sein de ma sous chaîne, d'où mon obligation de débuter réellement l'extraction après la présence de celle-ci.

    Auriez-vous des pistes à me communiquer ?

    En vous remerciant par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    bonjour,

    un exemple à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub exemple()
    Dim Machaine As String, Tab_Machaine
     
        Machaine = "CP du 01/01 au 03/01"
        If InStr(Machaine, "CP") = 1 Then
            Tab_Machaine = Split(Machaine, " ")
            MsgBox Tab_Machaine(2)
            MsgBox Tab_Machaine(4)
        End If
     
    End Sub
    Edit : petit ajout code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub exemple2()
    Dim Machaine As String, Tab_Machaine
     
        Machaine = "xxx xxx xxxxx CP du 01/01 au 03/01"
        If InStr(Machaine, "CP ") > 0 Then
            Tab_Machaine = Split(Mid(Machaine, InStr(Machaine, "CP ")), " ")
            MsgBox Tab_Machaine(2)
            MsgBox Tab_Machaine(4)
        End If
     
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    @Ryu bonjour
    mieux vaut envisager toutes les possibilités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub exemple2()
        Dim Machaine As String, Tab_Machaine, t(1 To 2), ok As Boolean
        Machaine = "xxx xxx xxxxx CP de duchmolle du 01/01 au 03/01"
        Tab_Machaine = Split(Machaine, " ")
        For i = LBound(Tab_Machaine) To UBound(Tab_Machaine)
            If Tab_Machaine(i) Like "CP" Then ok = True
            If Tab_Machaine(i) Like "##/##" And ok = True Then x = x + 1: t(x) = Tab_Machaine(i)
        Next
        MsgBox t(1)
       MsgBox t(2)
    End Su
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Coucou Patrick ,

    Je suis d’accord avec toi, mais par rapport à :
    Je voudrais alors vérifier la présence de la sous chaîne "CP" avant d'extraire chaque date, dont le positionnement sera toujours le même après la sous chaîne.
    fait que le cas ne devrait pas se présenter "normalement"

    PS : Patrick, tu ne m’as pas répondu sur ton post
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    quel post?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    ok RYU en amont alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub exemple2()
        Dim Machaine As String, Tab_Machaine, t(1 To 2), ok As Boolean
        Machaine = "xxx xxx xxxxx CP de duchmolle du 01/01 au 03/01"
        Tab_Machaine = Split(Machaine, " ")
        If Machaine Like "CP *" Or InStr(Machaine, " CP ") > 0 And Machaine Like "*CP*##/##*##/##*" Then
        ok = True
           For i = LBound(Tab_Machaine) To UBound(Tab_Machaine)
             If Tab_Machaine(i) Like "##/##" And ok = True Then x = x + 1: t(x) = Tab_Machaine(i)
          Next
        MsgBox t(1)
        MsgBox t(2)
    End If
    End Sub
    edit: corigé pour que l'effet soit pas fait si c'est non
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup pour vos réponses !

    Entre temps, j'ai fait finalement ça :

    (K30 contient ma chaîne de caractère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Copie le nombre des CP
                    If Range("K30") Like "*CP*" Then 'Vérifie si cellule contient la sous chaîne "CP"
     
                            Position = InStr(Range("K30"), "CP") 'détermine position "CP" dans la chaîne
     
                            'Extrait la première date en colonne L
                             Range("L30").Value = Mid(Range("K30"), Position + 6, 5)
     
                            'Extrait la deuxième date en colonne M
                             Range("M30").Value = Mid(Range("K30"), Position + 15, 5)
    Ca fonctionne bien dans mon cas précis. Mais effectivement, ça n'est pas très sécurisé dans le cas où les dates ne seraient pas à la même position par rapport à la sous chaîne "CP".

    Etant débutante sous vba, il me faut étudier votre code pour en comprendre bien le fonctionnement, notamment les fonctions LBound, UBound et Split, et pouvoir adapter ce cas précis à d'autres cas qui pourraient se présenter à moi. Si vous avez une petite explication rapide, je suis preneuse

    Merci beaucoup.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    split:
    split ca veut dire coupe
    ici je coupe la chaine par les virgule j'obtiens ainsi un array de 3 element
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tablo=split("toto,titi,riri",",")
    msgbox tablo(1)' j'ai le message "titi"
    et oui 1 par ce que les items commencent par "0" :0,1,2,3,etc.....

    lbound / ubound:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for lbound(tablo) to ubound(tablo) 
    '......
    next
    traduction
    du plus petit index du tablo au plus grand index du tablo
    je dit bien index du tablo et pas debut a la fin
    car si ca voulais dire debut a la fin : debut ca serai 1 le premier
    tu a un exellent tuto sur les variable tableau cette partie y est abordée je crois
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    ryu
    quel post?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Ha pour le PS, le tien sur les tableaux structurés il y a peu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Si l'on s'en tient à l'exposé, tel que fait et aux détails donnés, tels que présentés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = "blabla CP du 01/01 au 03/01 blabla"
    titi = Split(Replace(Mid(toto, InStr(toto, "CP du "), 20), "du", "au"), "au")
    MsgBox titi(0) & vbCrLf & titi(1) & vbCrLf & titi(2)
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  13. #13
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    @unparia
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "|" & titi(0) & "|" & vbCrLf & "|" & titi(1) & "|" & vbCrLf & "|" & titi(2) & "|"
    Il faudrait peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    titi = Split(Replace(Mid(Toto, InStr(Toto, "CP du "), 20), "du", "au"), " au ")
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    A mercatog
    Oui.
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  15. #15
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour Jacques,

    Par sécurité, je pense que se serait une bonne idée de rajouter au début pour toto,
    un Application.Trim.
    Sait-on jamais …

    Amicalement Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2013, 20h52
  2. Problème affichage sous-chaîne extrait d'une chaîne
    Par xymagic dans le forum Débuter
    Réponses: 15
    Dernier message: 25/10/2011, 17h26
  3. [RegEx] Positions des sous-chaînes grâce aux regex
    Par oneTime dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2008, 13h57
  4. Trouver la position d'une sous-chaîne
    Par hallaj dans le forum Langage
    Réponses: 13
    Dernier message: 17/07/2008, 14h02
  5. [String] Récupérer une sous -chaîne sans split
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2004, 14h45

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