VBA : valeurs à corriger (villes par ex.)

Bonjour,

Je suis à la recherche de conseils : je charge régulièrement des données dans lesquelles il y a des adresses de tous pays dont les champs sont découpés par des virgules.

J'en extrait notamment les villes. Or, elles contiennent souvent des éléments dont je n'ai pas besoin, comme par exemple :

London SW17 0RE

I-06100 Perugia

Dublin 8

E-28040 Madrid

F-75019 Paris

F-51100 Reims

F-51100 Reims

F-51100 Reims

Que me conseillez-vous? Préparer un fichier de correspondance du type London SW17 0RE=London dans un tableau et faire un script "si ville = London SW17 0RE alors le remplacer par London"?

Ou bien existe-t-il une procédure plus spécifique?

Merci pour votre aide éventuelle.

Bonsoir,

Une piste : avoir un onglet (ou fichier de correspondance).

Ensuite, RECHERCHEV

Sinon, possibilité de passer par une macro (toujours avec fichier de correspondance), pour modifier directement les données dans le fichier source, sans avoir de formule.

Cf exemple en PJ à tester (piste 1)

Bonne soirée

Bouben

Merci beaucoup pour votre réponse.

Le problème du recherchev est que j'ai trop de données. Ca va être trop lourd. En outre, ma demande s'intègre dans une batterie d'autres macro. Je vais mettre un temps fou.

A priori, je me dirige vers un fichier de correspondance externe à exploiter via une macro. J'enregistre mes données dans un tableau :

tableau(0,0)=cells(i, j)

Tableau(1,0)=cells(i+1,j).....

Puis, un if pays=blabla, chercher blabla dans tableau et prendre la valeur correspondante.

Cela me semble pourtant barbare...

Si quelqu'un a une idée...

Bonsoir,

Effectivement, dans ce contexte, c'est mieux.

Je pars sur une nouvelle proposition ...

Bouben

Bonsoir,

Ci-joint une nouvelle proposition à tester :

> fichier Dico avec les noms bruts & modifiés

> fichier principal, avec macro (chemin du Dico à modifier dans le code VBA)

Bonne soirée

Bouben

8dico.xlsx (9.89 Ko)

Oula!!!!

Merci beaucoup! Je suis un peu éteinte à cette heure-ci. Je regarde cela dès demain matin. Votre travail semble plus pro et rapide que ce à quoi je songeais.

1000 mercis! Je vous tiens au courant.

Bonne nuit.


Je ne comprends pas comment cela fonctionne : j'ai effacé la colonne A, ai lancé la macro (en modifiant le chemin d'accès de dico) mais les cellules restent vides...

Bonjour,

Autre proposition.

Le point commun étant la présence d'un chiffre, élimine toute partie en contenant un.

A voir si ça se confirme sur toutes tes villes ou s'il y a des exceptions à traiter autrement.

eric

7ville.xlsm (18.48 Ko)

Bonjour,

Très très bonne idée : je n'avais pensé à vérifier le "numeric" dans le split.

Le résultat est très bon (PJ). Après, il y a quelques ajustements à faire, mais au cas par cas.

Merci beaucoup, vraiment. J'avance dans mon parsing à grand pas grâce à vous. MERCI!

7ville-v02.xlsm (299.77 Ko)

Bonjour,

Ajustement :

Sub ville()
    Const exclu As String = ",C,E,K,W,M,N,S,AE,AN,AP,AV,AZ,BA,BN,CA,CG,CK,CX,DB,DR,ED,GT,GV,TB,HB,MD,NJ,RB,RP,RZ,XH,"
    Dim datas, decoup, lig As Long
    Dim i As Long, j As Long, k As Long

    datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1)
    For lig = 1 To UBound(datas)
        decoup = Split(Application.Trim(datas(lig, 1)), " ")
        For i = 0 To UBound(decoup)
            For j = 1 To Len(decoup(i))
                If IsNumeric(Mid(decoup(i), j, 1)) Or InStr(exclu, "," & UCase(decoup(i)) & ",") > 0 Then
                    decoup(i) = ""
                    Exit For
                End If
            Next j
        Next i
        datas(lig, 1) = Application.Trim(Join(decoup, " "))
    Next lig
    [B2].Resize(UBound(datas)) = datas
End Sub

Il reste LE Tilburg mais ça parait difficile d'éliminer LE, et peut-être encore qq résidus.

Ne pas oublier la "," en début et fin de la constante.

eric

Génial.

Dites-moi si ma compréhension est correcte :

Const exclu As String = ",C,E,K,W,M,N,S,AE,AN,AP,AV,AZ,BA,BN,CA,CG,CK,CX,DB,DR,ED,GT,GV,TB,HB,MD,NJ,RB,RP,RZ,XH,"

On l'utilise pour vérifier s'il existe l'un de ces codes dans le nom de la ville afin de le supprimer (d'où ce que vous dites sur les virgules). Le découpage de "CX Utrecht" : la macro vérifie à l'aide du Instr si ",CX," fait partie de Const.

Application.Trim(Join(decoup, " "))

Je ne connaissais pas le Join : c'est l'opposé du Split. On agrège les mots composant la ville avec le délimiteur "espace".

Enfin, j'ai enlevé quelques lignes de votre script car je travaille sur des TXT. Du coup, les "lig" ne me sont pas utiles.

Const exclu As String = ",C,E,K,W,M,N,S,AE,AN,AP,AV,AZ,BA,BN,CA,CG,CK,CX,DB,DR,ED,GT,GV,TB,HB,MD,NJ,RB,RP,RZ,XH,"
Datas = Ville
    decoup = Split(Application.Trim(Datas), " ")
    For i = 0 To UBound(decoup)
        For j = 1 To Len(decoup(i))
            If IsNumeric(Mid(decoup(i), j, 1)) Or InStr(exclu, "," & UCase(decoup(i)) & ",") > 0 Then
                decoup(i) = ""
                Exit For
            End If
        Next j
    Next i
    Datas = Application.Trim(Join(decoup, " "))
Ville = Datas

Encore merci. Vous m'aidez vraiment beaucoup et vous appréhendez parfaitement mes difficultés.

1) oui

il faut rechercher ",C," et non "C" sinon on supprime tous les mots contenant C.

On aurait pu travailler sur le mot complet "C" avec un dictionary mais tu n'es peut-être pas à 1s près.

2) oui

3) oui, c'est un exemple à adapter au besoin réel, surtout si tes données sont ailleurs.

eric

Merci pour tout. Faut-il clôturer ce post, genre "résolu"?

Tu peux oui

Sur le post avec la bonne réponse

Rechercher des sujets similaires à "vba valeurs corriger villes"