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 :

Bien maitriser les VLOOKUP ou INDEX/MATCH


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut Bien maitriser les VLOOKUP ou INDEX/MATCH
    Bonjour,

    je suis devenu pas trop mauvais avec excel mais des besoins de publications web m'ont obligé à m'attaquer aux Macros Excel et donc à VBA.
    Je me heurte à quelque chose de sûrement très basique, qui est la bonne utilisation des équivalent VLOOKUP ou INDEX/MATCH de excel mais dans VBA.

    Concrètement, je possède un tableau sur excel appelé "listenom"
    Nom Age Ville
    Adonto 32 Paris
    Obonga 45 Noisy
    Tarouma 24 Iverny


    L'idée est de crée, pour chaque personne, une fiche en HTML (avec une mise en forme), qui reprendra toutes les informations de chacune de ces personnes. Ce fichier HTML aura comme nom le nom de la personne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub creer_TXT()
        x = FreeFile
        For Each Cel In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
            Chemin = "C:\wamp64\www\FICHES\" & Cel.Value & ".html"
            Open Chemin For Output As #x
            Print #x, "<html><head><title>Les personnes</title>la personne concerné se nomme " & Cel.Value & " et son age est de "INDEX/MACTH en VBA ???", et il habite à "INDEX MATCH en VBA???"
            Close #x
        Next
    End Sub
    Donc pour cet exemple, lorsque je lance la requête, 3 fichiers HTML se créer comme suit :
    ADONTO.HTML = contenant "La personne concernée se nomme Adonto, et son age est de , et il habite à
    OBONGA.HTML = contenant "La personne concernée se nomme Obonga, et son age est de , et il habite à
    TAROUMA.HTML = contenant "La personne concernée se nomme Tarouma, et son age est de, et il habite à

    Bien évidemment, le but est est bel et bien pour chaque personne d'avoir le fichier html correspondant avec dedans "La personne concerné se nomme Adonto, et son age est de 32, et il habite à Paris"
    Malheureusement, à chaque fois que j'essaie d'utiliser les équivalant de INDEX/MACTH ou de rechercheV, je me foire dans la syntaxe. Je pense aussi que je n'arrive pas à déterminer les portions de codes communes à la formule, de celles que je doit personnaliser pour que cela rentre dans mon exemple. Je n'ai pas encore le niveau.

    Est-ce que vous pourriez m'écrire un exemple de Index/match qui colle avec "l'age" par exemple ? je pense que cela va m'aider pour tout le reste.

    Merci beaucoup d'avance

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 548
    Par défaut
    Bonjour

    Inutile de recourir à ces fonctions. Un simple offset suffit avec n pour 1 ou 2 ou n colonnes pour récupérer les valeurs situées à droite de cel

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Et bien....
    effectivement cela fonctionne très bien et je t'en remercie.
    Cela entrouvre de belles possibilité pour ce que je souhaite faire.

    Cela m'a fait vraiment avancer dans le projet. Je me suis toutefois heurté sur un autre problème et je souhaiterais savoir si nous avons une solution similaire bien que cette fois-ci plus complexe je suppose).

    Si je continue cet exemple, mettons qu'il existe dans une seconde feuille appelé "listeCA" les informations suivantes :

    Nom Année Chiffre d'affaire
    Obonga 2014 40 M€
    Adonto 2015 35 M€
    Obonga 2015 22 M€
    Adonto 2016 25 M€
    Obonga 2016 8 M€
    Tarouma 2016 48 M€


    Donc je veux toujours continuer de créer mes fiches, en enrichissant les informations extraites pour chaque personne, sauf que cette fois-ci, chaque personne à un nombre de résultats différents. 3 pour Obonga, 2 pour Adonto et 1 pour Tarouma.

    L'idée est d'obetnir le résultats suivant par exemple pour Obonga :
    "La personne concerné se nomme Obonga, son âge est de 32 ans et habite la ville de Paris. Ces résultats de CA sont :
    2014 - 40 M€
    2015 - 22 M€
    2016 - 8 M€"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Sub creer_TXT()
        x = FreeFile
        For Each Cel In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
            Chemin = "C:\wamp64\www\FICHES\" & Cel.Value & ".html"
            Open Chemin For Output As #x
            Print #x, "<html><head><title>Les personnes</title>la personne concernée se nomme " & Cel.Value & ", son âge est de "; cel.Offset(0, 1).Value; " ans et il habite la ville de "; cel.Offset(0, 1).Value; ". 
    Ces résultats de CA sont de :
    "VBA" - "VBA" M€ "+boucle en VBA ?"
    Close #x
        Next
    End Sub

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 548
    Par défaut
    Bonjour

    Il faut repérer chaque ligne : pour cela tu peux utiliser la commande Find pour trouver chaque occurrence du nom puis offset.

  5. #5
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut
    Bonjour à tous
    Bonjour SeigneurMorgoth, Chris

    Une petite chose qui n'a rien à voir avec tes questions de VBA, mais plutôt pour la partie html. Il me semble que tu devrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html><head><title>Les personnes</title> </head> <body> la personne concernée se nomme " & Cel.Value & ", son âge est de "; cel.Offset(0, 1).Value; " ans et il habite la ville de "; cel.Offset(0, 1).Value; ". 
    Ces résultats de CA sont de :
    "VBA" - "VBA" M€ "+boucle en VBA ?"
    et finir par :
    Eric

  6. #6
    Membre averti
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    78chris,

    j'ai passé quelquejours depuis a creuser la question et a comprendre la fonction find et ses variantes.

    Je n'arrive pas a l'appliquer a mon cas.

    Tu aurais un indice plus précis à me donner ?

    Merci beaucoup d'avance

  7. #7
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 548
    Par défaut
    Bonjour

    Dans l'aide 2010 (bien meilleure que celle des nouvelles versions) il y a un exemple assez facile à adapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Cet exemple montre comment rechercher toutes les cellules de la plage A1:A500 dans la première feuille de calcul contenant la valeur 2 et comment la remplacer par la valeur 5.
    
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(2, lookin:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 5
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
    tu remplaces 2 par la variable contenant ton nom, adaptes la feuille et plage de cellule, et remplaces "c.Value = 5" par les actions que tu as à faire pour chaque nom

  8. #8
    Membre averti
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Merci 78chris.

    J'ai réussi a faire marcher la formule, et lui faire faire différentes choses pour faire afficher des résultats multiples dans une feuille excel. Mais je n'arrive pas a l'intégrer a mon premier code pour que ces résultats vienne "s'imprimer" dans ma page HTML.


    Le résultat final recherché est une page HTML avec inscrit pour chaque personne (avec les variables en gras):
    "La personne concerné se nomme Obonga, son âge est de 32 ans et habite la ville de Paris. Ces résultats de CA sont :
    2014 - 40 M€
    2015 - 22 M€
    2016 - 8 M€"



    Ce dernier, avec les multiples années et multiples résultats de CA étant ce qui doit etre sortie par le code.
    Pour ce faire, je pense que je doit inscrire le code de recherche multiple dans "print". Ce que VBA ne tolère pas.

  9. #9
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 548
    Par défaut
    Bonjour

    Avec les colonnes : Nom, Age, Ville, Année, Chiffre d'affaire
    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
    Option Explicit
    Sub creer_TXT()
    Dim x As Integer, Cellule As Range, j As Long, Plage As Range, NBlig As Long, LeNom As String, Chemin As String, Suite As Range
     
        x = FreeFile
        Set Plage = Worksheets(1).Cells(1, 1).CurrentRegion
        NBlig = Plage.Rows.Count
        Set Plage = Plage.Offset(1, 0).Resize(NBlig - 1, Plage.Columns.Count)
        With Plage.Columns(1)
            For Each Cellule In .Cells
                LeNom = Cellule.Value
                Chemin = "C:\wamp64\www\FICHES\" & Cellule.Value & ".html"
                If Dir(Chemin) = "" Then
                    Open Chemin For Output As #x
                    Print #x, "<html><head><title> </head> <body> Les personnes</title>la personne concernée se nomme " & LeNom & ", son âge est de "; Cellule.Offset(0, 1).Value; " ans et il habite la ville de "; Cellule.Offset(0, 2).Value; ". "
                    Print #x, "Ses résultats de CA sont :"
                    Print #x, "</BR>" & Cellule.Offset(0, 3).Value & " - " & Cellule.Offset(0, 4).Value
                    Set Suite = .Find(LeNom, LookIn:=xlValues)
                    If Not Suite Is Nothing Then
                        j = Suite.Row
                        Do
                            If j > Cellule.Row Then Print #x, "</BR>" & Suite.Offset(0, 3).Value & " - " & Suite.Offset(0, 4).Value
                            Set Suite = .FindNext(Suite)
                        Loop While Not Suite Is Nothing And Suite.Row > j
                    End If
                    Print #x, "</body></html>"
                    Close #x
                End If
            Next
        End With
    End Sub

Discussions similaires

  1. Comment bien gérer les index ?
    Par éric1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/08/2009, 14h35
  2. Réponses: 0
    Dernier message: 04/11/2008, 11h22
  3. Réponses: 8
    Dernier message: 26/11/2007, 15h01
  4. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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