Programme VBA

Bonjour à tous,

je viens vers vous car mon niveau en VBA n'est pas suffisant pour démarrer le programme que je cherche à executer sur mon fichier.

Mon document Excel présente deux colonnes

Colonne A : Nom-Prénom

Colonne B : l'adresse postale.

Colonne C-D-E-F-G : 5 zones de la ville

Ce que je cherche : en fonction de l'adresse en colonne B, mettre 1 dans la colonne de la zone qui correspond à l'adresse. Par exemple, si l'avenue des fleurs se situe dans la zone 2, mettre 1 dans la colonne D.

Je sais que mon programme va être un peu long puisque pour chaque adresse de la ville, il faudra que je refasse la boucle.

Quelqu'un pourrait-il m'aider ?

Merci à tous par avance.

Bonjour,

C'est pas clair, elle sort d'où ta zone ? C'est quelque chose de propre à toi/ton employeur ? Si oui, il faudrait une liste de correspondances entre les numéros de zone et les départements, villes au autre selon le découpage (de préférence en rapport avec le code postal).

Aussi, peux-tu joindre ton fichier, ou au moins un fichier type, comme base de travail ?

Bonjour,

Et voici le résultat les différentes zones à complétée sont dans l'onglet 2

Bonne continuation

13calsseur1.xlsx (14.30 Ko)

Pour répondre à Pédro22, on peut par exemple comparer les zones à des arrondissements d'une ville.

Donc si la personne habite avenue des fleurs, mettre 1 dans le 1er arrondissement (zone 1, colonne C).

Mais je crois que Valc a tout compris. Merci beaucoup !

Je reviens vers vous si cela ne va pas...

Merci pour la rapidité !!

Valc,

j'ai un petit souci.

En fait, je souhaiterais que la recherche sur l'adresse ne se fasse que sur certains mots.

Je m'explique : dans le fichier que tu me proposes, il faut que l'adresse dans la colonne soit exactement celle qu'il y a dans l'onglet que tu as créé. S'il y a un espace en plus, la croix ne se met pas.

Or, dans mon cas, il faut que la recherche se fasse sur une partie seulement de l'adresse. Par exemple, si l'adresse est "Chemin des fleurs, Quartier des ROSES, 04820 MAVILLE", il faudrait que la croix se mette simplement parce qu'il y a " Quartier des ROSES".

Est-ce que je suis clair ?

Je mets en pièce ton fichier avec une ligne ajoutée.

J'ai un autre souci. En voulant adapter ta proposition à mon fichier, je me retrouve avec le "1" (ta croix) au mauvais endroit ..

Je suis désolé. Merci beaucoup.

6liste-2.xlsx (13.86 Ko)

re,

Ca risque faire une usine à gaz pour pas grand chose.

Vous ne pouvez pas mettre ce détail dans une autre colonne ?

qu'entendez-vous par "mettre ce détail dans un autre colonne" ? De quel détail parlez-vous ?

En fait, je ne peux pas changer mon fichier d'origine. Il y a plusieurs centaines de lignes, donc d'adresses. Les adresses postales sont comme la plupart des adresses, longues. C'est pour cela que je souhaiterais que mon classemnt dans les zones puissent se faire que sur une partie de l'adresse. C'est impossible de prendre l'adresse exacte de la colonne B....

re,

Vous pouvez diviser un adresse comme je montre dans le fichier joint. Pour la partie grisé pas encore trouvé de formule pour y arriver

6liste-2.xlsx (15.74 Ko)

Oui,

je sais qu'on peut séparer l'adresse en trois : la voie, le code postal, la ville.

Mais en fait, je crois que cela ne va pas faire avancer mon problème puisque c'est dans la voie que je souhaite récupérer seulement une partie.

Dans l'exemple "31 chemin des Roses - Quartier des fleurs - 83000 MAVILLE", c'est seulement "Quartier des fleurs" qui m'intéressent car c'est ce qui va me permettre de faire un classement rapide. Si je dois mettre l'adresse excate dans l'autre onglet, pour les centaines d'adresse, c'est infaisable...

Si j'arrive à prendre seulement un mot, ce sera extrêmement rapide. Un autre exemple : "18 avenue des trois cèdres, impasse de la mûre...", le fait de pouvoir prendre juste le mot "cèdre" est beaucoup pluss rapide que l'adresse exacte..

Enfin, à partir du moment où je récupère seulement une partie de la voie (si c'est possible), enlever le code postal ou la ville ne change rien...

J'espère me faire comprendre...

Intéresse toi d'un peu plus près au code proposé, c'est exactement ce qu'il fait. En l'absence de caractère spécifique ("," ; "-") qui séparent la partie d'intérêt dans ton adresse, tu peux la découper en fonction des espaces, et donc avoir chaque mot...

Attention par contre, il faut prévoir des instructions pour ne pas utiliser certains mots génériques : "Rue", "le", "la", "de", "des"...

Ma "logique" était pour éviter de passer par VBA, donc pas le choix

Merci Pedro22, mais comme je viens de l'écrire, cela ne m'avance pas trop de séparer le CP et la ville.

De plus, je viens de regarder la macro du fichier de ton lien et cela ne peut pas aller avec mon fichier : les centaines d'adresse n'ont pas été écrites correctement. Le CP et la ville sont accrochés sans espace(tu vas me dire, le programme se modifie) mais en plus certaines données apparaissent après la ville.

Voici un exemple "Chemin des Roses 83000MAVILLE Quartier des fleurs".

Je répète, la finalité du code ici est de séparer en 3 en se basant sur le CP, mais pour cela on découpe d'abord l'adresse MOT par MOT.

Pour les espaces oubliés, je vois difficilement comment faire pour automatiser le découpage du mot...

Donc Pedro22, tu penses que je dois forcément passer par un découpage de l'adresse mot à mot, dans un premier temps (en mettant chaque mot dans une colonne), pour ensuite faire mon classement par zone en fonction des mots ?

Ca oui c'est une usine à gaz !

Parce qu'il n'y aura pas forcément le même nombre de mots en fonction des adresses. Comment prévoir les colonnes ? et Ensuite, comment classer dans mes zones ? Il va falloir regarder les colonnes de chaque mot ..

Je mets un exemple de fichier comme celui de tout à l'heure mais avec deux adresses qui sont dans mon fichier... Si quelqu'un a la solution...

1liste-2.xlsx (13.88 Ko)

Bonjour,

Voici le code remodelé,

il donne donc l'adresse en 4 colonne, mais on peut bidouillé pour mettre uniquement le quartier, à voiir

Sub DecoupeAdresse()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim Tableau() As String
    Dim Tableau_newline() As String
    Dim i As Integer, Lig As Integer, Lmax As Integer

    With Sheets("Table 1")
        Lmax = .Range("A" & Rows.Count).End(xlUp).Row 'Identifie la dernière ligne de la base de données
        'boucle pour parcourir les lignes
        For Lig = 2 To Lmax
            'découpe l'adresse à partir des espaces
            Tableau = Split(.Cells(Lig, 2), " ")
            Tableau_newline = Split(.Cells(Lig, 2), Chr(10))
            'boucle sur le tableau pour repérer le CP
             For i = 0 To UBound(Tableau)
                If Tableau(i) Like "#####" Then 'Si l’élément découpé est un nombre à 5 chiffres, alors...
                    .Cells(Lig, 12) = Left(.Cells(Lig, 2), InStr(1, .Cells(Lig, 2), Tableau(i)) - 2) 'Rue = ensemble des caractères jusqu'au début du CP
                    .Cells(Lig, 13) = CLng(Tableau(i)) 'CP
                    .Cells(Lig, 14) = Right(.Cells(Lig, 2), Len(.Cells(Lig, 2)) - (InStr(1, .Cells(Lig, 2), Tableau(i)) + 5)) 'Ville = caractères après le CP

                    If UBound(Tableau_newline) = 0 Then
                        Exit For
                    End If

                    For Z = 0 To UBound(Tableau_newline)
                       .Cells(Lig, 15) = Right(Tableau_newline(Z + 1), Len(.Cells(Lig, 2)) - Len(Tableau_newline(Z)))
                       .Cells(Lig, 14) = Left(.Cells(Lig, 14), Len(.Cells(Lig, 14)) - Len(.Cells(Lig, 15))) 'Ville = caractères après le CP
                        Exit For
                    Next Z

                    Exit For
                End If
             Next i

        Next Lig
    End With

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Pas besoin de stocker chaque mot dans une colonne, en revanche on peut comparer chaque mot à une liste, et en cas de correspondance affecter la zone à laquelle il correspond. Donc 0 colonne supplémentaire mais une liste la plus exhaustive possible est nécessaire...

Voilà ma proposition :

Sub AffecterZone()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim Tableau() As String
    Dim i As Integer, Lig As Integer, Lmax As Integer
    Dim PLinvalid As Range, PLvalid As Range

    With Sheets("Table 1")
        Lmax = .Range("A" & Rows.Count).End(xlUp).Row 'Identifie la dernière ligne de la base de données
        Set PLinvalid = Sheets("Zone").Range("A2:A" & Sheets("Zone").Range("A" & Rows.Count).End(xlUp).Row)
        Set PLvalid = Sheets("Zone").Range("B2:B" & Sheets("Zone").Range("B" & Rows.Count).End(xlUp).Row)
        'boucle pour parcourir les lignes
        For Lig = 2 To Lmax
            'découpe l'adresse à partir des espaces
            Tableau = Split(.Cells(Lig, 2), " ")
            'boucle sur le tableau pour étudier chaque mot
             For i = 0 To UBound(Tableau)
                'On en travaille pas sur les mots génériques
                If PLinvalid.Find(Tableau(i)) Is Nothing And Not Tableau(i) Like "#/*" Then
                    'Si le mot est contenu dans la liste, donne le n° de zone correspondant
                    If Not PLvalid.Find(Tableau(i)) Is Nothing Then
                        Zone = Sheets("Zone").Cells(PLvalid.Find(Tableau(i)).Row, 3)
                        .Cells(Lig, 2 + Zone) = 1
                    End If
                End If
             Next i
        Next Lig
    End With

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub
3liste-2.xlsm (21.97 Ko)

Ok,

avant tout merci à tous les deux.

Pedro22, c'est tout à fait ça ! Mais je ne sais pas le faire .. (Après, cela ne me dérange pas si j'ai des colonnes en supplément)

Valc,

Effectivement, là j'ai l'adresse découpée en quatre. Je sais pas pourquoi je dis puisque tu le savais ..

Mais je suis blqoué pour la répartition dans mes zones.

Imaginons que dans la colonne qui indique ce qu'il y a après la ville j'ai "HLM Désirée bat 3 appt 4" et que c'est le mot désirée qui m'intéresse pour mon classement par zone parce que j'ai plein d'adresse avec ce mot là. Comment faire ?

Tu n'as plus qu'à t'amuser pour construire tes listes. Attention de ne pas utiliser de mots communs à 2 zones...

PS: j'ai modifié le code de mon post précédent pour ne pas tenir compte des chiffres en ajoutant l'instruction :

And Not Tableau(i) Like "#/*"
Rechercher des sujets similaires à "programme vba"