VBA - Extraire nom d'un fichier / Chercher et remplacer valeurs

Y compris Power BI, Power Query et toute autre question en lien avec Excel
D
DamienH
Jeune membre
Jeune membre
Messages : 16
Inscrit le : 3 novembre 2017
Version d'Excel : FR 2010

Message par DamienH » 18 janvier 2018, 16:47

Bonjour à tous,

Débutant de chez débutant en VBA, je me suis lancé comme objectif de réaliser une macro complète pour mettre à jour en un clic un reporting mensuel!

J'ai pour le moment 2 petits soucis que je n'arrive pas à résoudre.

1er soucis : J'aimerais pouvoir extraire le nom du fichier que je copie avec ma macro afin de l'utiliser dans mon fichier cible (pour renommer l'onglet correspondant et dans un Msgbox du type "le reporting a bien été mis à jour avec (lenomdufichier)"
Le code me servant à ouvrir un nouveau fichier pour en extraire les données:

Dim wb As Workbook
Set wb = ThisWorkbook
my_filename = Application.GetOpenFilename
If my_filename <> False Then
Workbooks.Open Filename:=my_filename
End If

Columns("A:AS").Select
Selection.Copy

wb.Activate
Worksheets(3).Activate
Range("A1").Select
Selection.PasteSpecial


2ème soucis : Je voudrais utiliser ma macro pour remplacer le contenu des cellules d'une colonne cible spécifique en me basant sur une table de 2 colonnes (1ère colonne : valeur recherchée, 2ème colonne : contenu de remplacement). Je précise quand même que j'aimerais garder la valeur initiale dans ma colonne cible quand la macro ne trouve pas de valeur correspondant avec ma table
J'ai trouvé ce bout de code sur internet:

Dim sht As Worksheet
Dim fndList As Integer
Dim rplcList As Integer
Dim tbl As ListObject
Dim myArray As Variant

'Create variable to point to your table
Set tbl = Worksheets("Sheet16").ListObjects("Table1")

'Create an Array out of the Table's Data
Set TempArray = tbl.DataBodyRange
myArray = Application.Transpose(TempArray)

'Designate Columns for Find/Replace data
fndList = 1
rplcList = 2

'Loop through each item in Array lists
For x = LBound(myArray, 1) To UBound(myArray, 2)

'Loop through each worksheet in ActiveWorkbook (skip sheet with table in it)
For Each sht In ActiveWorkbook.Worksheets
If sht.Name <> tbl.Parent.Name Then

sht.Cells.Replace What:=myArray(fndList, x), Replacement:=myArray(rplcList, x), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False

End If
Next sht
Next x

En essayant de faire fonctionner ce code j'ai une Run-time error '9' : subscript out of range au niveau de Set tbl. Ma table se trouve dans ma worksheet("16") et j'ai essayé d'en faire un tableau/de la nommer "Table1". Je ne comprends pas pourquoi ce code ne marche pas étant donné que j'ai seulement copié/collé et modifié les valeurs pour correspondre à mon classeur.

Mais mon soucis est que ce code est adapté pour remplacer toutes les valeurs de toutes les feuilles de mon classeur alors que je voudrais limiter la macro à la colonne "AT" de ma worksheet("13").

Je ne sais pas si mes 2 problèmes nécessitaient d'ouvrir 2 sujets différents, si cela est le cas je m'en excuse.
Je me doute que ces soucis proviennent directement de mon manque de connaissance dans la syntaxe vba, mais après plusieurs heures de recherches je m'avoue vaincu... Je remercie donc par avance quiconque prendra le temps de se pencher dessus.

Cordialement,
Avatar du membre
Jers19
Membre fidèle
Membre fidèle
Messages : 295
Appréciations reçues : 27
Inscrit le : 14 septembre 2017
Version d'Excel : 2010

Message par Jers19 » 20 janvier 2018, 12:05

Salut,

Il faut que tu postes des fichiers Excel pour que l'on puisse t'aider.

A+
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 444
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 20 janvier 2018, 15:40

Bonjour,

D'abord ! :mrgreen: au-dessus de ta fenêtre de rédaction de post, tu as une série de boutons, dont un sur lequel apparaît cette mention : </>. Tu regardes et tu repères soigneusement ce bouton, il te servira à placer le code que tu cites sous balises Code, ce qui le fait apparaître dans une fenêtre Code, dans laquelle son indentation est conservée (enfin si tu l'indentes ! :) sinon tu auras quelques commentaires supplémentaires de ma part sur le fait qu'un code non indenté ou mal ne peut pas être lu rapidement correctement...).
Mais le mettre sous balises améliore déjà nettement sa lisibilité et tout le monde t'en saura gré !

Ensuite une macro (en nous limitant aux procédures Sub) commence par Sub (ou Private Sub) et se termine par End Sub, ces deux instructions liées constituent la déclaration de procédure. Lorsqu'on soumet un code à évaluation, il est bon qu'elles figurent toujours, de façon à garantir que tout le code est bien cité ! :wink:

Quelques remarques :
    Set wb = ThisWorkbook 
Ceci est une pure annerie ! :lol: La propriété ThisWorkbook se suffit à elle-même et dispense de gaspiller une variable inutilement.
Tu aurais plus utilement utilisé ta variable wb ainsi :
    Set wb = Workbooks.Open(my_filename)
Tu aurais plus aisément par la suite récupéré le nom du fichier avec : wb.Name et cela t'aurait permis de qualifier tes expressions lors de la manipulation du classeur :
    wb.Worksheets(1).Columns("A:AS").Copy
car même si ton classeur n'a qu'une feuille il demeure souhaitable de ne pas ignorer la feuille contenant la plage ciblée... et si on doit copier, on évite les Select inutiles et chronophages, on copie ! (copier des colonnes entières n'est tout de même pas ce qu'il y a de plus fameux... )

Et pareil pour coller :
    ThisWorkbook.Worksheets(3).Range("A1").PasteSpecial xlPasteValues
Ce qui est tout de même mieux (encore que le mieux aurait été de ne pas copier ni coller !)

Pour ce qui est de ton autre code récupéré, dont on n'a aucune idée si les objets qu'il invoquent figurent dans ton classeur, on ne va pas s'engager là dedans sans fichier ad-hoc, je rejoins pleinement Jers sur ce point.

Cordialement.
D
DamienH
Jeune membre
Jeune membre
Messages : 16
Inscrit le : 3 novembre 2017
Version d'Excel : FR 2010

Message par DamienH » 22 janvier 2018, 14:01

Bonjour,
Tout d'abord merci à vous 2 pour vos réponses, je vous présente mes excuses pour l'oubli des balises de code, j'y penserais dorénavant!

J'ai au final réussi à extraire le nom du fichier pour m'en servir dans un MsgBox/renommer l'onglet grâce à la ligne de code suivante :
Filename = Mid(Filename, InStrRev(Filename, "\") + 1)

Pour mon deuxième problème qui est d'effectuer une série de remplacements de texte dans une colonne spécifique en se basant sur des données stockées dans un onglet différent, j'ai trouvé une autre solution sur internet, tout le code s'exécute mais sans aucun résultat...

Le code en question:
Sub myReplace()

    Dim myDataSheet As Worksheet
    Dim myReplaceSheet As Worksheet
    Dim myLastRow As Long
    Dim myRow As Long
    Dim myFind As String
    Dim myReplace As String
    
'   Specify name of Data sheet
    Set myDataSheet = Worksheets(2)
    
'   Specify name of Sheet with list of replacements
    Set myReplaceSheet = Worksheets(1)
    
'   Assuming list of replacement start in column A on row 1, find last entry in list
    myLastRow = myReplaceSheet.Cells(Rows.Count, "A").End(xlUp).Row
    
    Application.ScreenUpdating = False
    
'   Loop through all list of replacments
    For myRow = 1 To myLastRow
'       Get find and replace values (from columns A and B)
        myFind = myReplaceSheet.Cells(myRow, "A")
        myReplace = myReplaceSheet.Cells(myRow, "B")
'       Start at top of data sheet and do replacements
        myDataSheet.Activate
        Range("A1").Select
'       Ignore errors that result from finding no matches
        On Error Resume Next
'       Do all replacements on column A of data sheet
        Columns("A1:A5000").Replace What:=myFind, Replacement:=myReplace, LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
'       Reset error checking
        On Error GoTo 0
    Next myRow
    
    Application.ScreenUpdating = True
    
    MsgBox "Replacements complete!"
    
End Sub
Je ne sais pas quelle est la meilleure méthode entre le code que j'ai posté dans mon premier message et utilisant la fonction array ou le code cité dans ce message.
Je vous joins un fichier exemple avec en module 2 le code avec fonction array que j'ai essayé d'adapter au fichier exemple, mais j'avoue n'avoir aucune idée de la syntaxe pour faire une boucle sur une colonne au lieu d'une feuille .... Et en module 1 le même code que celui contenu dans ce message.

MFerrand par contre je reviens sur ce que tu me dis: le fichier que je copie a un nombre de lignes variable mais de colonnes fixe, c'est pour cela que j'ai choisi de copier/coller les colonnes, tu me dis que ce n'est pas le plus optimal, pourrais-tu me dire ce qui le serait selon toi?
Je ne l'ai pas précisé mais les données collées servent à alimenter plusieurs formules/TCD dans d'autres onglets et il me semblait plus facile de mettre à jour la plage de données des TCD que d'importer un nouvel onglet dans mon rapport.

Encore une fois merci pour vos conseils d'optimisation et votre bienveillance vis à vis des novices du forum!

Cordialement,
Exemplesearchandreplace.xlsm
(18.06 Kio) Téléchargé 11 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 444
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 22 janvier 2018, 21:34

Bonsoir,
J'ai au final réussi à extraire le nom du fichier pour m'en servir dans un MsgBox/renommer l'onglet grâce à la ligne de code suivante :
Si tu n'as pas compris qu'un objet Workbook disposait d'une propriété Name qu'il suffisait d'invoquer pour qu'elle te livre le nom du fichier, ainsi que je crois l'avoir clairement indiqué... pour en finir par la gynmnastique que tu as cru devoir faire, cela ne me donne guère envie de poursuivre :mrgreen: .

Je suis là parce que j'aime assez discuter de problèmes qui font l'objet de ce Forum et contribuer à en résoudre, mais me voir soumettre le moindre torchon dégotté dans un quelconque coin du net, et en anglais qui plus est ! (pour moi ça ne fait pas plus pro, mais cela dénote une tournure d'esprit du ramasseur...) alors que le problème n'a même pas été sérieusement évoquée, décrit, explicité...

En tout cas, le dernier code est mal fagotté et je ne le retiendrai pas (même en faisant abstraction du fait que je préfère écrire le code moi-même), bien qu'il ait une chance de pouvoir fonctionner si tu avais adapté le fichier au code ou le code au fichier (mais ce n'est pas parce qu'un code fonctionne que je vais le trouver bon...)
Le précédent est de meilleure tenue, mais totalement inadapté à ton fichier, il faudrait donc le réécrire et je n'ai aucune envie de le faire parce que ce n'est pas la méthode que je retiendrais.

Une boucle est une façon de répéter une action en boucle, comme son nom l'indique en parcourant ou non des éléments, en mettant ou pas l'action sous condition... On fait beaucoup de choses avec des boucles, cela permet surtout si on a une action à répéter 100 fois de ne pas l'écrire 100 fois, mais une seule...
On parcourt n'importe quoi qui se prête à comptage numérique avec une boucle For... Next, des lignes, des colonnes, des feuilles, des caractères... et sans parcourir quoi que ce soit on peut simplement répéter une action un nombre prédéfini de fois... On parcourt les objets d'une collection avec une boucle For Each... Next... Et on peut se livrer à une action répétée tant qu'une condition est satisfaite ou tant qu'une condition d'arrêt n'est pas atteinte avec une boucle Do... Loop.

Pour reproduire des données ailleurs que là où elles sont, le plus optimal, c'est d'abord de se limiter aux données que l'on veut reproduire, ensuite de ne copier et coller que s'il s'avère que le résultat sera mieux atteint et plus vite de cette façon qu'en procédant par affectations de valeurs (sans copier ni coller). Chaque situation étant spécifique, il convient d'abord de l'analyser pour définir quelle méthode s'avèrera la plus efficace et la plus rapide.

Cordialement.
D
DamienH
Jeune membre
Jeune membre
Messages : 16
Inscrit le : 3 novembre 2017
Version d'Excel : FR 2010

Message par DamienH » 23 janvier 2018, 13:24

Bonjour MFerrand,

Effectivement je n'avais pas bien compris que le plus simple pour extraire le nom d'un fichier était d'utiliser la fonction name, je l'ai maintenant assimilé. Je t'avoue que le fait que je sois déjà arrivé au résultat escompté par un autre moyen (débile, certes, mais qui marche) m'a fait lire ta réponse en diagonale.

N'étant pas trop mauvais en anglais, je ne m'étais pas rendu compte que le fait que les commentaires ne soient pas écrits en français pouvait poser problème à certaines personnes, j'y ferais attention si j'en viens à redemander de l'aide.

Par contre, n'ayant pas de formation informatique et comme je l'ai précisé, c'est la première fois que j'ai à écrire une macro en VBA, je t'avoue que 99% de mon code vient de l'enregistreur de macro ou de code récupéré sur internet, le fait que ce code soit un torchon ou non, qu'il soit mal fagotté ou tout simplement pourri m'est totalement inconnu, bien sûr je peux comprendre que faire une boucle pour une certaine action soit plus optimal qu'écrire 100 lignes de code pour faire 100 fois la même action, merci pour tes précisions sur les boucles, je vais essayer de m'en servir pour réécrire la première version postée puisque tu me dis qu'elle est plus "propre".

En postant mon message je pensais qu'avec seulement 2 ou 3 lignes à modifier ce code s'adapterait parfaitement à ma macro et qu'un habitué en aurait pour moins d'une minute, mais je me suis apparemment trompé. J'ai mis la main sur plusieurs ouvrages traitant du vba mais n'ai pour l'instant pu que les feuilleter rapidement sans trouver le bon chapitre pour m'aider. Comme je l'ai dit, tout le code que j'utilise pour l'instant vient de l'enregistreur/de code recyclé, ce n'est pas pour te manquer de respect que je ressors les même sources ici, c'est juste que je suis absolument incapable d'écrire une macro de A à Z, j'ai donc trouvé ce qui ressemblait le plus à une solution en espérant que quelqu'un puisse l'adapter à ma situation sans se casser la tête.

alors que le problème n'a même pas été sérieusement évoquée, décrit, explicité...
Je voudrais utiliser ma macro pour remplacer le contenu des cellules d'une colonne cible spécifique en me basant sur une table de 2 colonnes (1ère colonne : valeur recherchée, 2ème colonne : contenu de remplacement). Je précise quand même que j'aimerais garder la valeur initiale dans ma colonne cible quand la macro ne trouve pas de valeur correspondant avec ma table
Je suis d'accord pour dire que j'ai eu tort de ne pas joindre de fichier afin de faciliter la compréhension de mon problème mais je pensais ma description assez claire, la preuve étant que tu as compris ce que je voulais non?

Pour en revenir au copier/coller, ce que je vais copier est un extrait de base de données où les données évoluent, pour un même identifiant d'un extrait à l'autre, toutes les valeurs associées sont susceptibles de changer, c'est pour cela qu'il me semble plus simple de copier/coller que mettre à jour les valeurs et rajouter les nouvelles lignes ensuite.

Cordialement,
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 444
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 23 janvier 2018, 16:56

Bonjour,
Je t'avoue que le fait que je sois déjà arrivé au résultat escompté par un autre moyen (débile, certes, mais qui marche)
Je n'ai surtout pas dit : débile ! :) Il s'agissait d'une manipulation de chaîne, pas vraiment simpliste, et en tant que telle correctement menée... J'ai parlé je crois de gymnastique inutilement compliquée, le nom t'étant livré par une propriété de l'objet, accessible en lecture, il suffisait donc de lire cette propriété une fois le classeur ouvert, tout simplement par :
    nomCl = ActiveWorkbook.Name
ou bien comme je l'avais indiqué, en affectant le classeur à une variable Workbook, tu avais à la fois un moyen de manipuler à tout moment le classeur sans avoir à te préoccuper de son nom, et si besoin du nom il était à ta disposition en permanence de la même façon...
je t'avoue que 99% de mon code vient de l'enregistreur de macro ou de code récupéré sur internet
Le problème de l'enregistreur, c'est qu'il ne code pas ! :wink: il traduit des manipulations en code, et n'ayant aucune vue sur la finalité de ce que tu fais, il traduit tous les mouvements, y compris les faux, et ceux qui seront inutiles en VBA mais auxquels on n'achappe pas en manuel. D'où, du fait qu'en manuel tu ne peux que sélectionner ce sur quoi tu veux agir, l'abondance de Select, Selection et Activate dont VBA n'a nul besoin pour opérer et qui le ralentissent... De même, si tu modifies un paramètre de commande, l'enregistreur te renvoie la valeur de tous les paramètres, y compris ceux auxquels tu ne touche pas et qui sont restés à leur valeur par défaut, mais l'enregistreur l'ignore... d'où un code souvent interminable et bourré d'éléments dont on peut se dispenser.

Quant au code récupéré sur internet, il n'offre aucune garantie de qualité, en dehors des quelques sites spécialisés que nous connaissons... lesquels n'offrent d'ailleurs pas un code prêt à l'emploi, mais répondant à un type de situation et adaptable. Je n'exclue pas que l'on puisse trouver par ailleurs du code de grande qualité, mais il y a lieu de penser qu'il a été produit pour répondre à un problème donné dans une situation donnée et qu'il ne sera pas adaptable dans une autre situation, même proche (ou du moins pas facilement, et il est toujours plus sûr de reprendre le problème à la base)...
Il m'est arrivé fréquemment de dire à un demandeur ayant trouvé du code que j'avais produit : non ! ce code n'est pas adapté à ton cas, il vaut mieux procéder autrement...
je ne m'étais pas rendu compte que le fait que les commentaires ne soient pas écrits en français pouvait poser problème à certaines personnes
Il ne s'agit pas d'un problème de langue à proprement parler ! :lol: Qu'une procédure codée par un anglais ait une origine marquée et comporte des commentaires en anglais, je n'y voie rien d'anormal ! Là où cela m'irrite, je ne le cache pas, c'est que le plus souvent ces caractéristiques soient maintenues et prolongées par une sorte d'anglophilie exacerbée qui tendrait à vouloir faire penser que plus ça a l'air anglais, mieux c'est, et plus ça fait pro... Ce que je considère comme totalement dépourvu de sens et sans fondement, pour adapter, je commence par éliminer les commentaires (il est vrai que je n'en mets que très rarement, car ça me gêne pour lire le code) et changer les noms de variables pour les mettre à mon goût ! :lole:

Le code qu'on utilise a bien une origine linguistique, certes, mais quand je code je ne fais pas de l'anglais, j'utilise des mots-clés organisés selon une certaine syntaxe propre au code... Et pour les éléments externes je ne vois pas pourquoi je me priverais de ma liberté d'utiliser ce que bon me semble ! Je ne vois aucun intérêt à donner une consonnance anglaise à mes variables, à éviter les caractères accentués (à l'instar de l'anglais qui n'en a pas)... bien au contraire, c'est même d'ailleurs une garantie pour éviter de donner des noms qui constituent des mots clés du code ou sont proches de mots clés et risquent à ce titre d'induire en erreur.
Ceci dit, considérant qu'un bon nom de variable est d'abord un nom court, parce que je vais devoir l'écrire un certain nombre de fois, cela aura surtout l'allure de sigles ou d'abréviations, mais si je recherche une consonnance évocatrice il y aura de fortes chances qu'elle soit occitane ! :lol:
je pensais qu'avec seulement 2 ou 3 lignes à modifier ce code s'adapterait parfaitement à ma macro et qu'un habitué en aurait pour moins d'une minute
Pour la macro dont j'ai dit qu'elle pourrait fonctionner, à vue de nez c'était même beaucoup moins, car le code utilisait le rang des feuilles et les feuilles étaient en ordre inverse dans le classeur, il aurait donc suffit d'inverser l'ordre des feuilles (1 à 2 secondes en prenant son temps) pour en principe la voir fonctionner.
Mais elle restait toutefois à réécrire plus proprement et en qualifiant toutes les expressions...
La question que tu semblais poser portait sur la substitution de termes génériques uniques à une variété de mots apparentés... et comme pour ce type de problème j'ai tendance à penser que c'est l'outil Dico qui s'impose et qui peut donner les meilleurs résultats, je n'avais aucune envie de travailler sur un code utilisant une autre méthode que je n'aurais pas choisie.

Le défaut habituel des demandeurs est de vouloir faciliter les réponses des intervenants, et pour cela à découper souvent leur problématique pour ne poser la question sur une partie du problème et en privilégiant la recherche de solution dans une voie prédéterminée... Ce qui ne facilite rien, et peut au contraire masquer des éléments du problème qui surgiront par la suite, et occulter des solutions qui se serait peut-être révélées mieux adaptées...
On insiste toujours pour obtenir la situation de départ, celle projetée à l'arrivée, ainsi qu'un respect des structures dans lesquelles on doit opérer et des types de données sur lesquels on travaille. Si tous ces éléments sont rigoureusement respectés, on a en effet de fortes chances d'arriver rapidement à une ou plusieurs solutions directement applicables...

Ce qui me chagrine un peu dans ce que j'ai perçu de ton problème, c'est qu'on n'en entrevoit que la dernière partie : substitution de mots, laquelle ne constitue qu'une opération assez aisée à conduire... Cependant, il faut bien qu'en amont les mots substituables soient définis : les mots qu'il conviendra de remplacer et ceux par lesquels ils seront remplacés. Et selon ce que tu dis, il ne me semble que les équivalences d'identifiants soient établies à l'avance, et que donc cette partie de la question a été escamotée.

Cordialement.
D
DamienH
Jeune membre
Jeune membre
Messages : 16
Inscrit le : 3 novembre 2017
Version d'Excel : FR 2010

Message par DamienH » 6 février 2018, 16:05

Je n'ai surtout pas dit : débile ! :) Il s'agissait d'une manipulation de chaîne, pas vraiment simpliste, et en tant que telle correctement menée... J'ai parlé je crois de gymnastique inutilement compliquée, le nom t'étant livré par une propriété de l'objet, accessible en lecture, il suffisait donc de lire cette propriété une fois le classeur ouvert
Je pensais à la base qu'Activeworkbook et thisworkbook étaient la même chose, je n'avais pas compris que thisworkbook correspondait au classeur dans lequel la macro était stockée...
Au final comme je n'utilise l'application getopenfilename que pour copier les données, je peux tout simplement utiliser thisworkbook pour retourner sur mon classeur où je traite les données donc même pas besoin d'y attribuer de nom.
Le code qu'on utilise a bien une origine linguistique, certes, mais quand je code je ne fais pas de l'anglais, j'utilise des mots-clés organisés selon une certaine syntaxe propre au code... Et pour les éléments externes je ne vois pas pourquoi je me priverais de ma liberté d'utiliser ce que bon me semble ! Je ne vois aucun intérêt à donner une consonnance anglaise à mes variables, à éviter les caractères accentués (à l'instar de l'anglais qui n'en a pas)... bien au contraire, c'est même d'ailleurs une garantie pour éviter de donner des noms qui constituent des mots clés du code ou sont proches de mots clés et risquent à ce titre d'induire en erreur.
Ceci dit, considérant qu'un bon nom de variable est d'abord un nom court, parce que je vais devoir l'écrire un certain nombre de fois, cela aura surtout l'allure de sigles ou d'abréviations, mais si je recherche une consonnance évocatrice il y aura de fortes chances qu'elle soit occitane ! :lol:
Je suis toulousain, mais tout ce que je connais de l'occitan se résume à "prossima estacion saint sulpra republico" hahaha.
Je t'avoue que j'utilise l'anglais dans les commentaires de mes macros car les fichiers que je traite sont diffusés de part le monde, et si quelqu'un veut jeter un oeil au code, on m'a demandé d'expliquer chaque action en anglais, loin de moi l'idée de vouloir impressionner les différents utilisateurs du forum...
C'est pour cela que je laisse les commentaires en anglais dans les différents bouts de code que j'utilise avant de mettre le tout en forme, comme ça je peux réutiliser les bons termes pour décrire les différentes actions.
La question que tu semblais poser portait sur la substitution de termes génériques uniques à une variété de mots apparentés... et comme pour ce type de problème j'ai tendance à penser que c'est l'outil Dico qui s'impose et qui peut donner les meilleurs résultats, je n'avais aucune envie de travailler sur un code utilisant une autre méthode que je n'aurais pas choisie.

Le défaut habituel des demandeurs est de vouloir faciliter les réponses des intervenants, et pour cela à découper souvent leur problématique pour ne poser la question sur une partie du problème et en privilégiant la recherche de solution dans une voie prédéterminée... Ce qui ne facilite rien, et peut au contraire masquer des éléments du problème qui surgiront par la suite, et occulter des solutions qui se serait peut-être révélées mieux adaptées...
On insiste toujours pour obtenir la situation de départ, celle projetée à l'arrivée, ainsi qu'un respect des structures dans lesquelles on doit opérer et des types de données sur lesquels on travaille. Si tous ces éléments sont rigoureusement respectés, on a en effet de fortes chances d'arriver rapidement à une ou plusieurs solutions directement applicables...



Ce qui me chagrine un peu dans ce que j'ai perçu de ton problème, c'est qu'on n'en entrevoit que la dernière partie : substitution de mots, laquelle ne constitue qu'une opération assez aisée à conduire... Cependant, il faut bien qu'en amont les mots substituables soient définis : les mots qu'il conviendra de remplacer et ceux par lesquels ils seront remplacés. Et selon ce que tu dis, il ne me semble que les équivalences d'identifiants soient établies à l'avance, et que donc cette partie de la question a été escamotée.

Cordialement.
Je ne sais pas si l'outil Dico était le plus adapté à mon cas mais je pensais pourtant que mes explications étaient assez claires
2ème soucis : Je voudrais utiliser ma macro pour remplacer le contenu des cellules d'une colonne cible spécifique en me basant sur une table de 2 colonnes (1ère colonne : valeur recherchée, 2ème colonne : contenu de remplacement)
En gros j'ai 3 colonnes A, B, C en A j'ai tous mes identifiants de ma base de données, en B j'ai les valeurs que je veux remplacer, en C j'ai les valeurs de remplacement. Il est vrai que j'ai malencontreusement glissé le mot table qui vient semer le doute car je ne me sers d'aucune table au final...

Voici en tout cas la manière dont j'y suis parvenu dans le cas où quelqu'un chercherait la même chose!
Sub searchandreplace
Dim LR as Long
Dim FindStr As String
Dim RepStr As String
LR = Range("A" & Rows.Count).End(xlUp).Row

For i = 1 To LR
    FindStr = Sheet16.Range("A" & i).Value
    RepStr = Sheet16.Range("B" & i).Value
    Sheet13.Columns("AT").Replace What:=FindStr, Replacement:=RepStr
Next i
Merci en tout cas pour tes différentes explications et mes excuses si j'ai donné l'impression d'un fainéant arriviste récupérateur de code sur internet, je m'étais vraiment creusé la tête avant de venir poster sur le forum...
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message