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
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
A voir également:
- VBA Boucle recherche et remplace
- Quel site remplace coco - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Rechercher et remplacer word - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
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 312
Modifié par michel_m le 1/10/2010 à 15:46
Modifié par michel_m le 1/10/2010 à 15:46
Bonjour
essaies cette macro
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
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
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
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
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
1 oct. 2010 à 17:51
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
Pour les classeurs, OK (au format XL97-2003), 1000 lignes suffiront largement
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
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
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
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
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
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.
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
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
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
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
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
Modifié par michel_m le 1/10/2010 à 22:58
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
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
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
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
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
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
2 oct. 2010 à 08:30
2 oct. 2010 à 08:30
Bonjour
Un point oublié devant cells et tout s'est inscrit colonne F de insee!
donc:
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