[vba] macro s'exécute bien... ou pas
refcemad
Messages postés
39
Date d'inscription
Statut
Membre
Dernière intervention
-
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Tout d'abord, je précise que je suis débutante en programmation.
Je vous explique mon problème : j'essaie d'appeller une macro (enreg_semi_auto) à travers la valeur que prend une cellule (qui contient une fonction si().) Or, ça ne marche pas, alors que la macro en elle-même fonctionne très bien en manuel.
Voici mes codes :
La fonction enreg_semi_auto bloque à mon "Selection.PasteSpecial Paste..."quand je passe par la private sub.
On m'indique :
"erreur d'exécution 1004 ; cette opération requiert que les cellules fusionnées soient de taille identique"
En fait, quand j'exécute pas à pas avec le débogueur, il revient à la Private Sub dès que la ligne "Selection.PasteSpecial...." est passée.
Comment cela se fait-il ??? Quoi faire ?
Merci par avance pour toutes vos contributions.
Tout d'abord, je précise que je suis débutante en programmation.
Je vous explique mon problème : j'essaie d'appeller une macro (enreg_semi_auto) à travers la valeur que prend une cellule (qui contient une fonction si().) Or, ça ne marche pas, alors que la macro en elle-même fonctionne très bien en manuel.
Voici mes codes :
Private Sub Worksheet_Calculate() If Range("N31") = FAUX Then enreg_semi_auto End If End Sub
Public Function enreg_semi_auto() As Integer Sheets("Récap gé").Select Range("B1:K34").Select Selection.Copy Sheets("Enregs").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ..... .....'et encore 150 lignes de copier/coller, mises en forme et calculs ..... End function
La fonction enreg_semi_auto bloque à mon "Selection.PasteSpecial Paste..."quand je passe par la private sub.
On m'indique :
"erreur d'exécution 1004 ; cette opération requiert que les cellules fusionnées soient de taille identique"
En fait, quand j'exécute pas à pas avec le débogueur, il revient à la Private Sub dès que la ligne "Selection.PasteSpecial...." est passée.
Comment cela se fait-il ??? Quoi faire ?
Merci par avance pour toutes vos contributions.
A voir également:
- [vba] macro s'exécute bien... ou pas
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Incompatibilité de type vba ✓ - Forum Programmation
- Arreter une macro vba ✓ - Forum Excel
8 réponses
Bonjour,
Pourtant il te dit clairement ce qui ne lui plait pas : cette opération requiert que les cellules fusionnées soient de taille identique
As-tu essayé sans cellules fusionnées ?
Et pourquoi avoir fait une fonction et non pas un sub ? Quel est l'interet ?
eric
Pourtant il te dit clairement ce qui ne lui plait pas : cette opération requiert que les cellules fusionnées soient de taille identique
As-tu essayé sans cellules fusionnées ?
Et pourquoi avoir fait une fonction et non pas un sub ? Quel est l'interet ?
eric
En fait, j'ai essayé d'abord avec un sub et l'effet est strictement le même.
Ce que je ne comprends pas, c'est que la macro marche très bien quand je l'exécute directement...
On dirait qu'arrivé à la ligne fatidique, excel reprend au début du Private Sub Worksheet_calculate, recommence la procédure, et encore, et encore, et encore. Je pense que c'est du "encore, et encore, et encore" que vient le problème de cellules fusionnées.
J'ai raison, ou je comprends rien ?
Ce que je ne comprends pas, c'est que la macro marche très bien quand je l'exécute directement...
On dirait qu'arrivé à la ligne fatidique, excel reprend au début du Private Sub Worksheet_calculate, recommence la procédure, et encore, et encore, et encore. Je pense que c'est du "encore, et encore, et encore" que vient le problème de cellules fusionnées.
J'ai raison, ou je comprends rien ?
Oui, je viens de le faire... et c'est pire !
En fait, je commence à entrevoir l'origine du problème : il semblerait que, comme j'ai, dans certaines cellules du classeur des fonctions maintenant() qui sont recalculées dès qu'une valeur change quelque part, la macro revérifie la valeur de N31 à chaque fois...
Donc... ma question est désormais : comment faire pour que la macro ne s'exécute QUE quand je change une valeur directement liée à la cellule N31 ?
En fait, je commence à entrevoir l'origine du problème : il semblerait que, comme j'ai, dans certaines cellules du classeur des fonctions maintenant() qui sont recalculées dès qu'une valeur change quelque part, la macro revérifie la valeur de N31 à chaque fois...
Donc... ma question est désormais : comment faire pour que la macro ne s'exécute QUE quand je change une valeur directement liée à la cellule N31 ?
Bonjour,
il faut utiliser l'évènement Change de la feuille.
Et change cette function en sub, ce n'est pas une fonction.
eric
il faut utiliser l'évènement Change de la feuille.
Private Sub Worksheet_Change(ByVal Target As Range) If Target = [N31] Then 'ton code End If End SubL'évènement change ne se déclenche pas si la cellule est modifiée par macro.
Et change cette function en sub, ce n'est pas une fonction.
eric
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Ca, j'avais déjà essayé avant le worksheet_change, mais ça n'a jamais marché. J'ai bien repassé ma fonction en sub (comme elle était à la base).
Je reviens quand même sur ta proposition. Mais là, pour moi, le code que tu me donnes ne tiens pas compte de la valeur que va prendre (ou pas) N31. Et moi je veux que ma macro se lance seulement si j'ai "FAUX" en N31.
Alors j'ai essayé ceci :
J'ai essayé aussi en mettant "FAUX"...
Mais ça ne fonctionne pas ! (la macro ne s'exécute pas du tout)
A chaque fois que je teste quelque chose, j'ai l'impression d'être si près du but...
Ca, j'avais déjà essayé avant le worksheet_change, mais ça n'a jamais marché. J'ai bien repassé ma fonction en sub (comme elle était à la base).
Je reviens quand même sur ta proposition. Mais là, pour moi, le code que tu me donnes ne tiens pas compte de la valeur que va prendre (ou pas) N31. Et moi je veux que ma macro se lance seulement si j'ai "FAUX" en N31.
Alors j'ai essayé ceci :
If Target = [N31] Then If [N31].Value = FAUX Then 'Ma_Macro End If End If End Sub
J'ai essayé aussi en mettant "FAUX"...
Mais ça ne fonctionne pas ! (la macro ne s'exécute pas du tout)
A chaque fois que je teste quelque chose, j'ai l'impression d'être si près du but...
Ok.
Mais là, dès que je modifie une cellule de la feuille, la macro s'exécute, et ce n'est pas mon souhait...
Mais là, dès que je modifie une cellule de la feuille, la macro s'exécute, et ce n'est pas mon souhait...
Mais là, dès que je modifie une cellule de la feuille, la macro s'exécute
Non, lorsque N31 est modifié et est égal à FAUX
Ton problème de départ était : "erreur d'exécution 1004 ; cette opération requiert que les cellules fusionnées soient de taille identique"
Ensuite :
ma question est désormais : comment faire pour que la macro ne s'exécute QUE quand je change une valeur directement liée à la cellule N31 ?
Ensuite il faut qu'elle soit égale à faux...
Bon, on reverra ça (ou pas) quand tu auras posé ton problème clairement, ce que tu n'as jamais fait.
Les énigmes distillées au compte-goutte ne m'ont jamais passkionné.
eric
Non, lorsque N31 est modifié et est égal à FAUX
Ton problème de départ était : "erreur d'exécution 1004 ; cette opération requiert que les cellules fusionnées soient de taille identique"
Ensuite :
ma question est désormais : comment faire pour que la macro ne s'exécute QUE quand je change une valeur directement liée à la cellule N31 ?
Ensuite il faut qu'elle soit égale à faux...
Bon, on reverra ça (ou pas) quand tu auras posé ton problème clairement, ce que tu n'as jamais fait.
Les énigmes distillées au compte-goutte ne m'ont jamais passkionné.
eric
Euh... C'est pire que ça : parfois ma macro s'exécute et d'autres fois non, sans rien changer au code, seulement en effaçant des valeurs dans mon tableau...
Bon, je vais essayer de reprendre mon problème avec un exemple un peu plus simple (c'est un exemple avec lequel je travaille depuis le début et que j'avais essayé de transposer sur mon classeur sans succès).
Mettons que je veuille que la cellule A1 se colore en violet si B1 prend, avec une fonction, la valeur FAUX : si(C2<C1;"")
Je fais d'abord une Sub :
Ensuite je fais une worksheet_calculate :
En fait, je ne vois absoluement pas pourquoi, mais Excel à l'air de se comporter bizarrement (je commence à me demander si j'aurais pas un bug avec excel...) :
Tout à l'heure ça avait l'air de fonctionner correctement, mais maintenant... plus rien ne se passe.
Si je rajoute dans la worksheet :
(la macro2 que j'ai faite permet de mettre A1 en bleu)
Dans ce cas, seule la macro2 s'exécute dès que je change une valeur qui n'a rien à voir dans le classeur et même si B1 = FAUX.
J'espère être un peu plus claire. Par ailleurs, mon post précédant (la macro ne s'exécute que lorsque j'efface une valeur) n'est plus vrai...
Mettons que je veuille que la cellule A1 se colore en violet si B1 prend, avec une fonction, la valeur FAUX : si(C2<C1;"")
Je fais d'abord une Sub :
Sub Macro1() Sheets("feuil1").Select Range("A1").Select With Selection.Interior .Color = -6279056 End With End Sub
Ensuite je fais une worksheet_calculate :
Private Sub Worksheet_Change(ByVal Target As Range) If Target = ["B1"] And Target.Value = False Then Macro1 End If End Sub
En fait, je ne vois absoluement pas pourquoi, mais Excel à l'air de se comporter bizarrement (je commence à me demander si j'aurais pas un bug avec excel...) :
Tout à l'heure ça avait l'air de fonctionner correctement, mais maintenant... plus rien ne se passe.
Si je rajoute dans la worksheet :
Else Macro2
(la macro2 que j'ai faite permet de mettre A1 en bleu)
Dans ce cas, seule la macro2 s'exécute dès que je change une valeur qui n'a rien à voir dans le classeur et même si B1 = FAUX.
J'espère être un peu plus claire. Par ailleurs, mon post précédant (la macro ne s'exécute que lorsque j'efface une valeur) n'est plus vrai...