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 :

difficulté à repérer une chaîne donnée dans une chaîne de caractères [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    responsable QSE
    Inscrit en
    Mars 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : responsable QSE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2018
    Messages : 14
    Points : 8
    Points
    8
    Par défaut difficulté à repérer une chaîne donnée dans une chaîne de caractères
    Bonjour à tous

    J'ai un fichier excel qui comprend dans une colonne des questions avec à la fin de la question, les mots M1 ou S1 ou les 2

    exemples :
    "Ce cours a-t-il répondu à vos attentes ? M1"
    "Ce programme a-t-il été traité entièrement ? M1+S1"
    "Si des supports de cours étaient mis à disposition, étaient-ils adaptés ? S1"

    au total dans l'ensemble des questions M1 apparaît 6 fois et S1 apparaît 7 fois

    J'ai le code suivant :
    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
     
    With feuilleE           'Workbooks("bilan M2.xlsx").Sheets("Etudiant")
        i1 = 3
        i2 = 2
        For i1 = 3 To nbcolonne
            For i2 = 2 To nbligne
                position = InStr(1, .Cells(i2, 1).Value, "M1")
                If position > 1 Then
                            (instructions incrémentant la valeur de quelques cellules et ne faisant pas appel à la valeur de la variable position)
                End If
                position = InStr(1, Cells(i2, 1), "S1")
                If position > 1 Then
                           (instructions incrémentant la valeur de quelques cellules et ne faisant pas appel à la valeur de la variable position)
                End If
            Next
    End With

    Or il s'avère que le code n'identifie la chaîne "M1" que 5 fois et la chaîne "S1" qu'une seule fois.
    Et je ne parviens pas à comprendre pourquoi

    Je vous mets ci-dessous, la liste des questions telles qu'elles sont écrites dans ma feuille excel (une cellule par question):

    Ce cours vous paraît-il nécessaire dans le cadre du master ? M1
    Ce cours a-t-il répondu à vos attentes ? M1
    Ce cours avait-il un programme bien défini ? M1
    Ce programme a-t-il été traité entièrement ? M1+S1
    Le volume horaire était-il ? M1
    Si des supports de cours étaient mis à disposition, étaient-ils adaptés ? S1
    Les outils pédagogiques utilisés vous ont-ils permis d'assimiler ce cours ? S1
    Les applications pratiques (exercices, TP) ont-elles permis l'appropriation du contenu théorique ? S1
    L'enseignant respecte-t-il son planning et ses horaires de cours ? S1
    L'enseignant est-il à l'écoute des élèves ? S1
    Le(s) contrôle(s) a-t-(ont)-il(s) permis de révéler le niveau de compréhension de ce cours ? M1+S1


    je suis preneuse de toute explication

    merci d'avance

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Deux For pour un seul Next ? Il est peut probable que ce code ait fonctionné.

    Il manque aussi un "." devant le Cell de la recherche de S1.

    De plus, sans savoir comment tu incrémentes, difficile de savoir si l'erreur ne vient pas de là.
    Déjà que l'initialisation d'une variable (i1 et i2) juste avant un For To alors qu'elle va être la valeur tournante, c'est bizarre...
    Tout comme il est étrange que tu n'ais pas initialisé avant les boucles les variables ou cellules qui serviront à l'incrémentation.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Salut.

    Une idée avec des expressions régulières, illustrée ici pour tes questions en A1:A11

    Nom : 2018-03-20_210519.png
Affichages : 107
Taille : 16,3 Ko

    Le code de la fonction qui renvoie un tableau de deux élements
    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
    Function M1S1()
      Dim regexp As Object
      Dim matches As Object
      Dim Cell As Range
      Dim m1 As Long, s1 As Long
      Dim Counter As Long
      Dim Result(0 To 1)
      Set regexp = CreateObject("VBScript.RegExp")
      regexp.Pattern = "(M1|S1)?\+?(S1|M1)?$"
      For Each Cell In Range("a1:a11")
        Set matches = regexp.Execute(Cell.Value)
        If matches.Count > 0 Then
          For Counter = 0 To matches(0).submatches.Count - 1
            m1 = m1 + -(matches(0).submatches(Counter) = "M1")
            s1 = s1 + -(matches(0).submatches(Counter) = "S1")
          Next
        End If
      Next
      Result(0) = m1
      Result(1) = s1
      M1S1 = Result
    End Function
    Son utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      Dim Result
      Result = M1S1()
      Debug.Print "M1: " & Result(0)
      Debug.Print "S1: " & Result(1)
    End Sub
    Son résultat:

    Nom : 2018-03-20_210626.png
Affichages : 112
Taille : 1,0 Ko

    Explication du pattern: "(M1|S1)?\+?(S1|M1)?$"

    • Le dollar en fin de pattern signifie qu'on ne regarde que la fin de la chaîne;
    • Il y a deux groupes qui sont renvoyés car deux (...);
    • M1|S1 veut dire "M1" ou "S1";
    • ? derrière le premier groupe veut dire 0 ou une fois;
    • \+? veut dire qu'après le groupe, on peut trouver 0 ou 1 caractère +;
    • S1|M1 dans le second groupe veut dire "S1" ou "M1";
    • ? derrière le second groupe veut dire que l'on peut trouver ce groupe 0 ou une fois.



    En "clair", on a donc (0 ou 1 fois M1 ou S1) suivi de 0 ou 1 fois + suivi de (0 ou 1 fois S1 ou M1), le tout en fin de chaine. Les groupes sont récupérés dans les submatches.
    Il y a 0 ou 1 matches qui peut être récupéré, et il y en a 1 si la chaine se termine par ce que je j'ai énoncé plus haut.

    Ca évite les calculs sur les instr plus le code qui doit déterminer s'il y a un + ou pas, ça permet d'ajouter facilement d'autres codes en modifiant le moins de code possible, etc, etc.

    Autrement dit, tu mets le principal de ta logique métier dans le pattern de l'expression régulière, ce qui simplifie ton code...
    "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...
    ---------------

  4. #4
    Futur Membre du Club
    Femme Profil pro
    responsable QSE
    Inscrit en
    Mars 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : responsable QSE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2018
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Deux For pour un seul Next ? Il est peut probable que ce code ait fonctionné.

    Il manque aussi un "." devant le Cell de la recherche de S1.

    De plus, sans savoir comment tu incrémentes, difficile de savoir si l'erreur ne vient pas de là.
    Déjà que l'initialisation d'une variable (i1 et i2) juste avant un For To alors qu'elle va être la valeur tournante, c'est bizarre...
    Tout comme il est étrange que tu n'ais pas initialisé avant les boucles les variables ou cellules qui serviront à l'incrémentation.
    Dans mon programme, il y a bien 2 next.

    En fait le problème venait du "." manquant devant Cell à 2 endroits.

    Problème résolu

    Merci!

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

Discussions similaires

  1. [TKinter] Repérer un "individu" donné dans une grille
    Par Helpingna dans le forum Général Python
    Réponses: 7
    Dernier message: 10/12/2012, 01h01
  2. Recherche des données dans une BD ou dans une List
    Par mesken dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2011, 16h45
  3. [XL-2003] Récupération des données dans une base à partir d'une valeur donnée
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/04/2011, 14h33
  4. Réponses: 9
    Dernier message: 10/02/2010, 18h30
  5. Réponses: 6
    Dernier message: 13/11/2009, 16h06

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