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

  1. #1
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    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 379
    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 379
    Points : 12 075
    Points
    12 075
    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 régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    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 éprouvé
    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
    Points : 1 166
    Points
    1 166
    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 régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    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 régulier
    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
    Points : 72
    Points
    72
    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
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    Par défaut
    non on travaille que sur un seul onglet, tout les ranges sont dans l'activesheet, j'ai même pris la peine d'écrire range("") explicitement au lieu des simples crochets qui parfois ne fonctionnent pas (un autre mystère d'Excel), c'est seulement à la fin où l'on va historiser les scores mais c'est à la fin de la partie, sinon en cours de jeu tout se passe dans l'activesheet... en tout état de cause, l'essentiel de l'execution du progamme se passe dans la boucle le programme fonctionne correctement sauf quand l'utilisateur appuie sur une touche ce qui a pour effet de provoquer l'arrêt définitif du programme ce qui n'est pas logique. J'imagine qu'il doit y avoir une bonne raison... le programme ne plante pas, il s'arrête ce qui est différent. S'il se plante je peux débuguer mais là il s'arrête purement et simplement comme si j'avais mis un end sur un évenement keypress, ce qui est pas le but: le programme fonctionne bien et fait ce que j'en attends, sauf quand j'appuie sur une touche du clavier. J'ai essayé d'enlever le doevents et même les interceptions de frappe mais ça ne change rien... du coup je suis perplexe

  8. #8
    Membre régulier
    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
    Points : 72
    Points
    72
    Par défaut
    tu as essayé de mettre des points d’arrêt dans tes fonctions? (tu appuie sur la marge grise a gauche.)
    Ca te donnera une idée si ton programme parvient à executer tes fonctions

  9. #9
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    Par défaut
    oui j'ai essayé mais comme ça se passe dans une boucle wend temporelle c'est pas évident de débuguer, car ce n'est pas une instruction qui pose problème mais un appui touche clavier, qui est executée au moment du doevents, et j'ai pas de macro évenementielles non plus je précise au cas où

    j'appuie sur une touche -> le programme s'arrête boum

    j'ai commencé à comprendre le problème, en fait quand j'ai une cellule selectionnée le fait d'appuyer sur une touche va "entrer" dans la cellule un peu comme quand on fait F2, et cela vous est sans doute déjà arrivé quand vous êtes dans une cellule, vous ne pouvez avoir le focus dans VBA, par exemple pour faire du pas à pas... en fait le fait d'être dans une cellule bloque l'interpréteur qui ne parvient dès lors à reprendre la macro... une solution est donc de trouver un moyen que l'appui de touche ne se fasse pas dans une cellule par exemple si je sélectionne une forme, là ça va fonctionner sans s'interrompre... mais du coup j'ai limite envie de penser que c'est presque une sorte de bug de vba qui n'arrive pas à reprendre la main... en effet c'est le doevents qui me permet d'entrer dans une cellule en cours d'execution, mais de mémoire on a pas ce problème quand le code s'execute depuis une Usf en affiche non-modal (ou bien si ? je sais pas)...

    j'ai pas le sentiment que ce soit le code le problème d'ailleurs il fonctionne bien hormis l'interception du keypress, mais plutôt la façon dont excel et vba se passent la main.
    mais c'est quand même étonnant que VBA ne parvienne pas à reprendre la suite de sa macro...

    Gorzyne

  10. #10
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    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...
    ---------------

  11. #11
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    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

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    personnelement, avec le code dans un module Standard et sur excel 2010 le msgbox apparait même si j'appuie sur une touche.
    Avec, bien sûr, la cellule en édition avec la lettre. Il ne faudrait pas vider le tampon dans les sub type 'egaler'? (aucune idée du comment)
    eric

  13. #13
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    Par défaut
    oui avec le deuxième exemple, mais avec le classeur du 1er message ça marche aussi ?

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    L'application Excel est un tableur et ce que tu en fais n'est pas exactement la vocation d'un tableur.
    Mais bon ...

    Je ne comprends pas le choix fait d'utiliser ( en boucle....) une interception des touches (la fonction que tu utilises de l'Api de Windows) en lieu et place de la définition d'un raccourci (autre fonction de l'Api de Windows)

    Je ne comprends d'ailleurs même pas pourquoi ( pour "faire bien" ? ) utiliser des fonctions de l'Api de Windows pour décider d'une action en fonction d'une touche pressée, alors qu'existe la méthode VBA/Excel Application.Onkey !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Et de surcroît :
    1) je n'ouvre jamais un classeur tiers et n'ai donc pas ouvert le tien, lequel contient en plus (au vu de ton code) l'utilisation d'une fonction de type "espionnage" des frappes de l'utilisateur (généralement utilisée à des fins rarement avouables) ... Non, mais ... et puis quoi, encore ?
    2) intercepter simplement une touche n'a pas pour effet son annulation. Elle a été pressée et le fait que ton code sache laquelle n'a pas pour conséquence qu'elle n'a pas été pressée.
    Lorsque tu es dans une cellule :
    - dès que tu commences à y frapper (et tu y frappes bel et bien), c'est Excel qui prend totalement la main et gère comme IL l'entend (c'est lui, le patron) ; il ne la "rend" que lors de la sortie de cette cellule

    - Ignorant à peu près tout de ce que gèrent éventuellement tes instructions dans des procédures évènementielles, il n'est de surcroît (je dis bien "de surcroît", car même sans cela, tu restes dans la cellule) pas possible d'écarter l'éventualité du "pire" de chez "pire". Tu es bien le seul à savoir ce que tu ordonnes.

    Conclusion ? --->> ton mécanisme est à reconsidérer. Tu ferais mieux d'en envisager un autre, moins scabreux, sur la base de ce que je t'ai dit dans mon message précédent.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  16. #16
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    Par défaut
    non mais en fait j'ai le problème avec ou sans le fait de chercher à intercepter les touches (pour déclencher des macros)
    je vais essayer avec Application.Onkey, la piste paraît interessante

    La boucle While correspond au fait qu'on laisse à l'utilisateur 5 secondes avant la fin de l'enchère, pendant cette intervalle de temps il peut appuyer sur un bouton. Pour faire simple, je cherchais à pouvoir déclencher ces macros par touches, mais sans les raccourcis qui nécessitent une combinaison de 2 à 3 touches, ce qui est fastidieux, donc je voulais un appui simple;

    c'est alors que je me suis rendu que l'appui de touche interrompait l'execution de VBA qui ne parvenait à reprendre la main. J'ai donc désactivé toute cette partie du code liée à l'interception des touches y compris l'API, mais en fait l'interruption du programme par un appui de touche a quand même lieu.

    comme j'avais indiqué au début, il n'y a pas de macros évenementielles ou autre, le code que j'ai fourni correspond à 100% du code utilisé dans le programme, le reste se passe sous Excel.

    beaucoup m'invitent à reprogrammer l'application, en fait ce n'est pas du tout mon objectif, non pas que j'en ai pas la capacité, je sais réaliser des choses abstraites et complexes, j'ai déjà travaillé sur des codes de plus de 100 000 lignes, donc je sais ce qu'est un programme propre et costaud

    mais vous savez également que quand on fait du prototypage on va au plus rapide, et pour des tests de coin de table, et bien on écrit parfois des trucs par propre. Comme j'ai expliqué également, le programme fait exactement ce que je souhaite qu'il fasse, sans erreur. Je n'ai donc pas l'utilité de le réécrire, sachant que le point que je soulève n'est pas du tout sur le "chemin" critique de la suite de mon projet, qui consiste à challenger le modèle formel de stratégie du classeur exemple, avec une approche par machine learning. Il s'agit donc d'explorer le terrain de la théorie des jeux par une approche neuronale.

    L'objet de mon post est donc que j'ai remarqué ce "bug" dont l'origine trouve peut être sa source dans des questions programmatiques, mais qui correspond cependant à un comportement "non-intuitif" de Excel-VBA comme il y en a beaucoup d'autres, connus ou non. C'est donc dans un objectif plus large et pour ma culture personnelle que je me posais la question de ce qui aurait pu causer l'interruption d'un programme. J'ai donc fait le test sur une boucle vide afin de voir si le "bug" se reproduisait or ce n'était pas le cas, donc j'imagine qu'entre les deux il y a un petit hic.

    @unparia, pour t'éviter à avoir à manipuler du .xlsm de source inconnue, je peux mettre en copie le classeur au format xlsx, et ensuite charge à toi de copier la macro que j'ai indiqué, c'est simplissime, un onglet+un module, tu me dis

    Gorzyne

  17. #17
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    non mais en fait j'ai le problème avec ou sans le fait de chercher à intercepter les touches (pour déclencher des macros)
    je vais essayer avec Application.Onkey, la piste paraît interessante
    .......
    c'est alors que je me suis rendu que l'appui de touche interrompait l'execution de VBA qui ne parvenait à reprendre la main. J'ai donc désactivé toute cette partie du code liée à l'interception des touches y compris l'API, mais en fait l'interruption du programme par un appui de touche a quand même lieu.
    Me relire :
    Lorsque tu es dans une cellule :
    - dès que tu commences à y frapper (et tu y frappes bel et bien), c'est Excel qui prend totalement la main et gère comme IL l'entend (c'est lui, le patron) ; il ne la "rend" que lors de la sortie de cette cellule
    Quant à :
    @unparia, pour t'éviter à avoir à manipuler du .xlsm de source inconnue, je peux mettre en copie le classeur au format xlsx, et ensuite charge à toi de copier la macro que j'ai indiqué, c'est simplissime, un onglet+un module, tu me dis
    Je comprends que la raison puisse t'échapper, mais je n'ouvre AUCUN classeur tiers (lis ma signature), avec ou sans macro
    L'appli Excel est déjà un exécutable, à elle seule.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  18. #18
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 326
    Points : 116
    Points
    116
    Par défaut
    merci pour ton retour mais le souci est que justement Excel ne rend pas la main à VBA c'est tout là le problème ...
    le programme VBA est défintivement interrompu, c'est à dire qu'il ne reprend pas, comme le ferait une instruction Voilà c'est cet état de fait qui me chiffonne

    vu pour le xlsx, je ne savais pas que les xlsx étaient dangereux également... après tout le monde a un vieux pc déglingos, perso ça me fait pas trop peur d'ouvrir des sources cheloues, au pire j'utilise un pc de seconde utilité, enfin passons, tout le monde ne manipule pas du secret defense

    au pire du pire j'imagine qu'en remplaçant les = par un symbole rare et en mettant en .csv avec les modules à côté en t.txt quelqu'un doit pouvoir reconstituer un classeur Excel de façon safe, c'est comme ça que je ferai si j'étais sur un PC ultra touchy

    EDIT:

    ça me paraissait bizarre que tu dises ça :

    dès que tu commences à y frapper (et tu y frappes bel et bien), c'est Excel qui prend totalement la main et gère comme IL l'entend (c'est lui, le patron) ; il ne la "rend" que lors de la sortie de cette cellule
    en fait non si je reste dans la cellule avec le petit exemple que j'avais donné, VBA reprend la main d'office même si le curseur est encore présent dans la cellule, c'est juste qu'on ne peut par contre pas accéder à l'éditeur. L'accès manuel a l'éditeur semble bien bloqué mais le VBA ne s'arrête pas, le timer n'est pas mis en pause parce qu'on est entré dans une cellule... après c'est peut être spécifique au boucle wend. Je vais essayer avec une boucle for tiens pour voir

    EDIT 2: c'est la même pour une boucle for, pas d'interruption lorsqu'on "entre" dans une cellule

  19. #19
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Gorzyne Voir le message
    [...]vu pour le xlsx, je ne savais pas que les xlsx étaient dangereux également...[...]
    Il n'y a à ma connaissance aucun risque à ouvrir un xlsx. Ceux qui souhaitent débattre sur le sujet pourront le faire sur une autre discussion. Merci ��
    "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...
    ---------------

  20. #20
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Il n'y a pas plus sourd que celui qui ne veut pas entendre ni pire ouvrier que celui qui ignore ce que sont ses outils.

    L'instruction msgbox est la seule de vba qui ne sera pas bridée. Il faut bien qu'elle garde la priorité, ne serait-ce que pour signaler des erreurs éventuelles.

    Le voilà, le test que tu devrais faire :

    1) le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Range("A1").Value = ""
      deb = Timer
      While Timer - deb < 10 ' je mets 10 pour que tu aies le temps de simuler
         DoEvents
      Wend
      Range("A1").Value = "programme fini"
    End Sub
    2) le mode d'emploi
    a) sélectionne une cellule et ne fais rien --->> tu auras alors sans problème ton "programme fini" en A1 au bout de 10 secondes
    b) sélectionne maintenant n'importe quelle cellule et frappe n'importe que lettre avant 10 secondes--->> tu pourras te "brosser le bec" -->> ton "programme fini" ne sera jamais en A1. Il y apparaîtra par contre au bout de 10 nouvelles secondes si tu sélectionnes n'importe quelle autre cellule et ne fais rien.
    Je te laisse maintenant là.

    EDIT : j'ai eu tort de dire "est la seule de vba qui ne sera pas bridée". Ne seront en fait pas bridée toutes les instructions sans influence sur la feuille de calcul, les fenêtres Excel, leurs cellules, etc ... (il est par exemple normal de pouvoir sauvegarder, quitter, signaler, etc ...) . Toutes les autres le seront ("bridées") pendant la "mobilisation" provoquée par la frappe d'un caractère dans une cellule.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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. 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