XL 2019 afficher colonne active dans USF non modal

Sheldor

XLDnaute Occasionnel
Bonjour à tous,

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.

très grand merci d'avance

nico
 

Pièces jointes

  • Classeur1.xlsm
    16.1 KB · Affichages: 8

Sheldor

XLDnaute Occasionnel
Bonsoir à tous les deux et un très grand merci.

j'ai testé ta solution job75 et ça fonctionne, je n'aurais pas pensé passer par la feuille

Dranreb, cette piste m'intéresse aussi mais ça coince sur la ligne "Private WithEvents Wsh As Worksheet"

je ne comprends pas assez ce que fait withevents

merci en tout cas à vous deux
 

Dranreb

XLDnaute Barbatruc
Ç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.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
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
 

mapomme

XLDnaute Barbatruc
Bonjour @patricktoulon :),
Un exemplaire de l'UserForm est automatiquement chargé quand on mentionne son nom, et la Sub UserForm_Initialize est alors exécutée.
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.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
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
 
Dernière édition:

mapomme

XLDnaute Barbatruc
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.
 

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 127
Messages
2 116 534
Membres
112 770
dernier inscrit
vetosalah