PROBLEME de FICHIER AVEC MACRO

Bonjour,

Je réalise un puissance 4 et lorsque je fais des tests de jeu sur ma feuille Jeu1-1 et qu'un joueur gagne Excel ne répond plus et se ferme ...

Au secours je dois le rendre pour mercredi je peux pas tout recommencer

Merci par avance

10puissance-4-v6.xlsm (219.59 Ko)

Bonjour

Au secours

Pour qu'on puisse venir à ton secours, il faudrait que tu prennes le temps d'expliquer comment fonctionne ton jeu et les tests que tu veux faire...

Bye !

Bonjour,

Effectivement ça plante ! Sérieusement, j'ai même dû tuer le processus pour débloquer ! Il y a visiblement une boucle infinie qui se génère... mais :

ayant jeté un oeil sur ton code, non indenté, à base de pans de code enregistré, excessivement répétitif et long, éparpillé dans une multitude de modules, et quelques autres trucs sur lesquels je passe... tout ce que j'aime quoi ! Et beaucoup de ce que je passe mon temps à inciter à ne pas faire...

Donc : si tu connais ton programme, tu dois pouvoir cerner à quel endroit ça se passe, dans quelle procédure l'anomalie survient, et à partir de là on peut regarder et essayer de détecter en quel point précisément ça déboque et on décroche. Sinon tu ne peux qu'espérer trouver un candidat pour partir à la pêche...

Considérant ton code comme pas lisible, surtout pas lisible de façon efficace, je m'abstiendrai.

Cordialement.

Mon problème provient de ma feuille nommé "jeu1-1".

Quand je lance une nouvelle partie (bouton nouvelle partie), et que je commence à jouer en cliquant sur les flèches pour placé les pions pour en aligné 3 pour un même joueur j'ai le message suivant : "Microsoft Excel a cessé de fonctionner" " Microsoft Excel tente de récupérer vos informations" Puis Excel se ferme.

Mais quand je fais cette manip dans mes autres grilles de jeu, par exemple jeu1-2, cela fonctionne normalement.

MFerrand,

Oui je sais les codes sont très long et répétitif car je ne m'y connais pas trop en VBA et j'essaie de faire fonctionner le jeu comme je peux ...

Mais merci pour votre message car j'ai pu débloquer le problème.

C'est en faite une macro (nbpartieGPN)qui est mal codé qui me pose soucis. Je voudrais que cette macro me comptabilise le nombre de partie jouer, le nombre de partie gagnée , le nombre de partie perdue et le nombre de match nul.

Pouvez-vous m'aider?

Merci par avance

Tu ne dis pas où se trouve le code concerné.

nbpartieGPN() c'est le module 14

Cette procédure ne comptabilise rien, elle ne prend pas en compte les résultats antérieurs et part de 0...

Elle se contente de mettre des 1 ou 0 dans la plage K5:T7... ce n'est pas ça qui provoque le plantage !

Oui mais c'est parce que je l'avais mis dans la feuille 4 (Jeu1-1): dans

"Private Sub Worksheet_Change(ByVal Target As Range)

couleurpionsJ1

End Sub"

En effet tu n'as pas cadrée la procédure Change !

Je regarde de plus près.

D'accord merci

La mise à jour de formule ne déclenche pas d'évènement Change, ce qui ne laisse la possibilité d'en déclencher qu'aux procédures liées aux flèches surmontant le tableaux, qui copient une cellule de la ligne 27 sur la ligne 26.

Mais la procédure lance nbpartieGPN, laquelle va faire des inscriptions ailleurs, qui vont produire un évènement Change, qui relance la procédure... et la boucle infinie est partie, jusqu'à ce que ça plante.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A26:F26")) Is Nothing Then
        couleurpionsJ1
        nbpartieGPN
    End If
End Sub

La précaution élémentaire est de cadrer les cellules surveillées.

nbpartieGPN ne vient pas écrire là, donc plus de souci de ce côté, mais il faut regarder les procédures de réinitialisation ou remise à zéro : pour celles qui viendront effacer la plage A26:F26, il convient de déactiver les évènements durant cette action :

    Application.EnableEvents = False

avant d'effacer cette plage, à remettre à True ensuite.

Je suis désolé mais je n'ai pas tout compris.

Le problème de boucle infinie est résolu et j'ai compris pourquoi Excel s'arretait.

Mais :

"La précaution élémentaire est de cadrer les cellules surveillées.

nbpartieGPN ne vient pas écrire là, donc plus de souci de ce côté, mais il faut regarder les procédures de réinitialisation ou remise à zéro : pour celles qui viendront effacer la plage A26:F26, il convient de déactiver les évènements durant cette action :

Code : Tout sélectionner

Application.EnableEvents = False

avant d'effacer cette plage, à remettre à True ensuite."

Je ne comprends pas cette partie.

Je crois qu'il faut d'abord que je modifie ma macro nbpartieGPN car elle ne fait pas ce que je veux soit je veux qu'elle compte le nombre de partie jouer, le nombre de partie gagnée , le nombre de partie perdue et le nombre de match nul

Que nbpartieGPN fasse ce que tu attends, c'est un autre problème, il faut terminer le premier...

Il dit y avoir deux niveaux de réinitialisation, ce qu'on efface entre 2 parties avant de continuer, et la remise à zéro complète.

Tu dois normalement avoir deux macros qui font ça, lesquelles ? Il faut les examiner, ensuite on pourra tranquillement s'occuper du reste.

J'ai le module 12 pour les feuilles de jeu3-1 Jeu3-2 Jeu-3-3 qui permet d'enclencher une nouvelle partie.

J'ai le module 10 pour les feuilles de jeu1-1 Jeu1-2 et Jeu 1-3 qui permet d'enclencher une nouvelle partie.

J'ai le module 8 pour les feuilles de jeu2-1 Jeu2-2 et Jeu2-3 qui permet d'enclencher une nouvelle partie.

J'ai le module 2 pour la mise à zéro

Pour la mise à zero, le bouton ad-hoc de toutes les feuilles lançait une macro Feuil1.miseazero_Click...

Aucune macro à ce nom étant en Feuil1, rien ne pouvait se passer...

Heureusement d'aillleurs car la macro mettait à zéro les cellules de P4 à S6... alors que la cible est R5:T7, soit aurait fait quelques dégâts.

J'ai modifié ça et tu l'auras donc correctement écrite :

Sub miseazero_Click()
    With ActiveSheet
        .Range("R5:T7").Value = 0
    End With
End Sub

Pas de recoupement avec la cible de Change, donc pas de précaution particulière.

Je vais voir les autres.

Ah oui pour les cellules, à force de tout modifier j'ai oublié de changer dans la macro .

Merci

J'ai fusionné les trois autres :

Sub Nouvellepartie()
    Dim n%
    With ActiveSheet
        n = Val(Replace(.Name, "Jeu", ""))
        Application.EnableEvents = False
        .Range("A25").Offset(n).Resize(, 5 + n).ClearContents
        Application.EnableEvents = True
        .Range("J4").Select
    End With
End Sub

et je l'ai replacé en Module 2 avec la précédente.

Les boutons pointent tous vers cette macro.

On va voir la question des résultats.

Ca fonctionne niquel, par contre pouvez-vous m'expliquer les lignes de langages svp

Le % qui suit le nom de la variable dans les déclarations de variables est ce qu'on nomme un caractère de déclaration de type, il est équivalent de As Integer et permet de déclarer une variable de type Integer.

Il en existe quelques autres : &, !, #, @ et $, respectivement pour les types : Long, Single, Double, Currency et String. Cela permet de raccourcir quelque peu les déclarations.

Dans cette ligne :

        n = Val(Replace(.Name, "Jeu", ""))

A partir du nom de la feuille, on remplace l'expression "Jeu" qui débute tous les noms par rien (fonction Replace), on se retrouve donc avec 1, 2 ou 3 suivi d'un tiret, correspondant à 3 types de feuille pour lesquels la plage à effacer varie (décalage ligne et nb de colonnes). On extrait ce nombre avec Val, fonction qui renvoie sous forme de nombre les chiffres débutant une chaîne, qui renverra donc 1, 2 ou 3 qu'on recueille dans la variable n.

Ensuite, petit calcul : on prend comme base la cellule A25, on lui applique un décalage ligne égal à n, on aura donc A26, A27 ou A28 selon le type de feuille, puis on la redimensionne en nombre de colonne à 5+n, soit 6 (jusqu'en F26), 7 (jusqu'en G27) ou 8 (jusqu'en H28)... On aura donc ainsi défini exactement la plage à effacer en fonction de la feuille.

Rechercher des sujets similaires à "probleme fichier macro"