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
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
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)
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....
Malheureusement non, car en fait dès qu'il trouve un CHR(10) il la recoche.
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.
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