j'ouvre un userform non modal et j'aimerais obtenir le numéro de la colonne dans un textbox (ou autre) dès que je clique dans une colonne.
La finalité est d'utiliser ce numéro de colonne pour aller chercher des infos dans une autre feuille pour renseigner l'utilisateur sur ce qu'il faut faire mais j'ai simplifié la question à juste obtenir ce numéro de colonne ce qui est le point qui me bloque.
Option Explicit
Private WithEvents Wsh As Worksheet
Private Sub UserForm_Initialize()
Set Wsh = ActiveSheet
End Sub
Private Sub Wsh_SelectionChange(ByVal Target As Range)
Me.Label1.Caption = Target.Column
End Sub
Ça déclare l'objet comme devant décréter ses évènements dans le module objet qui l'utilise.
Précision : Lorsqu'une variable globale est déclarée WithEvents dans un module objet, son nom figure dans la liste déroulante de gauche (Objet) qui surmonte la fenêtre de code et celle de droite (Procédure) propose tous les modèles de procédures de prise en charge implantables. C'est valable aussi pour tout objet de type défini par module de classe muni d'instructions Event et RaiseEvent.
re
Bonjour @Dranreb pourrais tu me faire une exemple svp
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.Label1 = ActiveCell.Column
End Sub
VB:
Option Explicit
Private WithEvents Wsh As Worksheet
Private Sub UserForm_Initialize()
Set Wsh = ActiveSheet
End Sub
Private Sub Wsh_SelectionChange(ByVal Target As Range)
Me.Label1.Caption = Target.Column
End Sub
pour moi si le userform n'est pas affiché on le verra pas le userform
Le Monsieur (@Dranreb que je salue ) a dit qu'il était chargé, pas qu'il était affiché.
Si on veut être certain qu'il soit visible, on peut écrire :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.Label1 = ActiveCell.Column 'charge l'USF, exécute Initialize de l'USF et affecte le N°
UserForm1.Show vbModeless 'affiche l'USF (déjà chargé ci-dessus)
End Sub
On pourrait aussi écrire :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.Label1 = ActiveCell.Column
End Sub
ET dans le code de l'USF:
VB:
Private Sub UserForm_Initialize()
Me.Show vbModeless
End Sub
Mais cela fait du code dans deux endroits différents. Je préfère ma première écriture et cela même si (contrairement à la seconde) elle exécute Me.Show vbModeless à chaque changement de sélection.
bonjour @mapomme
je vois pas trop l’intérêt de modifier le label dans un userform """chargé"""", si il n'est pas affiché
d'ailleur dans le cas du code de @Dranreb il classe un event feuille dans le userform
je me dis que justement encore faut il qu'il soit afficher ou """chargé"""
chez moi que je cite le nom ou pas du userform il n'est pas chargé
d'autant plus que comme tu dis dans ton précédent message il y a deux event faisant la même chose
faudra m'expliquer l'utilité dans ce contexte
pour moi si on veux faire les chose bien et n'utiliser qu'un seul event (celui dans le userform)
il n'y a qu'un seul moyen c'est d'instancier un exemplaire du module userform
dans un module standard
VB:
Dim usf As UserForm1
Sub test()
Set usf = New UserForm1
End Sub
et le code de @ dranreb dans le userform en ajoutant le show 0 sous condition visible
VB:
Option Explicit
Private WithEvents Wsh As Worksheet
Private Sub UserForm_Initialize()
Set Wsh = ActiveSheet
End Sub
Private Sub Wsh_SelectionChange(ByVal Target As Range)
If Not Me.Visible Then Me.Show 0
Me.Label1.Caption = Target.Column
End Sub
et pour eviter de unloader le module userform on cancel le close et on le remplace par le hide
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = True: Me.Hide
End Sub
là oui je suis d'accords ca fonctionne
mais comme je le disais il faut bien instancier le userform même si on l'affiche pas de suite
maintenant on n'en sais pas plus sur le besoins ni le contexte du besoins mais on peut dire quand même que ca fait un peut tout mucth par rapport au fait que l'on peut le faire simplement dans l'event implémenté de la feuille
VB:
Private Sub WorkSheet_SelectionChange(ByVal Target As Range)
With UserForm1
If Not .Visible Then .Show 0
.Label1.Caption = Target.Column
End With
End Sub
maintenant on n'en sais pas plus sur le besoins ni le contexte du besoins mais on peut dire quand même que ca fait un peut tout mucth par rapport au fait que l'on peut le faire simplement dans l'event implémenté de la feuille
Oui tu as raison. On ne connait pas le contexte. Si ça se trouve, on peut continuer via VBA à faire ce qui doit être fait suite au changement de sélection sans même passer par un USF.
Bonjour.
Dans le problème tel qu'exposé l'UserForm est supposé affiché en non modal. Lorsqu'on sélectionne une cellule, il doit afficher dans un Label sa colonne. C'est un besoin de sa charge, pas de la feuille.
S'il avait fallu afficher cette colonne dans une cellule de la feuille j'aurais écrit le code dans une Worksheet_SelectionChange de l'objet Worksheet qui la représente.