VBA Boucle recherche et remplace
Résolu
Jimmy59116
Messages postés
45
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
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 !
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:
- VBA Boucle recherche et remplace
- Quel site remplace coco - Accueil - Réseaux sociaux
- Fermeture de Coco : les internautes à la recherche d'un remplaçant - Accueil - Réseaux sociaux
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Recherche et remplacer word - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
8 réponses
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
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
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
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
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
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
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
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
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