Microsoft 365 Récupérer la variable d'un Inputbox

Léraud Florian

XLDnaute Junior
Bonjour à tous,

Depuis que j'ai découvert ce forum, je n'arrête pas d'explorer toutes les fonctionnalités Excel ^^

J'ai une petite question (qui ne devrait pas poser de soucis pour les experts d'Excel =) ) :

- je voudrais simplement récupérer le texte rentré par l'utilisateur dans l'inputbox et le mettre dans une cellule spécifique.

Cependant, avec le bout de code que j'ai fais, Excel m'affiche la variable du message et non la réponse, je ne sais pas comment récupérer cette dernière.

Je vous met mon code VBA ci-dessous :

VB:
Sub Chantier()

Dim Chantier As String

With Sheets("2022") 'dans la feuille 2022

          Chantier = "Quel est le chantier ?"
          B = InputBox(Chantier, vbQuestion, "Nom du chantier")
          
          If B = vbCancel Then
                MsgBox "Aucune donnée ne va être importée dans le planning", vbInformation
          Close B
          
          Else
                Range("G15") = Chantier
    
          End If
          
End With

End Sub

Merci d'avance =)
 

Phil69970

XLDnaute Barbatruc
Bonjour @Léraud Florian

Edit : Bonjour Sylvain pb de rafraichissement comme d'hab....

Tu as la réponse dans ton code :

B = InputBox(Chantier, vbQuestion, "Nom du chantier")
B est la réponse de l'inputbox que tu récuperes

Exemple tu colles ce code dans 1 feuille excel vierge et tu lances la macro

VB:
Sub TestInput()

Dim MaReponse As String

MaReponse = InputBox("Tu as quel age")

'Si tu réponds "20 ans"

MsgBox "Content que tu es " & MaReponse, vbInformation, "Réponse à mon age"
End Sub

Merci de ton retour

@Phil69970
 

Léraud Florian

XLDnaute Junior
MsgBox "Content que tu es " & MaReponse, vbInformation, "Réponse à mon age"
End Sub[/CODE]

Bonjour Phil69970

Je te remercie pour ta réponse =)

Ah oui d'accord je comprends mieux et l'utilisation du & comme tu l'a fait m'intéresse fortement ^^

J'ai une autre question :

Est-il possible de mettre les réponses rentrées dans l'inputbox à la suite sans écraser les autres réponses d'avant ?

Merci d'avance =)
 

Phil69970

XLDnaute Barbatruc
Le fil

Oui bien sur

si en A1 tu as "Toto"
Et si le retour de ton inputbox "20 ans" de l'exemple précédent

VB:
Sub TestInput()
Dim MaReponse As String
MaReponse = InputBox("Tu as quel age")

'Si tu réponds "20 ans"

MsgBox "Content que tu es " & MaReponse, vbInformation, "Réponse à mon age"
[A1] = [A1] & " a " & MaReponse
End Sub

edit : Sylvain je n'ai pas compris la question comme cela d’où ma réponse.
Il aura les 2 solutions suivant ce qu'il veut faire il choisiras.

Merci de ton retour

@Phil69970
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, Bonjour Phil,
Ou en utilisant les réponses les unes en dessous des autres.
Vous pouvez utilisez "Range("G65500").End(xlUp).Row" qui vous donne la dernière cellule utilisée de la colonne G, ainsi cela donnerait :
VB:
Sub Insert()
    Chantier = "Quel est le chantier ?"
    Réponse = InputBox(Chantier, vbQuestion, "Nom du chantier")
    If Réponse = vbCancel Then
        MsgBox "Aucune donnée ne va être importée dans le planning", vbInformation
        Close Réponse
    Else
        DL = 1 + Range("G65500").End(xlUp).Row  ' Première cellule de G disponible
        Cells(DL, "G") = Réponse
    End If
End Sub
 

Pièces jointes

  • Florian.xlsm
    14.9 KB · Affichages: 4

Léraud Florian

XLDnaute Junior
VB:
Sub Insert()
    Chantier = "Quel est le chantier ?"
    Réponse = InputBox(Chantier, vbQuestion, "Nom du chantier")
    If Réponse = vbCancel Then
        MsgBox "Aucune donnée ne va être importée dans le planning", vbInformation
        Close Réponse
    Else
        DL = 1 + Range("G65500").End(xlUp).Row  ' Première cellule de G disponible
        Cells(DL, "G") = Réponse
    End If
End Sub
Merci de votre réponse =)

Après test, j'ai pu voir que cela permet de rajouter une ligne à la fin du tableau en insérant les réponses à la suite et cela va m'être très utile.

Dans mon cas-là, je voudrais que les réponses soient toutes dans la même case (comme le fait le code de Phil69970).

Mais en tout cas je vais conserver votre code pour une utilisation future ^^
 

Léraud Florian

XLDnaute Junior
Je reviens vers vous pour une énième question =)

J'ai 2 soucis :

- le premier est que lorsque je rentre une première fois un texte dans le inputbox, il me le met deux fois dans la case G11 (une fois qu'un texte est déjà présent, il met le suivant bien à la ligne et en une seule fois comme je le voudrai).

- le second est que la case G11 ne s'adapte pas à la longueur du texte contenu dans la cellule même avec la commande : .Range("G11").Columns.AutoFit

J'ai vu la commande cells.setwidth pour y remédier mais je n'arrive pas à la faire fonctionner :/

Je vous met le fichier en PJ =)

Les lignes de codes concernées se trouve dans le module 13 (c'est un peu le bazard dans mon VBA ^^)

Merci encore de votre aide
 

Pièces jointes

  • Planning.xlsm
    469.7 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Quand G11 est vide il vaut "" et non 0.
La première fois il est vide donc on met quelque chose, puis on teste s'il y a quelque chose ( second if ) donc évidemment il y a quelque chose donc il en rajoute une couche.
Donc il ne faut pas deux IF mais un IF THEN ELSE.
Ensuite un seul Msgbox est utile.
VB:
            If [G11].Value = "" Then
                [G11] = "-" & B
            Else
                [G11] = [G11] & Chr(10) & "-" & B
            End If
            .Columns("G:G").EntireColumn.AutoFit
            MsgBox "Le chantier " & B & " est crée", vbInformation, "Nom du chantier"
Par contre le " .Columns("G:G").EntireColumn.AutoFit" ne marche pas comme on voudrait. Même à la main, si vous double cliquez sur la limites des colonnes G et H, il donne le même résultat.
Sur ce dernier point je n'ai pas trouvé.
peut être que Phil aura une idée.

Addon : Il semblerait que c'est le CHR(10) qui pose souci.
Si une chaine est grande mais seule, le Autofit marche.
S'il y a un CHR(10) alors il ne marche pas.
 

Pièces jointes

  • Planning (1).xlsm
    435.7 KB · Affichages: 3

Phil69970

XLDnaute Barbatruc
Bonjour à tous

Je dois avouer que je me suis arrêter quand j'ai vu 13 modules quasi identique avec près de 1 000 lignes de codes chacun soit 12 000 lignes de codes 🙃 🤔 ainsi que plusieurs dizaines voire centaines de MFC.
Idem dans Worksheet_SelectionChange 150 lignes * 12 identiques :oops:

Du ménage et de la rationalisation s'impose !!!
100 ou 200 de lignes devrait pouvoir remplacer tes 12 000 lignes....
Mettre des noms en dur dans le code c'est pas terrible que fais tu si Julien part ! (ou un autre)

Edit :
Ici tu peux voir un exemple de rationalisation d'un code 1 000 lignes à..... une vingtaine de lignes


Pour facilement alléger le code :
Tu peux mettre en tête de module :
Option Compare Text
Cela te permet de ne pas te soucier des minucules/majucules
==> Julien = julien = JULien = jULieN etc quelque soit l'écriture des noms dans les inputbox cela sera toujours bon....

Pour la question de Sylvain

Une piste :
A décocher et voir si cela change

1656929812573.png


@Phil69970
 
Dernière édition:

Léraud Florian

XLDnaute Junior
Re,
Quand G11 est vide il vaut "" et non 0.
La première fois il est vide donc on met quelque chose, puis on teste s'il y a quelque chose ( second if ) donc évidemment il y a quelque chose donc il en rajoute une couche.
Donc il ne faut pas deux IF mais un IF THEN ELSE.
Je comprends mieux, je pensais pas qu'il faisait les deux if à la suite mais maintenant que vous l'expliquez oui c'est clair. Merci pour votre réponse =)
Addon : Il semblerait que c'est le CHR(10) qui pose souci.
Si une chaine est grande mais seule, le Autofit marche.
S'il y a un CHR(10) alors il ne marche pas.
C'est noté, merci du conseil ^^
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
A décocher et voir si cela change
Malheureusement non, car en fait dès qu'il trouve un CHR(10) il la recoche. :mad:
J'ai rien trouvé sur le net pour résoudre le problème. Alors j'ai écrit cette macro :
VB:
Sub AutoColumnLength(ByRef C As Range)
    Application.ScreenUpdating = False                  ' On fige l'écran
    ValeurInitiale = Range(C.Address)                   ' On mémorise la valeur
    tablo = Split(ValeurInitiale, Chr(10))              ' On créé un tableau avec comme séparateur CHR(10)
    Range(C.Address) = ""                               ' On vide la cellule
    Columns("G:G").EntireColumn.AutoFit                 ' On fait un autofit
    LargeurInitiale = Columns(C.Column).ColumnWidth     ' On mémorise la largeur initiale
    Largeurfinale = LargeurInitiale                     ' On va calculer la largeur max ( initialisée à la valeur initiale )
    For N = 0 To UBound(tablo)                          ' On parcourt tout le tableau
        Range(C.Address) = "'" & tablo(N)               ' On met la valeur de la chaine dans la cellule
        Range(C.Address).WrapText = False               ' On passe le flag Renvoyer automatiquement à la ligne a Faux
        Columns(C.Column).EntireColumn.AutoFit          ' On fait un nouvel autofit
        ' Si la nouvelle largeur > valeur mémorisée, on mémorise cette nouvelle valeur.
        If Columns(C.Column).ColumnWidth > Largeurfinale Then Largeurfinale = Columns(C.Column).ColumnWidth
    Next N
    Range(C.Address) = ValeurInitiale                   ' On remet la valeur initiale
    Columns(C.Column).ColumnWidth = Largeurfinale       ' On met la nouvelle largeur
    Range(C.Address).WrapText = True                    ' On repasse le flag Renvoyer automatiquement à la ligne a Vrai
    Range(C.Address).HorizontalAlignment = xlLeft       ' On aligne à gauche
    Application.ScreenUpdating = True                   ' On "défige" l'écran
End Sub
La syntaxe de lancement est : AutoColumnLength [G11] ' On calcule la nouvelle largeur de la colonne

C'est moche, c'est plus long que le code initial, mais ça marche ... en attendant mieux.
1656934044824.png

Ex en PJ.
 

Pièces jointes

  • Planning (2).xlsm
    439.7 KB · Affichages: 5

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 107
dernier inscrit
cdel