XL 2013 Remplacer InputBox

Steben

XLDnaute Nouveau
Bonjour
Aimant participer à des lotos associatifs, la crise sanitaire m'a fait découvrir ce jeu sur Internet. On reçoit nos grilles en format PDF et le tirage a lieu en direct.
Pour m'amuser, j'ai créé un fichier Excel qui m'évite de faire une copie des grilles et de sortir des pions. J'entre le numéro sorti dans une fenêtre Inputbox et tout fonctionne, jusqu'à m'indiquer les quines, double-quines et cartons pleins.
Mais il fait reconnaître que la fenêtre InputBox n'est pas très esthétique et je voudrais améliorer. L'idée est de rentrer le numéro dans une case et valider. Problème : comment demander à la macro d'attendre la validation, de vérifier et se remettre ensuite en pause en attente du retour-chariot ?
J'ai essayé plusieurs choses sans succès, retombant le plus souvent sur une boucle infinie.
Novice en VBA, j'espère que l'un de vous pourra m'aiguiller, sans pour autant me donner les détails de la solution : j'aime bien chercher !
Merci par avance et bonne journée
JP
 
Solution
Bonjour Steben,
Vous pourriez passer par une Worksheet_Change.
Si la valeur entrée est validée par Entrée alors on la traite.
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("G10")) Is Nothing Then
        ' Traitement de la valeur en G10
        ' Ici, n'importe quoi : copie de la valeur en B2 pour exemple
        [B2] = Target
    End If
End Sub

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Steben,
Vous pourriez passer par une Worksheet_Change.
Si la valeur entrée est validée par Entrée alors on la traite.
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("G10")) Is Nothing Then
        ' Traitement de la valeur en G10
        ' Ici, n'importe quoi : copie de la valeur en B2 pour exemple
        [B2] = Target
    End If
End Sub
 

Pièces jointes

  • essai tirage.xlsm
    13.9 KB · Affichages: 7

Steben

XLDnaute Nouveau
Bonjour Sylvanu
J'ai créé la macro correspondant à ta suggestion. Je crois avoir compris que Target.Count équivaut à une pause . Mais comment l'intégrer dans ma macro car je ne la retrouve pas dans la liste des macros créées pour ce classeur ?
Merci pour ton aide
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Target.Count équivaut à une pause
Non. En fait Worksheet_Change est une macro événementielle qui doit obligatoirement se trouver dans la feuille concernée, non pas dans un module.
A chaque fois qu'on modifie une cellule dans la feuille on exécute cette macro.
Target est la cellule qu'on vient de modifier. ( d'où le Target As Range )
On regarde alors si la cellule est dans le range désiré, ici :
VB:
If Not Intersect(Target, Range("G10")) Is Nothing Then
Si c'est G10 on exécute le reste de la macro, sinon on sort.
Regardez dans Feuil1 vous y trouverez le code.
 

Steben

XLDnaute Nouveau
Merci Professeur Sylvanu
Après m'être trompé d'endroit pour placer le code, j'ai enfin réussi à faire fonctionner le programme comme je le souhaitais. Il me reste à peaufiner quelques points et ce sera parfait.
Grâce à des gens comme toi, on arrive à progresser.
Merci encore et bon week-end

PS : comment fermer le sujet ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
comment fermer le sujet ?
C'est fait. Mettre la solution retenue en vert met en résolu dans la liste des post :
1645261113574.png

Un détail important si vous ne connaissiez pas les macros événementielles. Le problème de la ré entrance.
Dans l'exemple que j'ai donné, si vous vouliez à la fin de la macro effacer la cellule qui a provoqué l'exécution de la macro comme ci-dessous, alors XL va se figer comme s'il s'était planté.
VB:
[B2] = Target
[G10]=""
Pourquoi ? Le fait d'écrire en G10 exécute la macro, lorsque vous effacer G10, vous écrivez dedans ... donc vous exécutez la macro, qui écrira en G10 ... donc vous exécutez la macro... ad vitam aeternam
Pour éviter cela, il faut interdire tout événement lorsqu'on écrit dans les cellules concernées avec Application.EnableEvents = False comme cela :
Code:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("G10")) Is Nothing Then
        ' Traitement de la valeur en G10
        [B2] = Target
        ' J'interdit tout nouvel événement :
        Application.EnableEvents = False
        ' Je modifie G10
        [G10] = ""
        ' J'autorise de nouveau les events :
        Application.EnableEvents = True
    End If
End Sub
 

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 846
dernier inscrit
Silhabib