VBA - Comportement inexplicable d'une macro

Bonjour,

Dans le fichier ci-joint, si je lance la macro ''Tirage'' manuellement depuis l'explorateur, ça fonctionne à tous les coups.

Si je lance la même macro à l'aide du bouton en place sur la feuille ''Base'', ça ne fonctionne très souvent pas. La macro semble être bien lancée, mais j'ai le résultat de l'image ci-dessous qui s'affiche (avec uniquement des 0) et aucun tirage n'apparait sur la feuille du jour.

image

Parfois, pour une raison incompréhensible, la macro lancée à l'aide du bouton fonctionne quand même, mais très aléatoirement.

Avez-vous une idée du problème ?

Cordialement.

18tirages-demo.xlsm (151.21 Ko)

Bonjour Yvouille,

Ton problème m'intéresse mais je suis loin de pouvoir t'affirmer que je pourrai t'aider. Toutefois j'ai étudié la macro "Tirage"
Je suis un peu perdu dès que tu utlises "Colonnes_gauches_droites", je ne vois pas ce que peut représenter ce paramètre sachant que tu veux que sa valeur soit égale à 2 ou a 6 suivant sa valeur d'origine 2, ou 6 ou autre, d'autant plus que tu t'en sers pour alimenter des cellules avec les valeurs de Range("Z" & compteur),
("Z" & compteur + 1) et ("Z" & compteur + 2)

C'est un plaisir pour moi que d'essayer de t'aider

Bonsoir,

Peut-être une solution

En mettant la macro complète "Sub Tirage()" dans la feuille même feuille "Base" ça a l'air de fonctionner à 100% (10 essais positif sur 10) je ne sais pas par quel phénomène

A tester "je suis curieux de savoir"

Slts

13tirages-demo.xlsm (227.77 Ko)

Re-bonsoir,

@ boss_68

C’est effectivement bien étrange, mais ta solution semble fonctionner à merveille (de manière assez peu compréhensible).

Mais quelque part, ce n’est pas la première fois que je suis confronté à un problème VBA dont on n’a pas la raison, mais dont on a la solution 😊

Merci donc infiniment à toi pour ton aide et ton dépannage

Eventuellement que quelqu’un d’autre nous donnera quand même la raison de ce problème.

@ Jacky

La variable ’’Colonnes_gauches_droites’’ n’est qu’une manière personnelle de rendre les choses plus parlantes à mon idée. J’aurais très bien pu appeler cette variable ’’i’’ ou ’’blablabla’’. Lorsque je donne la valeur 2 à cette variable, je commence à travailler sur la colonne B et ses suivantes (Colonnes_gauches_droites + 1 pour la colonne C, etc.) et lorsque cette variable à la valeur 6, je travaille sur les colonnes F et suivantes.

La variable ’’Compteur’’ a une autre utilisation.

Bonne soirée à vous tous.

Bonjour Yvouille,

Ok, je trouvais en effet cette variable (et non paramètre) un peu bizare
J'ai étudié la suite de ton code et ne vois rien de particulier qui pourrait entraîner le problème

Boss aurait trouvé une solution, sans en connaître le "phénomène".
En souhaitant que tu puisses résoudre cette enigme, bonne journée et à plus

Bonjour à tous,

A mon avis, vu que tu travailles avec plusieurs feuilles et que tu as beaucoup de références indirectes à la feuille active, ça peut planter. De fait, si déplacer la macro dans le module de la feuille en question résout le problème, cela indique clairement que la feuille que tu supposes être active ne l'est pas, d'où le plantage. En plaçant le sub dans la feuille en question on supprime l'ambiguïté de "Range → Activesheet (changeant)" pour "Range → Me (statique)".

Une autre solution, en supposant que le code soit parfait et que les références à la feuille active soient toutes exactes, aurait été d'ajouter "application.ScreenUpdating = False" au début pour éviter justement les changements de feuille potentiels de la macro.

Mais la solution de boss me semble plus perenne au vu de la longueur du sub.

Sinon, toujours utiliser des références de feuilles avant les instructions Range => solution pérenne pour éviter les problèmes "étranges".

Bonjour à tous

@Saboh

Une autre solution, en supposant que le code soit parfait et que les références à la feuille active soient toutes exactes, aurait été d'ajouter "application.ScreenUpdating = False" au début pour éviter justement les changements de feuille potentiels de la macro.

Je ne pense pas que cela puisse régler le problème. Même avec le passage de cette propriété à True.

Petit test avec cette procédure toute simple :

Public Sub Test101()
    Application.ScreenUpdating = False
    Feuil2.Select
    Debug.Print ActiveSheet.Name

    Feuil1.Select
    Debug.Print ActiveSheet.Name
    Application.ScreenUpdating = True
End Sub

En voici le résultat :

000061

Sinon, toujours utiliser des références de feuilles avant les instructions Range => solution pérenne pour éviter les problèmes "étranges".

Je suis d'accord sur ce point. Excel peut être très perfectible, Même si cela doit prendre plus de temps il est nécessaire d'être explicite sur les références.

Et dans l'ensemble :

  • Bien encadrer les blocs With, End With
  • Créer plutôt de petites fonctions qui n'auront qu'une tâche à effectuer.
  • L'utilisation de tableaux structurés allège le code et le rends plus lisible.

bonjour Yvouille, saboh12617, Jacky, Boss_68,

oui, je suis aussi convaincu que cela est du à la feuille active, la macro n'est pas écrit indépendant de ça, donc partu où on voit ce "range" ou "cells" sans point comme préfix, il faut corriger cela.

Le screenupdating n'a rien à voir avec le changement des feuilles, c'est simplement bloquer la mise en jour de l'écran.

La solution, ce n'est pas déplacer "tirage" vers un module d'une feuille, c'est corriger pourque la macro soit indépendant de la feuille actuelle (et simplifier naturellement, je ne sais pas le but et où je dois regarder pour le résultat)

Merci à Saboh et Jean-Paul pour leur compléments. La macro ne semble pas si imparfaite, puisqu'elle fonctionne en étant lancée manuellement

Mais bon, je peux avancer et cela est le plus imporant. Comme je ne crée pas tous les jours de telles macros aussi longues, je ne devrais plus revoir ce probléme jusqu'en 2029.

Très bonne continuation.

Rechercher des sujets similaires à "vba comportement inexplicable macro"