Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

formule trop longue...

12 réponses
Avatar
j
bonjour,

j'ai, dans Excel (je sais bien, c'est pas fait pour ça) une (grosse) base de
données contenant uniquement du texte.
Mais, dans certaines cellules, de... (très) longs textes.
Jusque là, tout va bien.

Mais si malencontreusement je m'avise de vouloir remplacer "toto" par "zaza"
par VBA dans tout le texte de toute la page (avec cells.replace), je
constate que VBA
1) fait bien son boulot tant qu'il ne rencontre pas une case trop remplie
2) arrête tout bonnement de remplacer à partir de la première cellule trop
pleine contenant un "toto"... et ce sans aucun avertissement d'erreur !

(Si je fait la même chose avec Edition / remplacer, message d'erreur
"formule trop longue" (en fait de formule je n'ai que du texte).)

Quelqu'un a-t-il une solution à ce pb désagréable ?
J'ai bien trouvé une solution VBA bancale avec Instr, left et right, mais
c'est beaucoup trop lent pour ce que je veux faire (j'ai plusieurs mots à
remplacer dans 20 000 lignes...).

d'avance merci de vos avis éclairés

j@c
http://jacxl.free.fr

2 réponses

1 2
Avatar
j
oserais-je le dire...
le pb c'est que j'ai env 50 000 mots à remplacer sur mes 20 000 cellules...
en fait dans la plupart des cas, il n'y a qu'une ou deux occurrences (voire
pas du tout) des mots à remplacer dans les 20 000 cellules...

Juste pour expliquer, c'est un dictionnaire (de 20 000 entrées comprenant
chacune un à 3 mots synonymes) et je recherche dans chaque définition tous
les mots présents dans le dictionnaire pour les transformer en lien pointant
vers ledit mot (tout ça sortant en html + js)
Tout marche très bien, mais la partie "remplacement" est assez laborieuse...


http://jacxl.free.fr



"MichDenis" a écrit dans le message de news:
O#
| mais je vais encore tourner toute la nuit !


En utilisant la macro suivante sur 20 000 cellules
chaque cellule ayant 942 caractères
chaque cellule avait 95 fois le mot Denis à remplacer par toto
durée de l'opération 26 secondes sur un vieux P2 400

Dois-je convenir que les nuits sont courtes dans ton coin de pays ???????


'--------------------------------------------------
Sub test()
Dim V As Range
Dim a As Long, b As Long
Dim T, F As Double, S As Double
S = Time
Feuil2.Range("A1") = Time
Application.ScreenUpdating = False
Application.EnableEvents = False
With Feuil1
Set V = .UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
End With

T = V
Application.ScreenUpdating = False
For a = 1 To UBound(T, 1)
For b = 1 To UBound(T, 2)
V(a, b).Value = Replace(T(a, b), "Denis", "toto")
Next
Next
Application.EnableEvents = True
Feuil2.Range("A2") = Time
MsgBox F - S
End Sub
'--------------------------------------------------




Avatar
j
j'entends bien, n'empêche que je ne sais pas pourquoi la méthode Replace est
plus poussive que la fonction Replace
Probablement l'objet Range qui atteint ses limites...


"MichDenis" a écrit dans le message de news:
e$
J'oubliais ceci :

Replace est une MÉTHODE de l'objet Range
Range("A1").Replace...
*************************************
Replace est une FONCTION de la bibliothèque VBA au même
titre que toutes les autres fonctions Left() , Asc(), Mid() ...
Range("A1") = Replace()

Il faut éviter de mélanger les genres !







"" a écrit dans le message de news:


ok, le replace fonctionne :
1) ActiveCell.Replace "toto", "zaza" ne fait rien pour une cellule
contenant un texte très long
2) ActiveCell.Value = Replace(ActiveCell, "toto", "ZAZA") marche
toujours
(sais pas trop pourquoi...)

J'économise un pouillème de seconde par rapport à left+instr+right mais je
dois toujours balayer les cellules

J'ai encore gagné un poil en combinant un find("toto") avec le
remplacement

(le find trouve même dans les cellules trop remplies) mais je vais encore
tourner toute la nuit !





"MichDenis" a écrit dans le message de news:

| C'est ce que je fais actuellement, mais comme je souhaite remplacer
"toto"

| ou "Toto" ou "TOTO" ou "tOto" ou "TOto"... par "zaza" sans modifier la
casse

| du reste du texte, et que je ne veux pas encore alourdir le code,
j'utilise

| instr+left+right

Tu utilises ceci et pour la partie sans égard à la casse, tu place dans
le


haut
du module où tu copieras cette procédure la ligne de code "Option
Compare


Text"
et adieu la casse !

Il faut tout leur dire à ces jeunes ... ;-))


Option Compare Text

'-------------------------------------------
Sub test()

Dim V As Range
Dim a As Long, b As Long

With Feuil1
Set V = .UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
End With

t = V
Application.ScreenUpdating = False
For a = 1 To UBound(t, 1)
For b = 1 To UBound(t, 2)
V(a, b).Value = Replace(t(a, b), "toto" ,"ZAZA")
Next
Next
End Sub
'-------------------------------------------









1 2