[vba] macro s'exécute bien... ou pas

Fermé
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 - 15 juil. 2012 à 10:25
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 17 juil. 2012 à 11:45
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 :

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:

8 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
15 juil. 2012 à 11:15
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
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
15 juil. 2012 à 11:31
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 ?
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
15 juil. 2012 à 13:00
As-tu essayé sans cellules fusionnées ?
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
16 juil. 2012 à 06:54
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 ?
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
16 juil. 2012 à 11:09
Bonjour,

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 Sub
L'é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
0

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

Posez votre question
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
17 juil. 2012 à 09:33
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 :
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...
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
17 juil. 2012 à 09:43
Bonjour,

Il faut utiliser le mot clé en anglais : false

If Target = [N31] and target.value=false Then
....
endif

eric
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
17 juil. 2012 à 09:51
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...
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
17 juil. 2012 à 10:05
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
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
17 juil. 2012 à 10:15
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...
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
17 juil. 2012 à 10:50
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 :
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...
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
17 juil. 2012 à 11:45
Reprend en laissant tomber ce que tu as fait qui est faux et ne fait qu'embrouiller.

Dépose un, fichier exemple sur cjoint.com et colle ici le lien fourni.
Explique dedans, simplement mais complètement et en détail , ce que tu désires.
eric
0