Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

trouver le focus...

26 réponses
Avatar
greg
bonjour,
comment d=E9terminer quel contr=F4le a le focus dans une feuille excel en
vba ?
(pas une form, une worksheet classique... et typiquement, parmi des
contr=F4les activex genre boutons)

merci !!

6 réponses

1 2 3
Avatar
LSteph
....
Si tu dois ajouter des boutons dant ta feuille,
il te faudra ensuite fermer enregistrer le classeur pui le réouvrir
la classe sera ainsi réinitialisée

'lSteph
Avatar
greg
non pas le mm greg !
lol
merci bcp, je regarde ça ça m'a l'air super !

On 11 juin, 15:51, LSteph wrote:
Bonjour,

(sauf si tu n'es pas le même Greg)
tu as le principe dans ce que je t'avais fait pour ton emploi du
temps
Voici un exemple simple tu nomme un module de Classe ClassBtn
Ensuite on utilisele workbook_open pour initialiser la classe,
un module standard pour l'essentiel
et un appel dans le code de la feuille ce qui donne
'Respectivement

' dans thisworkbook

Option Explicit

Private Sub Workbook_Open()
Call InitCButtons
End Sub

' dans le module de classe ClassBtn

Option Explicit

Public WithEvents myButs As CommandButton

Private Sub myButs_Click()
Feuil1.Activate 'uniquement pour 97

MsgBox myButs.Caption

End Sub

' dans un module standard
Option Explicit

Dim CButtons() As ClassBtn

Sub InitCButtons()
   Dim myB As OLEObject, CmdB As MSForms.CommandButton
   Dim i As Integer
   For Each myB In Feuil1.OLEObjects
     If TypeOf myB.Object Is CommandButton Then
       i = i + 1
       ReDim Preserve CButtons(1 To i)
       Set CButtons(i) = New ClassBtn
       Set CButtons(i).myButs = myB.Object
     End If
   Next myB
End Sub

'dans Feuil1

Option Explicit

Private Sub Worksheet_Activate()
Call InitCButtons
End Sub

On 11 juin, 15:04, LSteph wrote:

> Bonjour,

> Il te faut un module de classe et une seule procèdure

> Voilà le principe pour un userform,
> je regarde pour l'adapter à une feuille

> ''''''''''''''''''
> 'dans ClassBtn
> Public WithEvents MonBtn As MSForms.CommandButton
> Private Sub MonBtn_Click()
> [A1] = MonBtn.Caption

> End Sub

> '''''''''''''
> 'dans Userform1

> Private MesBtn() As New ClassBtn
> Private Sub UserForm_Initialize()
>      Dim clt As Control, I&
>      For Each clt In Me.Controls
>          If TypeName(clt) = "CommandButton" Then

>              ReDim Preserve MesBtn(0 To I)
>              Set MesBtn(I).MonBtn = clt
>              I = I + 1
>          End If
>      Next clt
> End Sub
> Private Sub UserForm_Terminate()
>      Dim I&
>      For I = 0& To UBound(MesBtn)
>          Set MesBtn(I) = Nothing
>      Next I
> End Sub
> '''''''''''''''

> 'lSteph

> On 11 juin, 11:30, greg wrote:

> > salut,
> > merci de ta réponse.

> > - j'entends par "une feuille excel en vba" en fait simplement que je
> > travaille sur un workbook excel, dans un onglet donné, que j'ai des
> > boutons activex dans cette feuille, et que la solution que je cherche
> > est à intégrer ds le code VBA de ce workbook. Je ne suis pas sur une
> > Form ni en VB .NET...
> > - pour préciser mon besoin, par ex ds la macro CommandButton1_Click ()
> > je peux utiliser l'objet Me pour avoir le nom de l'onglet où je sui s.
> > Je cherche à avoir le nom du bouton où je suis également, et je me dis
> > que je peux le trouver en ayant celui qui a le focus.
> > mon envie derrière est de lancer une macro en passant l'identité du
> > bouton appelant, pour que celle ci réagisse en fonction du bouton
> > cliqué.
> > Evidemment, je peux mettre en dur ds CommandButton1_Click() le fait
> > que c'est "CommandButton1" qui appelle, mais je cherchais plutot une
> > fonction qui fasse cela.

> > Je voulais utiliser une fonction qui me donne le nom de la procédur e
> > en cours pour atteindre mon objectif mais les bouts de code trouvés
> > sur le net ne marchent pas bien, ils donnent le nom de la procédure
> > actuelle où se trouve le curseur ds la fenetre VBA.

> > J'espère que c'est un peu plus clair...

> > merci d'avance

> > On 10 juin, 21:01, LSteph wrote:

> > > bonjour,

> > > Un bouton a le focus généralement quand d'une façon ou d'une autre on
> > > vient de l'activer.. Cela présage donc qu'on sache très bien le quel!

> > > aussi selont ce que tu entends par focus , qui au vu du nombre de
> > > réponses qui affluent ...ne semble pas susciter une même compr éhension
> > > de tous peux tu préciser et aussi  en dire  un peu plus sur l e contexte
> > > et l'objectif...

> > > Qu'entends tu également par

> > > > une feuille excel en vba

> > > ?

> > > @+

> > > --
> > > lSteph



> > > greg a écrit :

> > > > bonjour,
> > > > comment déterminer quel contrôle a le focus dans une feuille excel en
> > > > vba ?
> > > > (pas une form, une worksheet classique... et typiquement, parmi d es
> > > > contrôles activex genre boutons)

> > > > merci !!- Masquer le texte des messages précédents -

> > - Afficher le texte des messages précédents -- Masquer le texte d es messages précédents -

> - Afficher le texte des messages précédents -


Avatar
greg
bon nickel pour moi, merci beaucoup !

j'ai juste fait les 2 modifs suivantes car ds certaines macros (genre
bidouille sur les references VB) je perds tout de suite la variable
globale avec les objets boutons et je suis obligé de sortir de la
feuille pour les réactiver :

1/ le redim du début en plus sinon parfois j'ai des erreurs
Public Sub InitCButtons()

Dim myB As OLEObject, CmdB As MSForms.CommandButton
Dim sh As Worksheet
Dim i As Integer

ReDim CButtons(1 To 1)

For Each sh In ThisWorkbook.Worksheets
For Each myB In sh.OLEObjects
If TypeOf myB.Object Is CommandButton Then
i = i + 1
ReDim Preserve CButtons(1 To i)
Set CButtons(i) = New ClassBtn
Set CButtons(i).myButs = myB.Object
End If
Next myB
Next sh

End Sub

2/ plutot que ds le worksheet, je mets pour chaque bouton

Private Sub CommandButton4_Click()
Call InitCButtons
End Sub

comme ça je suis sûr que ça marche qd je clique.


On 11 juin, 19:53, greg wrote:
non pas le mm greg !
lol
merci bcp, je  regarde ça ça m'a l'air super  !

On 11 juin, 15:51, LSteph wrote:

> Bonjour,

> (sauf si tu n'es pas le même Greg)
> tu as le principe dans ce que je t'avais fait pour ton emploi du
> temps
> Voici un exemple simple tu nomme un module de Classe ClassBtn
> Ensuite on utilisele workbook_open pour initialiser la classe,
> un module standard pour l'essentiel
> et un appel dans le code de la feuille ce qui donne
> 'Respectivement

> ' dans thisworkbook

> Option Explicit

> Private Sub Workbook_Open()
> Call InitCButtons
> End Sub

> ' dans le module de classe ClassBtn

> Option Explicit

> Public WithEvents myButs As CommandButton

> Private Sub myButs_Click()
> Feuil1.Activate 'uniquement pour 97

> MsgBox myButs.Caption

> End Sub

> ' dans un module standard
> Option Explicit

> Dim CButtons() As ClassBtn

> Sub InitCButtons()
>    Dim myB As OLEObject, CmdB As MSForms.CommandButton
>    Dim i As Integer
>    For Each myB In Feuil1.OLEObjects
>      If TypeOf myB.Object Is CommandButton Then
>        i = i + 1
>        ReDim Preserve CButtons(1 To i)
>        Set CButtons(i) = New ClassBtn
>        Set CButtons(i).myButs = myB.Object
>      End If
>    Next myB
> End Sub

> 'dans Feuil1

> Option Explicit

> Private Sub Worksheet_Activate()
> Call InitCButtons
> End Sub



Avatar
LSteph
Bonjour,,

Dans ce cas:

2/ plutot que ds le worksheet, je mets pour chaque bouton
Private Sub CommandButton4_Click()
Call InitCButtons




Plus aucun intérêt d'avoir créé un module de classe, autant réaff ecter
la proc à chaque bouton

Le worksheet_activate serait suffisant amha!

Cordialement.

--
lSteph





On 15 juin, 11:48, greg wrote:
bon nickel pour moi, merci beaucoup !

j'ai juste fait les 2 modifs suivantes car ds certaines macros (genre
bidouille sur les references VB) je perds tout de suite la variable
globale avec les objets boutons et je suis obligé de sortir de la
feuille pour les réactiver :

1/ le redim du début en plus sinon parfois j'ai des erreurs
Public Sub InitCButtons()

   Dim myB As OLEObject, CmdB As MSForms.CommandButton
   Dim sh As Worksheet
   Dim i As Integer

   ReDim CButtons(1 To 1)

   For Each sh In ThisWorkbook.Worksheets
      For Each myB In sh.OLEObjects
        If TypeOf myB.Object Is CommandButton Then
          i = i + 1
          ReDim Preserve CButtons(1 To i)
          Set CButtons(i) = New ClassBtn
          Set CButtons(i).myButs = myB.Object
        End If
      Next myB
   Next sh

End Sub

2/ plutot que ds le worksheet, je mets pour chaque bouton

Private Sub CommandButton4_Click()
   Call InitCButtons
End Sub

comme ça je suis sûr que ça marche qd je clique.

On 11 juin, 19:53, greg wrote:



> non pas le mm greg !
> lol
> merci bcp, je  regarde ça ça m'a l'air super  !

> On 11 juin, 15:51, LSteph wrote:

> > Bonjour,

> > (sauf si tu n'es pas le même Greg)
> > tu as le principe dans ce que je t'avais fait pour ton emploi du
> > temps
> > Voici un exemple simple tu nomme un module de Classe ClassBtn
> > Ensuite on utilisele workbook_open pour initialiser la classe,
> > un module standard pour l'essentiel
> > et un appel dans le code de la feuille ce qui donne
> > 'Respectivement

> > ' dans thisworkbook

> > Option Explicit

> > Private Sub Workbook_Open()
> > Call InitCButtons
> > End Sub

> > ' dans le module de classe ClassBtn

> > Option Explicit

> > Public WithEvents myButs As CommandButton

> > Private Sub myButs_Click()
> > Feuil1.Activate 'uniquement pour 97

> > MsgBox myButs.Caption

> > End Sub

> > ' dans un module standard
> > Option Explicit

> > Dim CButtons() As ClassBtn

> > Sub InitCButtons()
> >    Dim myB As OLEObject, CmdB As MSForms.CommandButton
> >    Dim i As Integer
> >    For Each myB In Feuil1.OLEObjects
> >      If TypeOf myB.Object Is CommandButton Then
> >        i = i + 1
> >        ReDim Preserve CButtons(1 To i)
> >        Set CButtons(i) = New ClassBtn
> >        Set CButtons(i).myButs = myB.Object
> >      End If
> >    Next myB
> > End Sub

> > 'dans Feuil1

> > Option Explicit

> > Private Sub Worksheet_Activate()
> > Call InitCButtons
> > End Sub- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -


Avatar
greg
si si, je rappelle que pour moi le but était de pouvoir accéder au nom
du bouton en cours, sans taper en dur son nom dans le code.
Là j'ai un code sans rien en dur pour tous les boutons, et ds le
module de classe je lance une macro qui prend en paramètre le nom du
bouton cliqué et agit en conséquence.
cela dit c'est clair que je préférerais encore ne rien mettre ds les
codes des boutons, mais du coup si une macro qui "perd" la variable
globale est lancée, je ne trouve pas trop pratique le fait de devoir
changer de feuille pour réactiver les boutons.

On 15 juin, 11:57, LSteph wrote:
Bonjour,,

Dans ce cas:

>2/ plutot que ds le worksheet, je mets pour chaque bouton
>Private Sub CommandButton4_Click()
>   Call InitCButtons

Plus aucun intérêt d'avoir créé un module de classe, autant réa ffecter
la proc à chaque bouton

Le worksheet_activate serait suffisant amha!

Cordialement.

--
lSteph

On 15 juin, 11:48, greg wrote:

> bon nickel pour moi, merci beaucoup !

> j'ai juste fait les 2 modifs suivantes car ds certaines macros (genre
> bidouille sur les references VB) je perds tout de suite la variable
> globale avec les objets boutons et je suis obligé de sortir de la
> feuille pour les réactiver :

> 1/ le redim du début en plus sinon parfois j'ai des erreurs
> Public Sub InitCButtons()

>    Dim myB As OLEObject, CmdB As MSForms.CommandButton
>    Dim sh As Worksheet
>    Dim i As Integer

>    ReDim CButtons(1 To 1)

>    For Each sh In ThisWorkbook.Worksheets
>       For Each myB In sh.OLEObjects
>         If TypeOf myB.Object Is CommandButton Then
>           i = i + 1
>           ReDim Preserve CButtons(1 To i)
>           Set CButtons(i) = New ClassBtn
>           Set CButtons(i).myButs = myB.Object
>         End If
>       Next myB
>    Next sh

> End Sub

> 2/ plutot que ds le worksheet, je mets pour chaque bouton

> Private Sub CommandButton4_Click()
>    Call InitCButtons
> End Sub

> comme ça je suis sûr que ça marche qd je clique.

> On 11 juin, 19:53, greg wrote:

> > non pas le mm greg !
> > lol
> > merci bcp, je  regarde ça ça m'a l'air super  !

> > On 11 juin, 15:51, LSteph wrote:

> > > Bonjour,

> > > (sauf si tu n'es pas le même Greg)
> > > tu as le principe dans ce que je t'avais fait pour ton emploi du
> > > temps
> > > Voici un exemple simple tu nomme un module de Classe ClassBtn
> > > Ensuite on utilisele workbook_open pour initialiser la classe,
> > > un module standard pour l'essentiel
> > > et un appel dans le code de la feuille ce qui donne
> > > 'Respectivement

> > > ' dans thisworkbook

> > > Option Explicit

> > > Private Sub Workbook_Open()
> > > Call InitCButtons
> > > End Sub

> > > ' dans le module de classe ClassBtn

> > > Option Explicit

> > > Public WithEvents myButs As CommandButton

> > > Private Sub myButs_Click()
> > > Feuil1.Activate 'uniquement pour 97

> > > MsgBox myButs.Caption

> > > End Sub

> > > ' dans un module standard
> > > Option Explicit

> > > Dim CButtons() As ClassBtn

> > > Sub InitCButtons()
> > >    Dim myB As OLEObject, CmdB As MSForms.CommandButton
> > >    Dim i As Integer
> > >    For Each myB In Feuil1.OLEObjects
> > >      If TypeOf myB.Object Is CommandButton Then
> > >        i = i + 1
> > >        ReDim Preserve CButtons(1 To i)
> > >        Set CButtons(i) = New ClassBtn
> > >        Set CButtons(i).myButs = myB.Object
> > >      End If
> > >    Next myB
> > > End Sub

> > > 'dans Feuil1

> > > Option Explicit

> > > Private Sub Worksheet_Activate()
> > > Call InitCButtons
> > > End Sub- Masquer le texte des messages précédents -

> - Afficher le texte des messages précédents -


Avatar
LSteph
hum, si tu le dis te convenir
mais cela doit comme pour moi laisser un brin de perplexité aux
participants de ce fil.

@+

--
lSteph

greg a écrit :
si si, je rappelle que pour moi le but était de pouvoir accéder au nom
du bouton en cours, sans taper en dur son nom dans le code.
Là j'ai un code sans rien en dur pour tous les boutons, et ds le
module de classe je lance une macro qui prend en paramètre le nom du
bouton cliqué et agit en conséquence.
cela dit c'est clair que je préférerais encore ne rien mettre ds les
codes des boutons, mais du coup si une macro qui "perd" la variable
globale est lancée, je ne trouve pas trop pratique le fait de devoir
changer de feuille pour réactiver les boutons.

On 15 juin, 11:57, LSteph wrote:
Bonjour,,

Dans ce cas:

2/ plutot que ds le worksheet, je mets pour chaque bouton
Private Sub CommandButton4_Click()
Call InitCButtons


Plus aucun intérêt d'avoir créé un module de classe, autant réaffecter
la proc à chaque bouton

Le worksheet_activate serait suffisant amha!

Cordialement.

--
lSteph

On 15 juin, 11:48, greg wrote:

bon nickel pour moi, merci beaucoup !
j'ai juste fait les 2 modifs suivantes car ds certaines macros (genre
bidouille sur les references VB) je perds tout de suite la variable
globale avec les objets boutons et je suis obligé de sortir de la
feuille pour les réactiver :
1/ le redim du début en plus sinon parfois j'ai des erreurs
Public Sub InitCButtons()
Dim myB As OLEObject, CmdB As MSForms.CommandButton
Dim sh As Worksheet
Dim i As Integer
ReDim CButtons(1 To 1)
For Each sh In ThisWorkbook.Worksheets
For Each myB In sh.OLEObjects
If TypeOf myB.Object Is CommandButton Then
i = i + 1
ReDim Preserve CButtons(1 To i)
Set CButtons(i) = New ClassBtn
Set CButtons(i).myButs = myB.Object
End If
Next myB
Next sh
End Sub
2/ plutot que ds le worksheet, je mets pour chaque bouton
Private Sub CommandButton4_Click()
Call InitCButtons
End Sub
comme ça je suis sûr que ça marche qd je clique.
On 11 juin, 19:53, greg wrote:
non pas le mm greg !
lol
merci bcp, je regarde ça ça m'a l'air super !
On 11 juin, 15:51, LSteph wrote:
Bonjour,
(sauf si tu n'es pas le même Greg)
tu as le principe dans ce que je t'avais fait pour ton emploi du
temps
Voici un exemple simple tu nomme un module de Classe ClassBtn
Ensuite on utilisele workbook_open pour initialiser la classe,
un module standard pour l'essentiel
et un appel dans le code de la feuille ce qui donne
'Respectivement
' dans thisworkbook
Option Explicit
Private Sub Workbook_Open()
Call InitCButtons
End Sub
' dans le module de classe ClassBtn
Option Explicit
Public WithEvents myButs As CommandButton
Private Sub myButs_Click()
Feuil1.Activate 'uniquement pour 97
MsgBox myButs.Caption
End Sub
' dans un module standard
Option Explicit
Dim CButtons() As ClassBtn
Sub InitCButtons()
Dim myB As OLEObject, CmdB As MSForms.CommandButton
Dim i As Integer
For Each myB In Feuil1.OLEObjects
If TypeOf myB.Object Is CommandButton Then
i = i + 1
ReDim Preserve CButtons(1 To i)
Set CButtons(i) = New ClassBtn
Set CButtons(i).myButs = myB.Object
End If
Next myB
End Sub
'dans Feuil1
Option Explicit
Private Sub Worksheet_Activate()
Call InitCButtons
End Sub- Masquer le texte des messages précédents -




- Afficher le texte des messages précédents -







1 2 3