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 :

Séparer une chaîne de caractères - adresses [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    technique
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut Séparer une chaîne de caractères - adresses
    Bonjour à Tous,

    Je suis à la recherche d'une méthode de séparation "efficace" pour scinder des adresses contenant les numéros de police et la voie. Mais ma liste d'adresse contient évidement des spécificités outre les Bis Ter... il y a les "6 bat A" et autre "4 et 6"... bref il y a beaucoup de pièges.

    Je souhaiterais tester la méthode qui consiste à rechercher les différentes possibilités de nommage de la voie "rue"; "av"; "pl"; "boulv" ;"bd" ;"imp" ;"che" ;"res" ;"mail"; "rond"...repérer leur position et séparer la chaîne.

    Il n'est a priori pas possible d'utiliser la simple formule, mais je cherche une macro qui ferait ça :
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =CHERCHE(OU("rue";"av";"pl";"boulv";"bd";"imp";"che";"res";"mail";"rond");[@Rue];1)

    J’ai donc imaginer une macro comme cela mais je ne maîtrise pas suffisamment le code VBA pour y arriver seul, c'est pour cela que je vous demande votre aide bienveillante :

    mon classeur excel contient 2 feuilles une "adresses" et une "list" je vous joins un extrait.

    for i = 1 to le nombre de possibilité dans la liste
     
        Sélection de la i-eme valeur à tester   .Range("A" & Rows.Count).End(xlUp).Row
        if c'est présent dans la chaîne a tester "adresse" et ou dans la chaîne
            Séparer la chaîne en 2 sur les 2 colonnes suivantes
            exit for
        end if
    next i

    Comme je vous le dis j'ai bien l'idée mais pas les compétences.
    Merci d'avance pour votre aide.

    Vincent
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,
    Citation Envoyé par 20dxxx Voir le message
    Je suis à la recherche d'une méthode de séparation "efficace" pour scinder des adresses contenant les numéros de police et la voie.
    Si tu cherches un peu dans les nombreux sujets qui traitent de ce problème tu t’apercevras qu'il n'y a pas meilleure compétence sur le sujet que le cerceau humain utilisant le clavier.
    Les enregistrements non formatés sont tellement fantaisistes qu'une méthode ne permet de les formater de façon judicieuse.

    liens : formater adresses

  3. #3
    Membre averti
    Homme Profil pro
    technique
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut ben oui, mais non.
    Bonjour anasecu,

    Tu as tout à fait raison, le cerveau humain n'est pas près d’être supplanté, mais dans mon cas, j'ai ~85 000 lignes à traiter et la machine, même si elle est imparfaite, va beaucoup plus vite que moi.

    J’ai pris du temps pour écrire un bout de code VBA qui fonctionne bien, il reste 0.3% de traitement manuelle ce qui est raisonnable. Quelques erreurs dues à la présence de 2 codes dans la chaine (d'où l'importance de l’ordonnancement de la table des séparateurs) :
    42 COURS AVARICUM (présence de 2 code séparateur)
    35 GRANDE RUE DE LA GENETTE (position de rue postérieure)
    Voici mon code :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Sub separ_voie()
     
    'déclarations variables ---------------
    Dim i As Long
    Dim q As Long
    Dim Adr As String
    Dim x_pos As Long
    Dim tab_val(31) As String
     
    'enregistrement des valeurs dans le tableau leur ordre a de l'importance dans le traitement
    'car c'est la premiere chaine rencontrée qui fera passer à la ligne suivante ---------------
     
    tab_val(0) = "rue"
    tab_val(1) = "boule"
    tab_val(2) = "place"
    tab_val(3) = "av"
    tab_val(4) = "bd"
    tab_val(5) = "imp"
    tab_val(6) = "route"
    tab_val(7) = "cour"
    tab_val(8) = "mail"
    tab_val(9) = "rond"
    tab_val(10) = "che"
    tab_val(11) = "rt"
    tab_val(12) = "all"
    tab_val(13) = "res"
    tab_val(14) = "cit"
    tab_val(15) = "quai"
    tab_val(16) = "sq"
    tab_val(17) = "pas"
    tab_val(18) = "cloit"
    tab_val(19) = "parc"
    tab_val(20) = "carre"
    tab_val(21) = "jard"
    tab_val(22) = "clo"
    tab_val(23) = "esp"
    tab_val(24) = "faub"
    tab_val(25) = "venel"
    tab_val(26) = "prom"
    tab_val(27) = "parv"
    tab_val(28) = "lieu"
    tab_val(29) = "hlm"
    tab_val(30) = "chauss"
    tab_val(31) = "sent"
     
     
    Application.ScreenUpdating = False
     
    With Sheets("adresses") ' nom de la feuille
                                       '| 5 est mon numéro de colonne
                                       'V
        For i = 2 To .Cells(Rows.Count, 5).End(xlUp).Row
            Adr = .Cells(i, 5).Value
     
            For q = 0 To UBound(tab_val)
                x_pos = InStr(1, Adr, tab_val(q), 1)
     
                If x_pos <> 0 Then
                    .Cells(i, 6).Value = Trim(Mid(Adr, 1, x_pos - 1))   ' /!\ il faut que les colonne 6 et 7 soient vide
                    .Cells(i, 7).Value = Trim(Mid(Adr, x_pos, Len(Adr)))
                    Exit For
                End If
     
            Next q
     
         Next i
     
    End With
     
    End Sub

  4. #4
    Expert éminent 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
    Par défaut
    La seule méthode que je vois est de faire une double boucle.

    Une première qui tourne sur toutes les lignes d'adresse.
    Pour chaque ligne, faire tourner une seconde boucle qui scrute la liste des nom de voie (à mon avis, la liste devrait être bien plus longue que celle que tu montres).
    Pour chaque adresse et chaque nom de voie, utiliser une fonction InStr pour vérifier si cette dénomination est présente dans l'adresse (résultat > 0).
    Si c'est le cas, procéder à la séparation à la position spécifiée par InStr en utilisant les fonction Left et Mid.

    Mais, à mon avis, c'est aussi fiable que des promesse de campagne d'un politicien.

    Par exemple, avec "av", l'adresse "rue des avions" déclenchera positif et avec "pl", tu auras un positif sur "rue des platanes".
    On pourrait multiplier ces exemples à l'infini.

    Cela dit, personnellement, autant séparer le code postal ou la ville, je comprends que ça puisse avoir un intérêt pour regrouper des localisations, autant je ne vois pas vraiment l'intérêt de dissocier le numéro de la rue.

  5. #5
    Membre averti
    Homme Profil pro
    technique
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut numéro de rue et géocodage des adresses
    Citation Envoyé par Menhir Voir le message

    Cela dit, personnellement, autant séparer le code postal ou la ville, je comprends que ça puisse avoir un intérêt pour regrouper des localisations, autant je ne vois pas vraiment l'intérêt de dissocier le numéro de la rue.
    merci beaucoup pour ta réponse.

    disposer du numéro dans la voie permet un géocodage au numéro et non à la rue. Il est alors bien plus précis.


  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Tu peux t'inspirer de ceci : Utilisation de la fonction Split.


    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
    38
    39
     
    Sub tt()
     
    Set sh = Worksheets("adresses")
    sh.Activate
    dern = sh.Cells(Rows.Count, 2).End(xlUp).Row
    For i = 2 To dern
     Set c = sh.Cells(i, 2)
     c.Select
     
     Call GetNumeroRue(c.Value, numero, rue)
     
     c.Offset(, 1) = "'" & numero
     c.Offset(, 2) = "'" & rue
    Next
    End Sub
     
    Sub GetNumeroRue(ByVal valeur, numero, rue)
     numero = ""
     rue = ""
     t = Split(Trim(valeur), " ")
    debut = 0
    If Val(t(0)) <> 0 Then
     numero = t(0) & " "
     debut = 1
    End If
    For i = debut To UBound(t)
     
    If oknumero <> True And Len(t(i)) < 2 Then
       numero = Trim(numero) & " " & t(i)
     Else
       oknumero = True
       rue = Trim(rue) & " " & t(i)
     End If
     
    Next
    numero = Trim(numero)
    rue = Trim(rue)
    End Sub

  7. #7
    Expert éminent 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
    Par défaut
    Et avoir le numéro dans l'adresse ne permet pas le géocodage ?...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/08/2018, 12h20
  2. Réponses: 10
    Dernier message: 29/05/2012, 15h27
  3. Réponses: 16
    Dernier message: 10/07/2008, 15h55
  4. Séparer une chaîne de caractère
    Par Ykaar dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/05/2007, 08h16
  5. Séparer une chaîne de caractères en js
    Par PedroBD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/07/2006, 13h15

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