Problème '92' avec macro VBA

mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012 - 18 avril 2012 à 19:23
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012 - 19 avril 2012 à 13:13
Bonjour,

Je me permets de poster ici car j'ai un petit problème avec une macro.

Tout à l'heure lorsque je l'ai construite ça marchait nickel, et lorsque j'ai fermé puis ouvert à nouveau le tableur, ça ne marchait plus, la fonction "remplacer ... par ..." buggait : elle s'applique dans toutes les cellules au lieu de s'appliquer uniquement dans la cellule déclarée.

L'erreur en question est la 92 : "variable bloc with non définie"

Je vous mets le code vba ci-dessous, en espérant que quelqu'un puisse me dire qu'est ce qui cloche :

Sub real_mak()
'
' real_mak Macro

a = Range("J15")
b = Range("K15")
c = Range("J16")
d = Range("K16")

Range("J15").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:="=", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Range("K15").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:="=", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Range("J16").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:="=", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Range("K16").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:="=", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Range("K16").Select

ActiveCell.Replace What:="G", Replacement:="H", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:="G", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Columns("L:IV").Select
Selection.Replace What:=a, Replacement:=b, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("L:IV").Select
Selection.Replace What:=c, Replacement:=d, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("M260").Select
End Sub

Merci d'avance pour l'aide que vous pourrez m'apporter.

23 réponses

mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 22:35
Ouais en gros quand je configure en "xlpart", il me trouve bien l'élément à remplacer mais il me remplace dans toute la feuille, et quand je met "xlwhole", il me trouve pas les éléments dans la cellule... Difficile de savoir comment arranger mon problème...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
18 avril 2012 à 22:59
Bonjour,
Il est regrettable que tu n'aues pas présenté ton code entre balises code (3ème icône à partir de la droite)
On ne travaille pas à "coups de Select, Activate, etc ...)
Mais surtout, même en lisant en diagonale (puisque code non mis en forme) ===>>
Je vois un peu partout l'utilisation de bulldozer là où suffit une petite cuillère !
Exemple :
tu écris :
Range("J15").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False 

Pour une cellule !!! Le bulldozer quoi !
ce qui s'écrirait simplement :
Range("J15").Value = Replace(Range("J15").Value, "=", "")

et on retrouve cela un peu partout dans ton code.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:06
Désolé pour la mise en forme du code, pas l'habitude de poster/

Sinon entre temps j'ai effectiveùent ecrémé le code, et ça donnait ça :

[Sub real_mak()

Range("J15:K16").Select
ActiveCell.Replace What:="=", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False


Range("K16").Select
ActiveCell.Replace What:="G", Replacement:="H", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

Columns("L:IV").Select
Selection.Replace What:=("J15"), Replacement:=("k15"), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("L:IV").Select
Selection.Replace What:=("J16"), Replacement:=("K16"), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("M260").Select
End Sub]

Mais le problème est toujours le même >> quand je met xlwhole, ça ne trouve pas l'élément, et quand je met xlpart, ça me fait un rechercher et remplace dans toute la feuille (mais par contre ça me trouve bien les éléments)... grrr

Je vais essayer avec ton code tout simple, pour voir si ça peut arranger les choses.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
18 avril 2012 à 23:10
Bon ...
1) toujours pas de balises code utilisées
2) encore une fois le bulldozer , pour une seule cellule
Range("K16").Select
ActiveCell.Replace What:="G", Replacement:="H", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

3) encore un travail à coups de select

Tu n'en fais qu'à ta tête.
La mienne est fatiguée et je vais dormir, donc.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:13
Je viens d'essayer ton code, le problème est que ça enlève le égal, ça le remplace par rien mais ça met le résultat de la formule qui était tapée.

Par exemple, imaginons qu'il soit écrit "=somme(A1:A12)", moi je voulais enlever le égal pour qu'il reste juste "somme(A1:A12)" dans la cellule.

Là en gros avec ta formule ça enlève la formule mais ça met le résultat de la somme...

Mais merci quand même, et si tu as une astuce en stock, n'hésite pas ;)
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:13
Ah désolé j'avais pas actualisé, je vais donc essayer ce que tu viens de mettre dans ton second message.

Merci
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:15
Ah oui en fait yavait rien dans ton second message, je dois être fatigué aussi...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
18 avril 2012 à 23:34
1) Il est grand temps de dire cela (ce n'est maintenant que tu parles de texte de formules à transformer en texte simple !!!).
2) et alors ? ===>>
Range("J15").Value = Replace(Range("J15").FormulaLocal, "=", "")

toujours pas de bulldozer pour juste une cellule !)
3)
Ah oui en fait yavait rien dans ton second message
*
comment cela, rien ? C'est une plaisanterie ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:37
lol, par "rien" je voulais dire "pas de nouveaux éléments".

On s'est mal compris.

En tout cas je vais essayer ça, merci.
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
18 avril 2012 à 23:55
Super ça marche nickel.

Par contre pour cette parcelle :

Columns("L:IV").Select
    Selection.Replace What:=("J15"), Replacement:=("k15"), LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False


Comment faire comprendre à la macro qu'il faut qu'elle remplace le contenu de J15 par le contenu de K15 dans chaque cellule des colonnes L à IV ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
19 avril 2012 à 00:27
Je refuse tout simplement de continuer à tant que je vois du Select... puis du Selection...
Reviens une fois débarrassé de cette fort mauvaise habitude, si tu veux mpn aide. Je l'ai déjà montrée du doigt deux fois et t'ai également montré comment pointer et traiter directement. C'est vrai quel que puisse être le traitement


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 00:31
J'ai essayé ça :

a = Range("J15")
b = Range("K15")
Range("J15").Value = Replace(Range("J15").FormulaLocal, "=", "")
Range("K15").Value = Replace(Range("K15").FormulaLocal, "=", "")
Range("J16").Value = Replace(Range("J16").FormulaLocal, "=", "")
Range("K16").Value = Replace(Range("K16").FormulaLocal, "=", "")
Range("K16").Value = Replace(Range("K16").FormulaLocal, "G", "H")

Columns("L:IV").Value = Replace(Columns("L:IV"), a, b)


Mais bon la dernière ligne est refusée : erreur 13
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
19 avril 2012 à 00:45
Ah !
Ce qui va pour UNE cellule ne saurait aller pour toute une plage de cellules.
Une solution toute bête est de les traiter une par une. Comment ? dans une boucle For each ...
Je te mets sur une piste et te laisse ensuite travailler sur cette base (fastoche)/
Regarde ce que ferait ceci :
dim toto as range
for each toto in range("B3:F5")
  toto.value = "tu vois ?"
next

A partir de là, tu devrais avoir un déclic, non ?
Bonne nuit.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 00:49
Oui je pense savoir quoi faire à partir de là.

Merci en tout cas, bonne nuit.
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 01:14
bon j'ai essayé cela :

a = Range("J15")
b = Range("K15")

For Each a In Range("L1:IV251")
  a.Value = b
Next


Le problème ? ça me met uniquement la valeur de "b" dans chaque cellule, en gros ça ne remplace pas uniquement a mais ça remplace TOUT le contenu de la cellule par b.

Sinon j'ai essayé des bidouilleries dans ce style :

For Each a In Range("L1:IV251")
  a.value=replace.formulalocal, a, b)
Next


Sans réel succès.

Je retravaillerai ça demain.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
19 avril 2012 à 07:55
C'est pourtant simple.
-c'est la valeur de la cellule parcourue (in va l'appeler c), que tu veux écrire ===<<< c.value =
- et tu veux y mettre :
---- le texte de sa formule ===>>> c.formulalocal
---- où tu remplaces les chaines contenant a par b ===>>
dim c as range '<<<<<<<<<====) important (on définit c comme plage, ce qu'est une cellule, déjà)
For Each c In Range("L1:IV251")
  c.value=replace(c.formulalocal, a, b)
Next

Le développement est comme toute autre chose : il demande logique et concentration.
Pour ne rien te cacher : il me faut me concentrer mille fois plus lorsque je travaille des roches ou que je peins que lorsque je développe !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 10:50
Ça marche pour les toutes premières cellules, mais ensuite ça me met "Erreur d'exécution 1004 "Erreur définie par l'application ou par l'objet"", en gros il me remplace nickel dans les premières cellules de la plage en question et ensuite il bloque... mais je ne sais pas pourquoi.

Peut être que dans les fameuses cellules d'après, les formules sont trop étoffées, du coup les éléments à remplacer sont trop "camouflés" dans les formules...je sais pas, après tout ça reste de la "fonction si" couplée avec du "nb.si", rien de bien méchant.
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 11:11
La boucle ne parvient pas à se faire, entre autres, dans une cellule où l'on trouve cet type de formule :

=SI(ET(NB.SI(G3:G52;$L8)<>0;M$7<>"");"A";"B")

J'ai essayé individuellement, sans la boucle, ça ne marche pas non plus... erreur 1004
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
19 avril 2012 à 11:29
il me remplace nickel dans les premières cellules de la plage en question et ensuite il bloque... mais je ne sais pas pourquoi.

Je n'ai pas ta feuille sous la main, mais devine pourquoi : pas de formule présente là où blocage
Alors ?
Dis-moi un peu : tu ne dois appliquer ce remplacement que là où formule ?
Si oui : on fait d'une manière
Si non (si également sur la valeur présente, donc soit formule, soit autre contenu) : on fait autrement
On s'en sort à tous coups (et facilement)
J'attends ta réponse (tu verras alors comme c'est simple !)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
mphz Messages postés 16 Date d'inscription mercredi 11 avril 2012 Statut Membre Dernière intervention 19 avril 2012
19 avril 2012 à 11:30
Bon du coup j'ai repris l'ancien système pour la dernière parcelle, à savoir :

a = Range("J15")
b = Range("K15")

Columns("L:IV").Select
Selection.Replace What:=a, Replacement:=b, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False


Ça fera un peu Bulldozer, mais au moins il ne fait pas de détail et remplace dans toutes les cellules.

Par contre comment faire comprendre à la macro qu'il faut qu'elle traite telle tâche avant l'autre ?

Parce que là j'ai l'impression que ça fait les tâches dans le désordre.
0
Rejoignez-nous