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 =)
 

Léraud Florian

XLDnaute Junior
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
Oui je veux bien reconnaitre que la simplification n'est pas ma marque de fabrique ^^

Je voulais faire cela sous forme de tableau (pour insérer, supprimer...) mais je n'ai pas assez d'expérience pour manipuler les tableaux et les outils qui leurs sont associés (indice...). J'essaye de m'y mettre mais les erreurs sont encore nombreuses alors je reviens à du codage "fait maison" ^^ (même si la complexité fait que l'ordinateur prendra plus de temps à faire tourner les lignes de code).

Effectivement, si quelqu'un part, c'est problématique mais pour l'instant, cela reste un brouillon on va dire =)

Pour facilement alléger le code :
Tu peux mettre en tête de module :

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....
Super merci pour le conseil, je vais l'intégrer à mon code =)
 

Léraud Florian

XLDnaute Junior
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.
Regarde la pièce jointe 1144349
Ex en PJ.
Ouaou, c'est....très impressionnant, beaucoup de lignes dont j'ignore même l'existence et la fonction ^^

Cela fonctionne superbement !

En tout cas merci pour le code et je salue ta persévérance =)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
:mad: Yavé plus simple. En retestant j'ai trouvé beaucoup plus simple.
il suffit d'élargir la colonne à 200, puis de faire un ajustage auto, et le tour est joué.
VB:
Sub AutoColumnLength(ByRef C As Range)
    Application.ScreenUpdating = False                  ' On fige l'écran
    Columns(C.Column).ColumnWidth = 200                 ' On élargit beaucoup la colonne
    Columns(C.Column).EntireColumn.AutoFit              ' L'autofit la ramène à la bonne largeur
    Columns(C.Row).EntireRow.AutoFit                    ' On ajuste la hauteur
    Application.ScreenUpdating = True                   ' On "défige" l'écran
End Sub
 

Pièces jointes

  • Planning (3).xlsm
    438.1 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
314 629
Messages
2 111 345
Membres
111 109
dernier inscrit
djameldel