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 Sub

voici le résultat

image

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!

Bonjour Guillaume,

Par rapport à ce que tu veux, il faut enregistrer le classeur, en classeur de macros complémentaire ".xlam"

2021 07 25 08h04 18

Dans ce classeur il y a ta feuille avec la liste des prénoms et le code VBA

Pour l'ajouter à Excel, il faut utiliser le gestionnaire de complément

image

Voilà

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 mises au niveau du jour en initialisant la Table (Tableau ) de correspondance comme dans l’exemple joint *.

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 Sub

si 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 Sub

Pour 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.

Rechercher des sujets similaires à "vba remplacements table correspondance trop volumineuse array"