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 information dans le contenu d'une cellule [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut Extraire une information dans le contenu d'une cellule
    Bonjour,

    Je travaille sur une liste excel de médicaments que j'ai récupéré sur internet (http://www.vidal.fr/Sommaires/Medicaments-A.htm) et j'aimerais mettre de l'ordre dans les données.

    Mon problème est le suivant : dans le nom de ces médicaments, il y'a le format qui est indiqué en abrégé, exemples :

    A 313 200 000 UI POUR CENT pom : pom = pommade
    A 313 50 000 UI caps molle : caps molle = capsule molle
    ABBE CHAUPITRE HIVERNUM N° 5 sol buv états grippaux : sol buv = solution buvable
    ABILIFY 10mg cp : cp = comprimé

    Je souhaite simplement extraire ces infromations sur la forme des médicaments, et les isoler dans une 2nd colone.

    En me servant d'une table complète de correspondance qui m'informe (cp = comprimé etc.), serait t-il possible d'extraire tous les formats des médicaments, en allant rechercher dans chaque cellule si il y'a écrit "cp" ou bien "sol buv" etc et le cas échéant indiquer dans la cellule d'à côté "comprimé" ou bien "solution buvable" ?

    Je ne suis pas sûr d'être très clair, dans tous les cas merci si vous pouvez m'apporter un peu d'aide. J'ai cherché dans les fonctions excel de base mais n'ai rien trouvé

  2. #2
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    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
    Sub Medoc()
     
        Set F1 = Worksheets("Feuil1")
        Set F2 = Worksheets("Feuil2")
     
        Nbligne1 = F1.Cells(1, 1).End(xlDown).Row
        Nbligne2 = F2.Cells(1, 1).End(xlDown).Row
     
        For i = 1 To Nbligne1
            For j = 2 To Nbligne2
                If F1.Cells(i, 1).Value Like "*" & F2.Cells(j, 1).Value & "*" Then
                    F1.Cells(i, 2).Value = F2.Cells(j, 2).Value
                    j = Nbligne2
                End If
            Next j
        Next i
     
    End Sub
    avec dans l'onglet Feuil1 le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A 313 200 000 UI POUR CENT pom 
    A 313 50 000 UI caps molle 
    ABBE CHAUPITRE HIVERNUM N° 5 sol buv états grippaux 
    ABILIFY 10mg cp
    et dans l'onglet Feuil2 le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Code__________ Libellé
    ---------------------------------
    pom___________ pommade
    caps molle____ capsule molle
    sol buv_______ solution buvable
    cp_____________comprimé

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut en utilisant les tableaux
    Bonsoir drymogan et Delphine, Bonsoir le forum

    Je me permets de soumettre ce code en utilisant les tableaux.
    En supposant que les références sont en cellule ("A1:A5")

    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
    Option Base 1
     
    Public Sub Type_Médicaments()
    tab1 = Array("pom", "caps molle", "sol buv", "cp")
    tab2 = Array("pommade", "capsule molle", "solution buvable", "comprimé")
    For Each cel In Range("A1:A5")
        i = 0
        For Each nomcourt In tab1
            i = i + 1
            If InStr(cel, nomcourt) > 0 Then
                    cel.Offset(0, 1) = tab2(i)
                    Exit For
            End If
        Next
        If cel.Offset(0, 1) = "" Then cel.Offset(0, 1) = "type inconnu"
    Next
    End Sub
    Qu'en pensez-vous?

    Cordialement.

    Marcel

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une autre solution si les données se trouvent dans une seule colonne (on peut le supposer d'après le format que vous affichez dans votre exemple, mais ce n'est pas certain) code à insérer dans la feuille concernée (exemple : "Feuil1") :
    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
    Sub Separe()
     Dim text$, Tableau() As String
     Dim i!, j!, pc1!, pc2!
     Dim pl&, n&
     
     '1ère ligne contenant vos données (vous pouvez modifier)
    pl = 1
    'colonne de données (vous pouvez modifier)
    pc1 = 1
    'colonne de copie de la première donnée (vous pouvez modifier)
    pc2 = 2
    'dernière ligne contenant vos données
    dl = Range(Cells(65536, pc1), Cells(65536, pc1)).End(xlUp).Row
     
     
    For n = pl To dl
        text = Cells(n, pc1)
        Tableau = Split(text, ":")
     
        For i = 1 To UBound(Tableau)
        text = Tableau(i)
        Tableau = Split(text, "=")
            For j = 0 To UBound(Tableau)
            Cells(n, pc2) = Tableau(j)
            pc2 = pc2 + 1
            Next j
        pc2 = 2
        Next i
    Next n
    End Sub
    Le résultat est le le suivant (on peut bien sûr adapter et, par exemple, mettre ces données dans une autre feuille) :
    Images attachées Images attachées  
    Dernière modification par Invité ; 22/07/2010 à 18h44.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Merci à tous pour vos réponses.

    J'ai utilisé la solution de Delphine et elle marche, sauf sur un petit aspect assez vicieux que je vais vous expliquer.

    Avant d'expliquer le souci, concernant les autres propositions :
    - celle de MarcelG marche peut être mais n'est pas applicable car il y'a plus de 200 formats de médicaments dans ma table de correspondance (qui est sur un onglet à part, onglet "correspondance") du coup je ne peux pas les taper un par un à l'intérieur de la formule.
    - celle de jacques_jean partait du principe que toutes les données étaient dans la même colonne ce qui n'est en fait pas le cas, mon exemple initial était confus. Il y'a bien 2 onglets ds mon classeur. 1er onglet "BDD" : liste des médocs en 1 colonne ; 2ème onglet "correspondance" : 2 colonnes, 1ère colonne = nom abrégé du format (ex: cp), 2ème colonne = nom complet du format (ex: comprimé)

    Le prob avec la formule de Delphine est le suivant : dans ma liste de correspondance, il y'a souvent des formats de médicament qui sont très proches, on pourrait parler de "sous branches". Cet exemple le montre bien :

    cp : comprimé
    cp à croquer : comprimé à croquer
    cp à croquer/dispers : comprimé à croquer ou dispersible
    cp à sucer : comprimé à sucer
    cp efferv : comprimé effervescent
    cp enr : comprimé enrobé
    cp LP : comprimé à libération prolongée
    cp orodispers : comprimé orodispersible
    cp pellic : comprimé pelliculé
    cp pellic séc : comprimé pelliculé sécable
    cp pellic séc LP : comprimé pelliculé sécable LP
    cp séc : comprimé sécable
    cp subling : comprimé sublingual
    Cpr : comprimé

    => quand j'utilise la macro, je me retrouve avec uniquement des "comprimés". tous les détails sont passés à la trappe. Il faudrait que la macro puisse différencier les simples "cp" des "cp xxxxxx".

    Je ne sais pas si c'est possible, j'imagine que oui... merci beaucoup par avance.

  6. #6
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    Tu tri ton tableau de la feuille 2 par ordre decroissant (z..a) et ca marche !!

    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
    Sub Medoc()
     
        Set F1 = Worksheets("Feuil1")
        Set F2 = Worksheets("Feuil2")
     
        tri_branche
     
        Nbligne1 = F1.Cells(1, 1).End(xlDown).Row
        Nbligne2 = F2.Cells(1, 1).End(xlDown).Row
     
        For i = 1 To Nbligne1
            For j = 2 To Nbligne2
                If F1.Cells(i, 1).Value Like "*" & F2.Cells(j, 1).Value & "*" Then
                    F1.Cells(i, 2).Value = F2.Cells(j, 2).Value
                    j = Nbligne2
                End If
            Next j
        Next i
     
    End Sub
     
     
    Sub tri_branche()
     
        Set F2 = Worksheets("Feuil2")
        With F2.Sort
            .SortFields.Clear
            .SortFields.Add Key:=Columns(1), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .SetRange Columns("A:B")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
    End Sub

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Merci Delphine, en effet le tri par ordre décroissant a réglé le prob. J'imagine que la macro va d'abord chercher les valeurs en haut puis descend le tableau, du coup il suffit de mettre les nom "longs" en haut et les noms "courts" en bas et ça règle le pb.

    Merci bcp en tout cas, problème résolu

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  2. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  3. Réponses: 2
    Dernier message: 17/04/2009, 12h13
  4. Réponses: 3
    Dernier message: 10/04/2008, 13h50
  5. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30

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