IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème avec les keys dans un petit programme [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut Problème avec les keys dans un petit programme
    Bonjour,

    J'ai créé un modeste petit jeu d'enchères, celui ci fonctionne tel qu'il est supposé fonctionner
    l'utilisateur dispose de 3 actions possibles, Egaler, Monter ou PAsser qu'il actionne au moyen de petits contrôles
    afin de faciliter la tâche j'ai voulu mettre des raccourcis simples sans combinaison de touches sur les macros associées et donc déclencher ces macros sur appui des touches respectivement E, M et P... ça a l'air de fonctionne sauf que de temps en temps, le programme s'arrête comme si il y avait une sorte de End suite à l'appui d'une touche et je ne comprends pas pourquoi

    en fait ça semble s'arrêter quand je suis dans une cellule sélectionnée et que j'écris une lettre n'importe laquelle ça agit comme un End alors que si par contre je suis pas focus dans une cellule là ça passe

    Si vous avez une idée

    test_ench_dvp.xlsm

    merci bcp
    Gorz


    ANNEXE pour ceux qui veulent pas activer les macros je sais qu'il y en a voici la totalité du code VBA derrière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Long) As Integer
    Public monte
    Public bouge
    Sub lancer_enchère()
    For Each cell0 In Range("stratégiedechacun")
    cell0.Value = Int((Rnd() - 0.4) * 4)
    Next cell0
    Range("vous") = Application.UserName
    Range("obj") = Int(Range("nbjoueurs") * 3 * Rnd()) + 2
     
    Range("zoneobj").ClearContents
    For Each cell0 In Range("zonebrzf")
        cell0.Value = Range("brzf")
    Next cell0
     
    MsgBox ("L'enchère commence, il y a " & Range("obj") & " objets en jeu")
     
    For i = 1 To Range("obj")
        Range("prix") = 0 'initialisation du prix
        Range("monprix") = 0 'initialisation de la mise
        bouge = 1 'utile pour bloquer un cheat
    debutench:
        monte = 0 'indicateur d'action manuelle
        ActiveSheet.Calculate 'cycle des enchères automatiques
        While Range("encours") > 0 And Range("enlice") > 1
            Range("prix") = Range("prix") + 1
            ActiveSheet.Calculate
            DoEvents
        Wend
        '--------------- début des enchères manuelles -------------'
        deb = Timer
        While Timer - deb < 5
     
            If GetAsyncKeyState(69) <> 0 Then Call Egaler
            If GetAsyncKeyState(77) <> 0 Then Call Monter
            If GetAsyncKeyState(80) <> 0 Then Call passer
     
            If monte = -1 Then 'le joueur a passé son tour
                deb = Timer - 5 'on accélère la fin de l'enchère
                GoTo finench 'on va à la fin de l'enchère
            End If
            If monte = 1 And bouge = 1 Then GoTo actionmanuelle
            DoEvents
            If Range("prix") > 0 Then 'y a-t-il un preneur ?
                Range("état") = "Objet n°" & i & " pour " & Range("prix") & " jetons à " & Range("joueurs")(Range("gagnant")) & ", " & Format((Timer - deb) / 2, "0") & " fois"
            Else
                Range("état") = "Personne ?"
            End If
        Wend
    actionmanuelle:
        If monte = 1 And bouge = 1 Then
            bouge = 0
            GoTo debutench 'si le joueur égalise ou enchérie on recommence au début
        End If
    finench:
        If Range("prix") > 0 Then
            While Timer - deb < 7
                Range("état") = "Adjugé vendu pour " & Range("prix") & " jetons à " & Range("joueurs")(Range("gagnant"))
            Wend
            Range("zoneobj")(Range("gagnant")) = Range("zoneobj")(Range("gagnant")) + 1
            Range("zonebrzf")(Range("gagnant")) = Range("zonebrzf")(Range("gagnant")) - Range("prix")
        Else
            While Timer - deb < 7
                Range("état") = "L'objet n'a pas trouvé preneur :'("
            Wend
        End If
     
    Next i
     
    '---------------   FIN DE PARTIE --------------'
    Range("état") = "terminé !"
    malig = Sheets("Historiq").Cells(1, 1)
    Sheets("Historiq").Cells(1, 1) = malig + 1
    Sheets("Historiq").Cells(malig, 3) = Range("obj") 'nombre d'objets
    Sheets("Historiq").Cells(malig, 1) = Application.UserName
    ActiveSheet.Calculate
    If Range("supergagné") Then
        Sheets("Historiq").Cells(malig, 2) = "supergagnant"
        MsgBox "Bravo vous êtes vraiment le meilleur de tous"
    Else
        If Range("gagné") Then
            Sheets("Historiq").Cells(malig, 2) = "gagnant"
            MsgBox "Bravo vous avez réussi à être le meilleur ex aequo"
        ElseIf Range("loose") Then
            Sheets("Historiq").Cells(malig, 2) = "loose"
            MsgBox "Vous avez échoué lamentablement à avoir un maximum d'objets"
        ElseIf Range("superloose") Then
            Sheets("Historiq").Cells(malig, 2) = "superloose"
            MsgBox "ah non mais là c'est vraiment très mauvais !"
        Else
            MsgBox "perdant"
            MsgBox "bon t'as perdu, étrange non?"
        End If
    End If
     
     
    End Sub
    Sub Monter()
    If Range("monbrzf") <= Range("prix") Then
        MsgBox "tu n'es pas solvable mon ami..."
        Range("monprix") = 0
    Else
        monte = 1
        bouge = 1
        Range("monprix") = Range("prix") + 1
        Range("état") = Application.UserName & " a surenchéri à " & Range("monprix") + 1 & " jetons !"
    End If
     
    End Sub
     
    Sub Egaler()
    If Range("monbrzf") < Range("prix") Then
        MsgBox "c'est la prison qui te guette mon pauvre !"
        Range("monprix") = 0
    ElseIf bouge = 1 Then
        monte = 1
        Range("état") = Application.UserName & " propose " & Range("prix") & " jetons également"
        Range("monprix") = Range("prix")
    Else
        MsgBox "tu ne peux égaler qu'une fois mon petit"
    End If
    End Sub
    Sub arreter()
    Range("état") = "Jeu arrêté"
    End
    End Sub
    Sub passer()
        monte = -1
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    si tu veux mon avis ca n'est pas le seul probleme que tu a
    le system d'enchere comporte une/des erreurs de conception si tu veux mon avis
    en effet des que je remporte un enchere je n'ai donc plus assez pour encherir sur un 2d article, parti de la tout le jeu est bidon puisqu'un seul article sera accessible au joueur
    d'autant plus que des que je surrencheris les autre joueur virtuel ne surrencherissent plus c'est donc bidon du debut a la fin

    il te manque
    1. un timer qui constiturais le delai de reflexion des joueur virtuels afin qu'il puissent surrencherrir apres toi et cela avec des fonction tel que RND(0 ou 1) qui deciderait SI!! il surrencherissent ou pas en fonction de ce delai
    2. une limite au moins du double de jetons pour pouvoir acquerrir au moins 2 articles car des que l'on depasse 5/6 jetons on ne peut plus surrencherir

    c'est le principe du joueur virtuel que tu a completement zapé de ton jeu

    le timer pour le delai de reflexion joueur virtuel doit se déclenché a chaque surrencherrissement du joueur rel
    c'est pas une mince affaire sachant que dans ton exemple ca va tres vite
    t a bien plus de boulot que tu crois pour ce petit jeu amusant
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut
    merci pour votre retour
    en fait le jeu fait exactement ce que j'en attends, je pourrais en expliquer les tenants et abouttisants ultérieurement mais le jeu n'est pas une finalité en lui même, et il répond à ce qu'on appelerait dans un jargon professionnel, au cahier des charges, pas de souci de conception donc à ce niveau - et, si les joueurs virtuels vont surrenchérir tant que leur montant max n'est pas atteint, c'est notamment visible en fin d'enchères quand il y a beaucoup de lots - quand à la limite à 10 jetons c'est justement fait exprès. Le nombre total d'objet est connu dès le début donc au joueur d'adapter son money management afin d'être sur le podium. Quand il y a peu d'objets il faut effectivement surrenchérir, par contre quand il y en a beaucoup, il faut mieux attendre la fin où les prix baissent. Rajouter trop de jetons augmenterait la complexité mathématique du modèle par rapport à ce que je veux en faire. Il ne s'agit pas non plus d'un jeu de rapidité. En cas d'égalité des mises maximales, le gagnant est tiré au hasard afin d'éliminer justement tout biais lié à la lenteur des reflexes.

    mais pour revenir au sujet ma question portait sur l'utilisation des raccourcis E, M P mais en fait n'importe quelle autre touche, qui dès qu'on l'appuie, va interrompre le programme, indépendament même du fait que j'essaie d'intercepter les frappes claviers

    bav
    Gorzyne

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Bonjour,

    Je met mon petit grain de sel en faisant simplement 2 remarques sur la qualité du code:
    1- il faut toujours préférer les références complètes des cellules, càd RefFeuille.RefCellule.
    Range("stratégiedechacun") c'est pas bon
    Sheets("Historiq").Cells(1, 1) = malig + 1 c'est bon
    2- utilisation de Goto + étiquette Je croyais que plus personne n'utilisait cette technique, je me trompais! Mais elle est à bannir!!
    Cordialement

  5. #5
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut
    oui je sais je sais mais j'ai p£$sé le code en 1het demi donc je suis allé au plus vite, comme je disais un peu plus haut mon but est pas de faire un jeu, c'est juste une étape pour un projet plus théorique

    mon problème est que le jeu s'arrête quand j'appuie sur une touche et je comprends pas pourquoi

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 69
    Par défaut
    Salut
    J'ai pas énormément regardé ton code mais je me demande si ton problème ne serait pas à cause des feuilles actives.
    Quand tu click sur un des boutons il va changer la valeur d'un champ sur une autre feuille?
    et donc changement de feuille active qui va faire planter ton programme apres?

    Comme le disait Philippe PONS tu devrais essayer de référencer sur quelle feuille tu prends tes données à chaque Range.
    Je ne suis pas sûr que ce soit la solution mais tu devrais essayer.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par Philippe PONS Voir le message
    [...]
    Je met mon petit grain de sel en faisant simplement 2 remarques sur la qualité du code:
    1- il faut toujours préférer les références complètes des cellules, càd RefFeuille.RefCellule.
    Range("stratégiedechacun") c'est pas bon[...]


    Si la plage nommée a une portée de classeur, il est justement plus intéressant de ne pas la préfixer de la feuille qui la contient, le code VBA pouvant ainsi continuer à fonctionner en cas de déplacement de la plage sur une autre feuille. Les plages nommées (lorsqu'elles sont uniques) et les références structurées apportent cette souplesse au code et il serait vraiment dommage de s'en priver

    Par contre, pour le reste, je suis d'accord avec toi. Le code est "mal torché" et les GOTO sont effectivement à bannir. Avant de vouloir résoudre le problème évoqué, il conviendrait d'écrire le code de façon propre et en respectant les règles de l'art (programmer par fonctions plutôt que par GOTO, notamment).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut
    eh bien tout bêtement

    si j'écris par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Long) As Integer
    Sub test()
    deb = Timer
    While Timer - deb < 5
    DoEvents
    Wend
    MsgBox "programme fini"
    End Sub
    le programme attend 5 secondes et ensuite on a bien la msgbox, témoin de la bonne terminaison du programme.

    Dans le programme visé, on a la même boucle Wend.

    Si j'appuie sur une touche alors qu'une cellule est sélectionnée le programme s'arrête sans crier gare
    Si par contre c'est un shape qui est sélectionné alors le programme ne s'arrête pas

    Du coup bon je suis un peu perplexe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les apostrophes dans le sql en VBA
    Par cyrilboulan dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 14/03/2017, 10h11
  2. Réponses: 3
    Dernier message: 26/09/2014, 15h32
  3. Problème avec les espaces dans un tableau !
    Par remixtech dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/07/2006, 19h30
  4. Problème avec les délimiteurs dans un trigger
    Par Invité dans le forum DB2
    Réponses: 4
    Dernier message: 01/05/2006, 22h53
  5. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo