Test sur un texte commençant par

Résolu
Bonjour,
je suis débutant et j'aimerais faire un code en vba qui consiste à :

exemple: si la colonne A contient un texte commençant par O5a-xxxx alors écrire dans la colonne B le chiffre 5.

Merci pour votre aide

9 réponses

Résumé de la discussion

Un débutant recherche une macro VBA permettant de tester si le texte de la colonne A commence par O5a-xxxx et d’écrire 5 dans la colonne B. La meilleure réponse propose une procédure qui parcourt les lignes jusqu’à la dernière cellule non vide, lit le contenu de la colonne A et écrit dans B le caractère correspondant. Le code utilise Mid$(chn, 2, 1) et gère les lignes vides en s’arrêtant à la dernière ligne non vide, assurant l’application correcte même lorsque des cellules A restent vides. D’autres échanges évoquent des améliorations possibles, comme le recours à Like ou à une regex, mais la solution retenue privilégie une décomposition simple du texte.

Bobot (l’IA à votre service)
  1. Bonjour

    Regarde l'opérateur Like ou l'opérateur Left
    1. Bonjour Agi,

      Je te propose ce code VBA :

      
      Option Explicit
      
      Sub Essai()
        Application.ScreenUpdating = False
        Dim chn As String, dlig As Long, lig As Long
        dlig = Range("A" & Rows.Count).End(xlUp).Row
        For lig = 1 To dlig
          chn = Cells(lig, 1)
          If Len(chn) > 1 Then Cells(lig, 2) = Mid$(chn, 2, 1)
        Next lig
      End Sub
      
      

      Ça fera le travail en colonne B, pour A1 à la dernière donnée
      de la colonne A, même s'il y a des cellules vides dans cette
      colonne A ; cela grâce à dlig : dernière ligne.

      Si ton problème est réglé, merci de l'indiquer,
      pour que le sujet puisse être passé en résolu.

      Cordialement.  :)

      PS : Bonjour à Whismeril en passant.  ;)
       
      1. Bonjour,

        Ça marche aussi, mais sa demande est un code vba.
      2. @Utilisateur anonymeTu as raison : j'ai zappé que c'était à faire en code VBA ! Merci pour ta remarque.
        Je vais corriger mon message tout de suite.  :)
      3. Tu n'as pas oublié ce détail : "...contient un texte commençant par O5a-xxxx alors..." ?
      4. @Utilisateur anonymeBonjour Help-Jason,
        J'ai compris ceci : le texte qui est en A est « O5a-xxxx » ; donc il commence par
        un code du genre « O5a » suivi de « -xxxx » ; et dans ce cas, mon code VBA
        retourne bien le 2ème caractère : « 5 » ; c'est bien ce qu'il faut, je crois, non ?
        Je suis ouvert à toute suggestion. Cordialement.  :)
      5. Il faut que la cellule de la colonne A contienne un texte, oui (donc Len(chn) > 1) mais aussi qu'il commence par O5a sinon ton programme fonctionne avec n'importe quelle chaîne de caractère non vide.
    2. Bonjour albkan,

      je te remercie pour ton code, il marche super bien
      merci à toi aussi Whismeril

      Cordialement
      1. Bonjour albkan,

        je reviens vers toi à propos de ton code, est ce que il y a moyen de préciser pour qu'il ne fonctionne que dans le cas ou on la lettre "O" ( exemple O5a-xxxx) ou de la lettre "E" ( exemple E5a-xxxx) et pas le reste les lettres de l'alphabet.
        Merci pour ton aide et bonnes fêtes

        Agi
        1. Bonsoir, donc on en revient à ma première proposition regarde l'opérateur like, ou alors une regex
        2.  
          Bonjour Agi,

          Voici le nouveau code VBA :

          
          Option Explicit
          
          Sub Essai()
            Application.ScreenUpdating = False
            Dim chn As String, dlig As Long, lig As Long
            dlig = Range("A" & Rows.Count).End(xlUp).Row
            For lig = 1 To dlig
              chn = Cells(lig, 1)
              If InStr("EO", Left$(chn, 1)) > 0 Then
                Cells(lig, 2) = Mid$(chn, 2, 1)
              End If
            Next lig
          End Sub
          
          

          Si tu as besoin de préciser aussi les codes qui commencent (par exemple)
          par B et G, il te suffit de modifier ainsi la ligne #10 :

              If InStr("BEGO", Left$(chn, 1)) > 0 Then
          

          Tu peux placer les initiales dans l'ordre que tu veux, par exemple "OEGB",
          mais autant les placer dans l'ordre alphabétique, n'est-ce-pas ?  ;)

          Bonnes fêtes à toi aussi !  :)
           
        3. @Utilisateur anonymeBonjour Albkan et meilleurs vœux !
          Je reviens vers toi, voilà :
          J’ai un fichier Excel avec des dates (en colonne « A ») sachant que plusieurs lignes peuvent contenir la même date, J’aimerais savoir comment faire une macro qui, en entrant la date de début et date de fin, par InputBox, elle me fait la copie de toutes les lignes comprises dans cette tranche de dates de ce fichier vers un autre fichier Excel.
          Merci par avance !
      2. Bonjour albkan,

        Je te remercie pour ta réponse, c'est exactement ce qu'il me faut..
        Passe un bon réveillant, et à toi aussi Whismeril passe de bonnes fêtes.

        A bientôt

        Agi
        1. Bonnes fêtes à toi aussi
      3.  
        Bonjour agi et meilleurs vœux à toi aussi !

        Pour ta demande, il manque beaucoup trop d'informations !

        Quand on veut faire une copie, il y a la source (= les données à copier)
        et la destination (là où on veut faire la copie).

        ==============================

        Pour la source :

        a) nom du fichier 1 ? exemple : "Classeur 1.xlsm"
        b) nom de la feuille ? exemple : "Feuil3"

        c) n° de la ligne d'en-têtes du tableau ? ; exemple : ligne 5
        d) 1ère ligne des données ? en principe juste après la ligne d'en-têtes => 6
        e) dernière ligne des données ? : exemple : 100 (ou variable)
        f) lignes à copier : de date début à date fin : OK

        g) colonnes à copier : de la colonne A à quelle colonne ? G ? autre ?
        h) ta colonne A contient des dates ; quel est le format de ces cellules ?
            format date jj/mm/aaaa ? autre format date ? format texte ?

        ----------------------------------------------------

        exemple de résumé pour c) à h) :

        des lignes 5 à 100 (et +), la ligne 5 étant une ligne d'en-têtes,
        des colonnes A à G, dates au format jj/mm/aaaa

        mais n'oublie pas de répondre aussi à a) et b) !

        Et je vais supposer que toutes tes lignes de données sont continues,
        c'est-à-dire sans ligne vide entre ; sinon, à toi de me le dire.

        ==============================

        Pour la destination :

        a) nom du fichier 2 ? exemple : "Classeur 2.xlsm"
        b) nom de la feuille : "Feuil1" ? autre ?

        c) cellule du coin supérieur gauche du futur tableau ? D8 ? autre ?
            si D8, ça signifie que la ligne d'en-têtes sera la ligne 8 ; la 1ère ligne
            de données copiée sera en ligne 9 et les autres seront dessous ;
            s'il y avait 7 colonnes (de A à G) pour la source, la destination aura
            7 colonnes aussi (de D à J). Et cela si pour une ligne copiée, tu veux
            toutes les 7 colonnes de la source, mais ce n'est pas forcé : tu peux
            vouloir seulement 2 ou 3 colonnes et pas les autres ! Si oui, à toi
            de l'indiquer : on ne peut pas deviner ce que tu préfères !  ;)

        ==============================

        Ça te fait beaucoup de réponses à donner, hein ? Ce serait peut être
        plus simple en joignant ton fichier (sans données confidentielles) via
        mon-partage.fr ; ça m'aidera bien plus pour la source, mais il faudra
        quand même indiquer tout ce que j'ai demandé pour la destination.

        À te lire.  :)
         
        1. Bonjour Albkan,
          Voilà les données

          Fichier source:

          Classeur : Source.xls
          Feuille : Feuil1

          Colonne A: date
          Colonne B: commune
          Colonne C: adresse
          Colonne D: référence
          Colonne E: intitulé
          Colonne F: type
          Colonne G: état

          Fichier cible:

          Classeur : Cible.xls ( qui se trouve dans un autre répertoire nommé "dsp")
          Feuille : Feuil2

          Colonne A: date
          Colonne B: commune
          Colonne C: adresse
          Colonne D: référence
          Colonne E: intitulé
          Colonne F: type
          Colonne G: état

          L'idée est de copier une partie du fichier source et de la coller dans le fichier cible sachant que la cible et la source sont identiques, sauf que la cible ne contiendra que les lignes dont les dates sont comprises dans la fourchette choisie par "InputBox"
          (exemple: copie: du 16/01/2017 au 23/01/2017) tout copier car plusieurs lignes peuvent contenir la même date.

          Je reste à ta disposition pour tout tout info en plus

          Merci infiniment

          Agi
          1. Bonjour agi, relis bien en entier mon message #19 : tu verras que tu as oublié
            beaucoup d'informations ! Les exemples que j'ai mis dans ce message sont là
            tout exprès pour te guider. A+  :)
          2. @Utilisateur anonymeBonjour Albkan,

            Pour la source :

            a) nom du fichier : "Classeur 1.xls" placé dans un répertoire Rep1
            b) nom de la feuille : "Feuil1"
            c) n° de la ligne d'en-têtes du tableau : pas d'en-tête
            d) 1 ère ligne des données ligne 1
            e) dernière ligne des données variable
            f) lignes à copier : de date début à date fin : OK
            g) colonnes à copier : de la colonne A la colonne G
            h) la colonne A contient des dates sous le format jj/mm/aaaa

            Pour la destination :

            a) nom du fichier 2 : "Classeur 2.xls" placé dans un répertoire Rep2
            b) nom de la feuille : "Feuil2"
            c) cellule du coin supérieur gauche du futur tableau A1

            - j'aimerais la copie de toute les colonnes, infos dont j'aurais besoin pas la suite.
            - dans le fichier source, il y a une ligne vide entre chaque jour différent de la semaine.

            par exemple : 5 lignes de la date de 15/11/2016 / 1 ligne vide / 3 lignes de 16/11/2016
            / 1 ligne vide / 6 lignes de 17/11/2016 / 1 ligne vide / etc..

            les deux fichiers sont dans 2 répertoires différents

            j'espère que je n'ai rien oublié, merci encore pour ta patience et ton aide

            Agi
          3. @agi 
            a) Pour le classeur 2 : es-tu bien sûr que c'est Feuil2 et pas Feuil1 ?

            b) Les lignes vides compliquent la tâche, et en plus, elles empêchent
                d'utiliser le filtre automatique et le filtre avancé ! Peux-tu enlever
                toutes tes lignes vides ? Si oui, ça sera plus facile, mais si vraiment
                tu y tiens, laisse-les et je ferai avec (mais sans les filtres).

            c) J'ai réalisé que c'est bien difficile de le faire sans un exemple réel !
                Aussi, je te demande de m'envoyer un fichier Excel significatif, donc
                avec une centaine de lignes (dont les lignes vides si tu y tiens), mais
                sans données confidentielles => à toi d'en inventer. Joins ton fichier
                via le site mon-partage.fr : tu dois copier le lien de téléchargement
                dans ton prochain message.

            Rappel : pour un filtre (automatique ou avancé), la 1ère ligne vide rencontrée
            détermine la fin du tableau => les lignes qui sont en dessous sont ignorées ;
            donc on ne peut utiliser les filtres que sur un tableau de lignes contigües,
            sans aucune ligne vide entre elles.
             
          4. @Utilisateur anonymeBonsoir albkan, on peut faire sauter les lignes vides car ce fichier issu d'un import depuis un logiciel et j'ai la main dessus. Pour le classeur 2 j'ai opté pour la feuille 2 mais si c'est un problème je peux me débrouiller, tu peux faire au mieux. Je vais voir si je peux t'envoyer le fichier au fait je ne l'ai jamais fait c'est pour ça mais ça ne dois pas être compliqué. Bonne soirée à toi
            agi
          5. @agi 
            Bonsoir agi,

            Voici comment joindre un fichier via mon-partage.fr :

            Étape 1 : clic sur la grande case longue, ou sur le bouton jaune
            « CHOISIR UN FICHIER » ; sélectionne le fichier à joindre.

            Étape 2 : clic sur « Modifier la durée de partage » ; à droite
            et plus haut, coche la case pour pouvoir entrer les 2 dates
            de début et fin : à sélectionner dans le petit calendrier.

            Étape 3 : clic sur le bouton jaune Uploader ; attendre un peu
            que le fichier soit chargé ; tu pourras ensuite voir le lien de
            téléchargement.

            Tu dois faire un copier / coller de celui-ci
            dans ton prochain message sur le forum.

            albkan
        2. Bonjour,

          Juste une erreur de syntaxe:
          Voici le bon code

          Workbooks("Classeur1.xls").Sheets(Sheets.Count).Select
          Cells.Copy _
          Workbooks("Classeur2.xls").Worksheets("feuille2").Range("A1")

          Bonne journée

          Agi