VBA Boucle recherche et remplace

Résolu/Fermé
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 - 1 oct. 2010 à 13:48
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 2 oct. 2010 à 08:30
Bonjour,

Je travaille sur 2 fichiers :

l'un contient les 38 000 villes de france avec un numéro d'ordre (insee.xls)
l'autre des adresses avec le nom des villes (mag_brico.xls)

Le but est de remplacer le nom des villes dans mag_brico par le numéro d'ordre de la ville

Je ne parle pas bien le VBA, j'ai écris ça :
(départ de insee.xls)

Sub essai()

' Déclaration des variables
Dim Vil As String
Dim Num As String

' Recherche des variables
'La cellule A2 est vide

Vil = Range("A1").End(xlDown)
Num = Range("A1").End(xlDown).Offset(0, 5)

'Zone de remplacement
Windows("Mag_brico.xls").Activate
Range("F2").Select
Range(Selection, Selection.End(xlDown)).Select

'Remplacement
For Each cell In Selection
cell.Value = Replace(cell, Vil, Num, 1)
Next cell

Windows("insee.xls").Activate
Range("A1").End(xlDown).Select
ActiveCell.ClearContents

Application.Run ("essai2")

End Sub


Sub essai2()

même chose puis

Application.Run ("essai")

End Sub


Bon, pas mal de triche das tout ça...

Du coup le problème est un message d'erreur de type "pile pleine"

Questions :

1 : Est-il nécessaire de gérer les erreurs type

Si le nom de la ville recherché n'existe pas
on oublie et on passe à la suite

Je sais faire du If Then, mais là j'ai une variable au milieu. Je ne sais pas lui dire

For Each cell In Selection
If selection.value="Vil" Then
cell.Value = Replace(cell, Vil, Num, 1)
Else...

2 : Ensuite, je ne sais pas comment lui dire de changer de ville recherche. D'où la triche avec la suppression de la cellule de recherche initiale et A1 puis xl down

3 : plutôt que de demander l'exécution de la même macro sous un autre nom perpétuellement je sais qu'il y a une fonction qui fait ça

DoUntil ... Loop, mais je ne vois pas comment faire



Tout ça n'est pas très clean. Quelqu'un pourrait-il m'aider à faire le ménage ?

Merci pour votre aide !


A voir également:

8 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 1/10/2010 à 15:46
Bonjour

essaies cette macro

Sub coder_commune() 
Dim dico As Object 
Dim derlig As Long, cptr As Long 
Dim insee 

Set dico = CreateObject("Scripting.Dictionary") 
With Workbooks("insee.xls").Sheets(1) 
    derlig = .Range("A40000").End(xlUp).Row 
    For cptr = 2 To derlig 
        'nom de la commune colonne A , code Insee colonne E 
        dico.Add UCase(.Cells(cptr, 1).Value), .Cells(cptr, 5).Value 
    Next 
End With 

Application.ScreenUpdating = False 
With Workbooks("mag_brico.xls").Sheets(1) 
     derlig = .Range("F40000").End(xlUp).Row 
     For cptr = 2 To derlig 
        'remplacement du nom de la commune colonne F par le code insee 
        'le nom reste si mauvaise orthographe ou inconnu 
        insee = dico.Item(UCase(.Cells(cptr, 6).Value)) 
        If insee <> "" Then 
            Cells(cptr, 6) = insee 
        End If 
     Next 
End With 
Set dico = Nothing 
End Sub


ci joint maquette avec quelques communes et codes insee bidons
la macro est dans mag_brico mais peut être mise dans inssee les 2 classeurs doivent être ouverts

http://www.cijoint.fr/cjlink.php?file=cj201010/cijz3ofQA3.zip

merci de ta réponse (avant lundi!...)

edit: j'ai considéré que dans insee, il n'y avait aucune commune ayant exactement le m^eme nom 'sinon la macro plante...
:-x
0
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 1
1 oct. 2010 à 16:09
Michel,

Merci pour ton aide.

Le fichier tel que tu l'as préparé fonctionne à merveille.

Mais quand j'ai remplacé tes données par mes 38 000 lignes, le débogueur s'est arrêté sur la ligne suivante : dico.Add UCase(.Cells(cptr, 1).Value), .Cells(cptr, 5).Value

J'ai tenté pas mal de choses mais j'ai toujours cette erreur

Pour info, le coller se fait sur le fichier depuis lequel la macro a été lancée.
Dans mon fichier mag_brico, les villes sont situées en F1
Souhaites tu que je mette mes fichiers en ligne ?

D'avance merci.

jimmy
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 oct. 2010 à 17:51
Re,

sur l'arrêt

quel était le message d'erreur ?
quel était la valeur de cptr ?
rappel: il ne peut y avoir de doublons dans ta liste de communes

pour mag-brico
Application.ScreenUpdating = False 
With Workbooks("mag_brico.xls").Sheets(1) 
     derlig = .Range("F40000").End(xlUp).Row 
     For cptr = 1 To derlig 
     ...

Pour les classeurs, OK (au format XL97-2003), 1000 lignes suffiront largement
0
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 1
1 oct. 2010 à 18:57
Michel,

Je ne me suis pas expliqué suffisamment alors. Cette opération a pour but de préparer une table pour base de données. Cette table sera pleine de doublons, puisqu'il y aura plusieurs fois le même nom de magasin et de ville (plusieurs bricorama en france et plusieurs magasins de bricolage dans une même ville).

Voici le lien vers mon fichier.

http://www.cijoint.fr/cjlink.php?file=cj201010/cijJ17Cjqp.zip

La liste des magasins est courte pour le moment, je n'ai fait l'extraction que sur 1 dep... il ne m'en reste que quelques uns à faire ! Du coup j'ai adapté la liste insee qui ne comprends que les villes du 59.

Pour répondre à tes question :

Message d'erreur : 457 : Cette clé est déjà associée à un élément de cette collection.
cptr = 1127

Merci pour ton aide.

Jimmy
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 1/10/2010 à 19:33
Bonjour,

Mille excuses de me taper l'incruste, mais effectivement s'il y des doublons, une collection peut poser problème.

Je suggèrerai de passer par une structure qui récupère le nom de la ville et de son numéro insee et ensuite de parcourir le fichier mag_brico pour y affecter les numéros.

Option Explicit 

Private Type myTab 
    ville As String 
    insee As Variant 
End Type 

Sub RemplaveVilleParInsee() 
Dim wk As Workbook 
Dim WkWs As Worksheet 
Dim ws As Worksheet 
Dim Derlig As Long 
Dim i As Long 
Dim j As Long 
Dim mTab() As myTab 
Dim ind As Long 

    'On considère que les données sont dans le classeur 
    'mag_brico.xls sur la feuille 1 sinon modifier le numéro de la feuille 
    Set ws = ThisWorkbook.Worksheets(1) 
     
    'On ouvre le classeur insee.xls /!\(chemin à modifier) 
    Set wk = Workbooks.Open("C:\mondossier\insee.xls") 
    'Ou si le classeur est déjà ouvert 
    '// Set wk = Workbooks("C:\mondossier\insee.xls") 
     
    'On considère que les données sont dans le classeur 
    'insee.xls sur la feuille 1 sinon modifier le numéro de la feuille 
    Set WkWs = wk.Worksheets(1) 
     
    'On considère que le nom de villes est dans la colonne A et le n° INSEE dans la colonne F 
    'Le tableau commence ligne 2 
     
    'On met en mémoire (dans la structure mTab() le nom de la ville et n° INSEE associé) 
    Derlig = WkWs.Range("A2").End(xlDown) 
    For i = 2 To Derlig 
    ReDim Preserve mTab(ind)    
        mTab(i).ville = WkWs.Range("A" & i).Value 
        mTab(i).insee = WkWs.Range("F" & i).Value 
        ind = ind + 1 
    Next i 
     
    'On remplace dans mag_brico, le nom de la ville par le n° insee 
    'On considère que la ville se trouve en colonne F et le tableau commence ligne 2 
    Derlig = ws.Range("F2").End(xlDown) 
    For i = LBound(mTab()) To UBound(mTab()) 
        For j = 2 To Derlig 
            If UCase(mTab(i).ville) = UCase(ws.Range("F" & j).Value) Then 
                ws.Range("F" & j).Value = mTab(i).insee 
            End If 
        Next j 
    Next i 
     
    wk.Close (savechanges = False) 
    Set WkWs = Nothing 
    Set wk = Nothing 
    Set ws = Nothing 
       
End Sub


Je n'ai pas testé, je n'ai pas chargé les fichiers, j'ai modifié un code que j'avais sous la main qui faisait sensiblement la même chose.

;o)
«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 1
1 oct. 2010 à 21:48
Bonsoir Polux31,

J'ai testé ton code, j'ai eu une première erreur sur savechanges = false, à la fin, je l'ai enlevé pour poursuivre le test.
Nouvelle erreur : Erreur d'exécution 13 Incompatibilité de type

Derling = 0

J'avoue que là je suis perdu, je n'approche le VBA que quand nécessaire, je pensais pouvoir me contenter d'un for each... et d'une boucle.

Là je ne maîtrise pas votre niveau de code, du coup je ne comprends pas les causes de dysfonctionnement et ne peux que vous rendre compte de mes test.

En tout cas, merci pour vos réponses !

Jimmy
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 1/10/2010 à 22:58
Jimmy,

ca ne marche pas car dans ton 1° message tu situe le N° INSEE dans la colonne E
Num = Range("A1").End(xlDown).Offset(0, 5) 

dans ton envoi de classeurs, la colonne E dans Insee correspond au département (59) tandis que le N° Insse est colonne C !!!!
comme il y a autant de 59 que de communes ca plante forcément d(où l'erreur 457
:-(
d'autre part dans mag_brico colonne F on démarre bien ligne 2 et non ligne 1 comme tu me demandais de modifier
:-(

tu as des orthographes qui de correspondent pas
par ex hellesmes au lieu de hellesles lille ou helemes

ci joint les classeurs en retour
http://www.cijoint.fr/cjlink.php?file=cj201010/cijrzQVUE9.zip

en espèrant que :-)

La prochaine fois, fais bien attention aux données que tu communiques :-)
edit 22:57 changé pièce jointes
:-x
0
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 1
1 oct. 2010 à 23:17
Michel,

Merci pour cette réponse tardive.

En fait, j'ai fait une erreur dans ma formule si on arrivait sur dep et non numéro...

En revanche, j'ai téléchargé et testé ta macro, rien ne se passe... J'ai lu le code donc j'ai modifié les noms de fichier pour qu'ils collent, toujours rien...

Pour l'heure, je ne t'embête plus !

Jimmy
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
2 oct. 2010 à 08:30
Bonjour

Un point oublié devant cells et tout s'est inscrit colonne F de insee!

donc:

Sub coder_commune()
Dim dico As Object
Dim derlig As Long, cptr As Long
Dim insee

Set dico = CreateObject("Scripting.Dictionary")
With Workbooks("insee.xls").Sheets(1)
    derlig = .Range("A40000").End(xlUp).Row
    For cptr = 2 To derlig
        'nom de la commune colonne A , code Insee colonne C
        dico.Add UCase(.Cells(cptr, 1).Value), .Cells(cptr, 3).Value
    Next
End With

Application.ScreenUpdating = False
With Workbooks("mag_brico.xls").Sheets("magasin")
     derlig = .Range("F40000").End(xlUp).Row
     For cptr = 2 To derlig
        'remplacement du nom de la commune colonne F par le code insee
        'le nom reste si mauvaise orthographe ou inconnu
        insee = dico.Item(UCase(.Cells(cptr, 6).Value))
        If insee <> "" Then
            .Cells(cptr, 6) = insee
        End If
     Next
     .Activate
End With

End Sub

0