VBA remplacements : table de correspondance trop volumineuse pour l'array?
Bonsoir,
J'ai une liste de 122 prénoms sans accent (colonne A) que je souhaite accentuer (exemple du résultat souhaité en colonne B). J'ai créé pour cela la procédure VBA suivante qui doit m'aider à convertir ma sélection, en suivant une table de correspondance qui compte 122 instances.
Cela fonctionne très bien sur une partie de la liste. Mais lorsque je tente de saisir l'ensemble de mes correspondances, l'Array semble "saturer". Je ne peux entrer qu'un certain nombre d'arguments (+/50). Et le même avec ce nombre max, le lancement de la procédure semble très lourde.
Une piste pour intégrer la totalité de mes 122 instances de remplacement dans cette procédure ? Voire pour alléger le code pour obtenir le résultat souhaité ?
D'avance, un grand merci pour votre aide !
Guillaume
Ci-après ma procédure VBA et ci-joint mon fichier d'exemple.
Sub accentuation()
Dim cellule As Range
For Each cellule In Selection
cellule.Value = AjouterAccents(cellule.Value)
Next
End Sub
Function AjouterAccents(ByVal sChaine As String) As String
Dim sTmp As String, i As Long
Dim traduction_accents()
Dim accents() As String
traduction_accents = Array("adelaide/adélaïde", "adele/adèle", "agnes/agnès")
sTmp = sChaine
For i = 0 To UBound(traduction_accents)
accents = Split(traduction_accents(i), "/")
sTmp = Replace(sTmp, accents(0), accents(1))
Next i
AjouterAccents = sTmp
End Function
Salut,
Testé avec ce code
Function AjouterAccents(ByVal sChaine As String) As String
Dim i As Long
Dim accents
accents = Range("A2:B123").Value
For i = 1 To UBound(accents)
sChaine = Replace(sChaine, accents(i, 1), accents(i, 2))
Next i
AjouterAccents = sChaine
End Function
Sub Bouton1_Cliquer()
Dim t
Dim cellule As Range
t = Timer
For Each cellule In Range("A2:A123")
cellule.Value = AjouterAccents(cellule.Value)
Next
t1 = Timer
MsgBox "Temp : " & t1 - t
End Subvoici le résultat
Bonjour Guillauma, Jean-Paul
Il faut utiliser la feuille "Prenoms" comme base de données
J'avais modifié le fichier et les onglets, je le poste
@+
Bonjour Jean-Paul et merci pour ta réponse.
Ta solution est-elle exportable ? J'entends par là que j'avais bricolé ma solution (avec intégration de la table de correspondance dans l'array) de manière à pouvoir utiliser cette VBA dans tous mes documents excel. Là, l'appel du range A1:B123 n'entre-t-il pas en contradiction avec cette logique?
Je ne sais pas si je suis clair ?
En gros, je veux enregistre ma procédure dans ma classeur personnal pour pouvoir mobiliser ce traitement de l'accentuation sur tous mes excels à venir qui n'auront pas cette liste de correspondance dans leur contenus... je ne suis pas certain de savoir comment intégrer ton code dans cette perspective ?
Bonsoir Guillaume,
Le classeur de macros personnelles est un fichier ".xlsb" que l'on peut ouvrir sans souci si on le sort du dossier XLSTART
@+
Désolé Bruno,
Je ne comprends ta réponse. Je débute sur VBA et je bricole. Toutes mes excuses.
Ce que je cherche à faire, c'est lancer une procédure qui me permettra d'accentuer tous les prenoms dans ma sélection, et ceci pour dans tous mes documents à venir. C'est pour cela que j'ai sauvegardé ma macro dans le dossier personnal, pour pouvoir ensuite l'appeler dans tous mes documents depuis un bouton de mon ruban personnalisé.
La solution de Jean-Paul répond-elle à ce besoin? Elle a l'air super super rapide, ça serait top! Mais comment faire ?
Merci!
Bonsoir Bruno,
Merci beaucoup!
Demain, je creuse cette histoire de compléments pour tenter de suivre ton pas-à-pas et je te tiens au courant!
Un grand merci à toi et à Jean-Paul en tous cas!
Guillaume
Salut à tous,
Tiens j'ai modifié un peu la sub. fais un test pour voir si cela te conviens tu n'aura plus qu'a suivre les conseils de Bruno pour faire ton xla.
Tu vas sur la feuille Saisie, tu sélectionnes une partie des prénoms et tu clique sur le bouton,
Bonsoir Jean-Paul !
Comment te dire ? Message de confirmation, d'erreur... cela dépasse mes attentes par bien des aspects! C'est vraiment du super boulot alors merci. Ca laisse rêveur... j'espère pouvoir être capable de ce genre de prouesse dans quelques temps!
J'ai tenté d'ajouter ta nouvelle sub à mon ruban personnalisé, via l'ajout de complément décrite par Bruno... sans succès.
J'imagine que cela doit être lié au bouton cliquable. Je suis entré un peu dans ton code pour tenter de remédier à cela mais j'avoue que c''est inabordable dans l'état de mes connaissances.
Au pire, si je n'y arrive pas tout de suite je copierai les prénoms à renommer dans ton fichier - cela fonctionne tant que je ne renomme l'entête de colonne. Dans l'intervalle, si cela t'amuse de me donner une piste pour que cela colle parfaitement à mon besoin (macro activable depuis le ruban) n'hésite surtout pas! ;-)
Proposition ouvert à tout le monde d'ailleurs! :-)
Merci à tous en tous cas! Ca donne envie,
Guillaume
Bonjour …
On peut toujours penser à des routines du siècle dernier
Ici, l’action sera déclenchée à partir d’un clic bouton droit car initialisée à l’ouverture du classeur (détruite à la fermeture de celui-ci pour ne pas impliquer d’autres projets non concernés)
* on pourra plus tard l’adapter aux mots des phrases mais c’est une autre histoire plus longue à raconter.
Salut pour ton ruban personnalisé utilises Ribbon Creator ATTENTION CREE D'ABORD TON FICHIER AVEC RIBBON CREATOR et SEULEMENT ENSUITE TU IMPORTES DEDANS TES FEUILLES ET TON CODE. sous peine de tout perdre
Pour le code c'est dans le module basCallBack, les bouton seront déterminer par l'ID que tu auras donné lors de la création. le plus simple tu vas dans basCallBack/OnActionButton tu as un exemple d'appel tu y colles un Debug.print et tu cliques sur tous les boutons et ChekBox et autres que tu auras créé dans l'ordre si possible, comme cela tu auras tous les noms dans la fenêtre d'exécution.
Public Sub OnActionButton(control As IRibbonControl)
'Callback in XML File "onAction"
' Callback for event button click
' Callback für Button Click
Select Case control.id
'Case "btnInfo"
' DoCmd.OpenForm "frmMyForm"
Case Else
Debug.Print control.id
' MsgBox "Button """ & control.id & """ clicked" & vbCrLf & _
' "Es wurde auf Button """ & control.id & """ in Ribbon geklickt", _
' vbInformation
End Select
End Subsi tu veux que ton onglet s'affiche au démarrage tu ajoute la ligne suivante dans basCallBack/onRibbonLoad
Public Sub OnRibbonLoad(ribbon As IRibbonUI)
'Callbackname in XML File "onLoad"
Set gobjRibbon = ribbon
gobjRibbon.ActivateTab ("tab0") ' // On active l'onglet xlTools
End SubPour ma part je ne change pas l'ID de l'onglet par défaut qui est "tab0" ATTENTION c'est du HTML est cela est sensible à la CASE
Voilà un petit exemple à toi de regarder dans le module basCallBack mais c'est facile à comprendre tu tu veux un coup de main n'hésites pas.

