Interrompre une macro pour entrer une donnée

Fermé
Signaler
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
-
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
-
Bonjour,

J'ai vu des questions posées qui ressemblaient à la mienne, mais les réponses me paraissent très compliquées pour quelque chose qui devrait être simple.

Je précise : grand utilisateur de Lotus 123 depuis plus de 20 ans, je me résous à passer sur Excel certains fichiers perso pour lesquels j'utilisais de nombreuses macros.

Un exemple tout simple : pour écrire "je m'appelle xyz" dans une cellule, dans Lotus il suffit d'écrire "je m'appelle {?}" pour la macro s'arrête et attende la touche Enter pour continuer à s'exécuter. Ce qui est saisi entre l'interruption et la touche Enter (en l'occurrence xyz) est enregistré et entré dans la cellule si c'est ça qui est souhaité.

J'entends parler de boucle, d'inputbox, etc. mais je dois passer à côté de quelque chose de plus simple, enfin j'espère !!!

Merci pour votre aide

A voir également:

7 réponses

Messages postés
16547
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
19 janvier 2022
3 259
Bonjour,

chaque logiciel a ses particularités !

les formules Excel sont différentes et "avant de penser VBA, penser Excel"
car il est préférables de bien connaitre Excel avant de se lancer dans VBA
sur VBA

je te conseille cet ensemble de "recettes VBA"
https://silkyroad.developpez.com/
ainsi que ce site
http://www.excelabo.net/accueil
une formation par l'exemple à la fois Excel et VBA
http://boisgontierjacques.free.fr/

bonne découverte! :o)

cordialement

0
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 677
Bonjour,

En complément de la réponse de michel_m (salutations l'ami), duquel je te recommande de suivre les conseils, ce ne sont que de saines lectures, Excel via VBA est en effet différent de Lotus. Chaque logiciel a ses particularités !

Pour faire ce que tu souhaites, il existe plusieurs solutions, certaines beaucoup plus complexes que d'autres.
La plus simple est effectivement l'InputBox.
Qu'est ce qu'une InputBox?
Définition du site Msdn (Microsoft) : Affiche une invite dans une boîte de dialogue, attend que l'utilisateur tape du texte ou clique sur un bouton, puis retourne le contenu de la zone de texte sous la forme d'une chaîne.
C'est donc exactement ce que tu souhaites faire.

Comment le code t'on?
1- tu définis une variable susceptible d'accueillir une chaine :
Dim maReponse As String

2- Dans cette variable, nous souhaitons stocker la chaine saisie par l'utilisateur :
maReponse = InputBox("Je m'appelle ?", "Saisie du Nom")

- "Je m'appelle ?" => texte apparaissant dans la boîte de dialogue
- "Saisie du Nom" => titre de la boîte de dialogue
3- traitement de cette saisie.
Affichage à l'écran :
ici nous utiliserons une autre boîte de dialogue pour l'affichage de ta réponse : le MsgBox :
Dim maReponse As String
maReponse = InputBox("Je m'appelle ?", "Saisie du Nom")
MsgBox "Tu t'appelles : " & maReponse

Affichage dans la cellule A1 de la feuille Feuil2 :
Dim maReponse As String
maReponse = InputBox("Je m'appelle ?", "Saisie du Nom")
Sheets("Feuil2").Range("A1") = "Tu t'appelles : " & maReponse


Ensuite, la question à se poser est la suivante :
Que se passe t'il si l'utilisateur Annule ou ne saisit aucune donnée dans l'Inputbox?
Si tu t'en fiches de cette saisie est qu'elle n'a aucun intérêt pour toi, ce n'est pas grave. Par contre, si cette saisie est importante pour le reste du code (par exemple), il va falloir obliger l'utilisateur à réaliser cette saisie.
C'est là qu'entre en compte la boucle... Si tu le souhaites, on pourra développer ceci.

Nota : J'ai volontairement zappé les autres paramètres de l'InputBox ainsi que l' Application.InputBox. Des détails à développer également après tes propres recherches.
0
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
4
Bonsoir et merci à tous les deux. Je me débrouille avec Excel mais sans macros, et pour aller plus loin je crois qu'effectivement j'ai de la lecture !!!

Cela me fait d'autant plus regretter Lotus. C'était quand même plus facile de mettre dans la macro un point d'interrogation entouré d'accolades : {?} et ça suffisait pour attendre une saisie qui devait se terminer par Entrée.

Pourquoi on n'a plus accès à une telle simplicité ???...
A bientôt pour d'autres questions, probablement !
Denis
0
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
4
Encore moi... et encore merci, je parcours les liens de michel_m et la solution de pijaku a marché du premier coup ou presque !
Et déjà le problème suivant, auquel je ne trouve pas de réponse malgré mes lectures attentives : je veux mettre dans la cellule courante la somme des cellules situées en-dessous, jusqu'à un point défini manuellement car il changera d'une fois sur l'autre.
C'est un peu la même chose qu'au-dessus : donner la main à l'utilisateur pour compléter l'action à réaliser. Mais cette fois pas de boite de dialogue !
Bonne soirée !
0
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 677
Bonjour,

Tu dis : je veux mettre dans la cellule courante la somme des cellules situées en-dessous, jusqu'à un point défini manuellement car il changera d'une fois sur l'autre

J'ai écris, hier, suite à ton sujet, un petit topo sur l'InputBox. Tu le trouveras ICI.
Dans ce mini tutoriel, la réponse à ton souci est dans le chapitre sur Application.InputBox.
En effet, cette méthode permet d'ajouter un type à l'InputBox. Ici, on va vouloir déterminer un champ, une plage de cellules, sélectionnées manuellement par l'utilisateur.
Pour cela :
Dim Champ As Range
Set Champ = Application.InputBox("Sélectionnez les cellules à additionner", "Addition", Type:=8)
MsgBox Champ.Address

Nous obtenons donc l'adresse de la plage de cellules à additionner.

La formule en elle même n'est pas très compliquée à reproduire. Il nous faut une chaîne de caractères comme ceci : "=SOMME(Champ)"
Pour cela, il nous faut donc déclarer une variable String pour y placer notre formule :
Dim Formule As String, Champ As Range
Set Champ = Application.InputBox("Sélectionnez les cellules à additionner", "Addition", Type:=8)
Formule = "=SOMME(" & Champ.Address & ")"

Regarde également la place des guillemets dans la formule. Si l'on veut intégrer une variable dans une chaîne de caractères, il faut "l'isoler" du reste qui lui est écrit en "dur"...

Pour placer la formule dans notre cellule active, il suffit d'utiliser ActiveCell.FormulaLocal, comme ceci :
Dim Formule As String, Champ As Range
Set Champ = Application.InputBox("Sélectionnez les cellules à additionner", "Addition", Type:=8)
Formule = "=SOMME(" & Champ.Address & ")"
ActiveCell.FormulaLocal = Formule


Allons plus loin.
Que se passe t'il si l'utilisateur clique sur le bouton OK de l'inputBox sans avoir sélectionné de cellule?
=> Un message automatique de signalement d'erreur s'affiche,
=> L'utilisateur retourne sous l'InputBox.
Problème résolu.

Par contre, si l'utilisateur clique sur ANNULER?
VBA plante sur la ligne
Set Champ = Application.InputBox("Sélectionnez les cellules à additionner", "Addition", Type:=8)
.
Que faire pour y remédier?
Si tu as ,lu mon mini tutoriel, tu as vu qu'il suffit d'ajouter, à la macro, un gestionnaire d'erreur. Comme ceci :
Dim Formule As String, Champ As Range

On Error GoTo AbandonUtilisateur 'En cas d'erreur

Set Champ = Application.InputBox("Sélectionnez les cellules à additionner", "Addition", Type:=8)
Formule = "=SOMME(" & Champ.Address & ")"
ActiveCell.FormulaLocal = Formule

Exit Sub 'sortie si tout s'est bien déroulé

AbandonUtilisateur: 'gestion de l'erreur
MsgBox "Annulation."


Voilà. C'était tout simple non?
0
Messages postés
24276
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 janvier 2022
7 028
Bonjour à tous,

jusqu'à un point défini manuellement car il changera d'une fois sur l'autre.
Pose-toi quand même la question de savoir si ce point n'est pas détectable. Dans ce cas le rechercher par macro et ne rien demander à l'utilisateur.
Ex: dernière cellule, cellule à gauche qui contient tel texte, etc

eric
0
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
4
Bonjour tout le monde !

J'avance, doucement...
OK pour Application.InputBox. En plus j'ai un gros avantage, je suis le seul utilisateur de mes fichiers, donc je n'ai pas à gérer les erreurs de saisie, les macros ne me servent qu'à gagner du temps. Enfin, quand elles marcheront...

Donc deux questions :
J'ai compris les paramètres xpos et ypos. J'ai bien ajouté une virgule pour qu'il ne prenne pas xpos pour une valeur par défaut (dont je n'ai pas besoin).
Mais ça marche pour la macro de vendredi avec InputBox mais pas avec Application.InpuBox. Et comme je veux entrer un champ, la boite de dialogue cache la cellule courante et donc ce que je veux voir.

La deuxième question est plus importante : les champs ainsi entrés sont en références absolues, or j'ai besoin de références relatives car je dois copier la formule. Comment on peut lui dire ? J'ai essayé F4 après avoir entré le champ, mais les $ reviennent dès que j'entre la formule.

D'une manière plus générale, j'ai du mal avec la syntaxe de VBA. Pas les boucles car j'ai des souvenirs de programmation, mais l'ordre des mots etc.


@eriic, merci du tuyau, mais il n'y a vraiment pas de critères pour déterminer la fin du champ, sauf éventuellement la couleur de la cellule, mais on verra plus tard !

Bonne soirée !
0
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 677
Bonjour Eriiic, Michel, Papou, le forum,

En ce qui concerne le positionnement... InputBox accepte bien le positionnement grâce à xpos et ypos. Cependant, Application.InputBox semble se comporter différemment. A croire qu'Excel retient la dernière position à laquelle tu as placé ton Application.InputBox manuellement.
Essaye ceci :
Lance la macro donnée ci-dessus, et, à l'apparition de l'inputbox, déplace la à la souris. Lorsque tu relances ta macro, cet emplacement semble définitif, du moins jusqu'à ce que tu la déplaces manuellement à nouveau...
Curieusement, cet emplacement correspond avec celui de la boite de dialogue Macros (Alt+F8)...
Je n'ai pas de solution pour l'instant si ce n'est de la placer ou tu le souhaites, manuellement, à la première utilisation...

sauf éventuellement la couleur de la cellule, mais on verra plus tard !
Le mieux est de tout savoir de suite... Ce que tu as, ce que tu veux etc... Si l'on suit une piste et qu'elle s'avère mauvaise, nous devrons tout recommencer depuis le début...
0
Messages postés
32
Date d'inscription
mercredi 25 décembre 2013
Statut
Membre
Dernière intervention
9 novembre 2021
4
Bonjour Pijaku, le placement à la main de l'Inputbox me va bien, surtout qu'il est mémorisé quand on ferme Excel.
Pour les couleurs c'était juste une idée de critère pour délimiter le champ à entrer mais je n'en ai pas vraiment besoin, je préfère digérer progressivement VBA.
Par contre, la gestion des références absolues/relatives est importante pour moi car souvent je recopie des formules.
Merci !
0