Condividi:        

assegnare pulsanti a userform

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

assegnare pulsanti a userform

Postdi wallace&gromit » 02/10/17 16:09

Ciao,
vorrei creare una macro che riempia una userform con tanti pulsanti quanti sono gli elementi di una tabella (che sono nomi di file).
E fin qui ci sono:
Codice: Seleziona tutto
Private Sub UserForm_Activate()
UR = Range("B" & Rows.Count).End(xlUp).Row
For i = 1 To UR
Set Btn = Me.Controls.Add("forms.CommandButton.1", Cells(i, 2))
        Btn.Name = Cells(i, 2)
        Btn.Caption = Cells(i, 2)
        Btn.Move 20 + ((i + 2) Mod 3) * 100, 10 + (Int((i + 2) / 3)) * 30
    Next i
End Sub

Ora vorrei che cliccando su uno dei pulsanti la scelta sia registrata in una qualsiasi cella d'appoggio oppure anche in una variabile pubblica e che parta una macro che usi questa variabile per aprire il relativo file.

Non so come fare ad attribuire le macro (che sostanzialmente sono sempre le stesse, ma non so a priori quante siano) ai pulsanti che ho creato.

Qui quello (poco) che ho fatto finora:
http://www.filedropper.com/macropopolauserformconpulsanti
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Sponsor
 

Re: assegnare pulsanti a userform

Postdi Marius44 » 02/10/17 16:36

Ciao W&G
Nella tua macro dovresti utilizzare la funzione OnAction riferita ad ogni pulsante.
In un mio lavoro che aveva delle immagini alle quale volevo associare le reltive macro ho fatto così:
Codice: Seleziona tutto
    With sh
       .Shapes("img1").OnAction = "Ord_Pre.xls!salvanew"
       .Shapes("img2").OnAction = "Ord_Pre.xls!torna"
    End With

dove, ovviamente, OrdPre.xls era il nome del file (epoca della versione 97) e salvane e torna il nome delle macro relative
Fai sapere. Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: assegnare pulsanti a userform

Postdi wallace&gromit » 02/10/17 18:11

Grazie per lo spunto, ma non riesco a riferire l'azione all'oggetto richiesto.
Ho creato dei CommandButton (ognuno con il nome del file che deve aprire), poi devo richiamarli a uno a uno e applicare loro sempre una macro, che però deve passare come argomento il proprio nome di file specifico.
Non posso preparare tante macro quanti sono i pulsanti, perché non lo so a priori.

Scrivendo quanto sopra mi sono detto: potrei preparare x macro e attivare solo quelle che corrispondono ad un file, ma non mi sembra molto "pulito".
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: assegnare pulsanti a userform

Postdi wallace&gromit » 02/10/17 21:33

Mi sembra di avere capito che è necessario creare un frame in cui vanno inseriti i comandi, altrimenti non funziona.
Qui per esempio creano una calcolatrice passo per passo http://ccm.net/faq/12523-vba-adding-controls-dynamically-into-a-userform
devo riuscire ad estrapolare quello che serve a me.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: assegnare pulsanti a userform

Postdi Anthony47 » 02/10/17 22:08

Puoi trovare una buona teoria sul sito di Mauro Gamberini (Microsoft MVP): http://www.maurogsc.eu/excel/xlsarraycontrolli.aspx

Per una prova semplice semplice:
Crea una form (Userform1) con N Commandbutton (lasciali chiamati Commandbutto1, Commandbutton2, etc) e 1 textbox (textbox1)

Assegna alla form questo codice:
Codice: Seleziona tutto
Private Sub UserForm_Initialize()
    Dim I As Long, KK As Long
    Dim clsCButt As Classe1
'
    Set m_colCbutt = New Collection
    For I = 1 To Me.Controls.Count
        If TypeName(Me.Controls(I - 1)) = "CommandButton" Then
            KK = KK + 1
            Set clsCButt = New Classe1
            Set clsCButt.CButt = Me.Controls("Commandbutton" & KK)
            m_colCbutt.Add clsCButt, CStr(m_colCbutt.Count + 1)
        End If
'        Debug.Print TypeName(Me.Controls(I - 1))
    Next
End Sub

Poi, sempre nel vba, inserisci un "Modulo di Classe"; lascialo chiamato Classe1
Inseriscigli questo codice:
Codice: Seleziona tutto
Public WithEvents CButt As MSForms.CommandButton

Private Sub cButt_Click()

    UserForm1.TextBox1.Text = "Pigiato " & Me.CButt.Name
    'quindi qui va il codice da eseguire quando si preme qualsiasi commandubutton
       
End Sub

A questo punto avvia la Form (selezionala e premi F5), e premi un commandbutton; il textbox ti dira' quale e' stato premuto, tramite la Sub cButt_Click unica tra tutti.

E' solo un punto di partenza, nell'ipotesi che abbia capito esattamente quanto avevi chiesto.

Quanto all'ultimo link pubblicato, mi pare che come creare tanti CommandButton lo sai gia'...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19226
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: assegnare pulsanti a userform

Postdi wallace&gromit » 03/10/17 10:13

Ciao Anthony, grazie mille, esaustivo come sempre.
Però non riesco a fare funzionare le tue macro, invece quelle che ho scaricato dal link che mi hai proposto funzionano.
Non sarà che manca la dichiarazione esplicita delle variabili nella tua versione?
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: assegnare pulsanti a userform

Postdi wallace&gromit » 03/10/17 13:15

Ecco la mia elaborazione a partire dal link proposto.
Il codice della Userform1 (che di partenza è vuota) è questo:
Codice: Seleziona tutto
            Option Explicit
Dim colCommandButton As Collection
Dim myCmd As clsCommandButton
Dim UR, I, Btn

Private Sub UserForm_Initialize()
        Dim ctl As MSForms.Control

UR = Range("B" & Rows.Count).End(xlUp).Row
    For I = 1 To UR
        Set Btn = Me.Controls.Add("forms.CommandButton.1", "CommandButton" & I)
        Btn.Caption = Cells(I, 2)
        Btn.Move 20 + ((I + 2) Mod 3) * 100, 10 + (Int((I + 2) / 3)) * 30
    Next I
   
    If Not colCommandButton Is Nothing Then
        Set colCommandButton = Nothing
    End If
   
    Set colCommandButton = New Collection
   
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.CommandButton Then
            Set myCmd = New clsCommandButton
            Set myCmd.cmd = ctl
            Set myCmd.frm = Me
            colCommandButton.Add myCmd
        End If
    Next
    Set ctl = Nothing
   
End Sub

Private Sub UserForm_Terminate()
    Set myCmd = Nothing
    Set colCommandButton = Nothing
End Sub


e nel Modulo di classe, che si chiama clsCommandButton, c'è questo:
Codice: Seleziona tutto
Option Explicit

Public WithEvents cmd As MSForms.CommandButton
Public frm As UserForm

Private Sub cmd_Click()
    Range("D1") = cmd.Caption
    Call mEsegui(cmd.Caption)
End Sub

Private Sub mEsegui(ByVal s As String)
    MsgBox "Hai premuto: " & s
End Sub

Funziona alla grande!
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: assegnare pulsanti a userform

Postdi Anthony47 » 03/10/17 14:19

Un Grazie! a Mauro Gamberini, quindi.

In effetti nel mio codice della Userform manca, in testa al modulo, la dim della Collection:
Codice: Seleziona tutto
Private m_colCbutt As Collection           '<<< In testa al Modulo della userform


Avevo altre Sub che non c'entravano con l'esempio e mi e' sfuggita quella dichiarazione in testa.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19226
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: assegnare pulsanti a userform

Postdi wallace&gromit » 03/10/17 16:05

Sì, ora funziona anche la tua, che mi sembra persino più snella.
Quindi grazie sì a Mauro Gamberini, ma grazie ancora di più a te!
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21


Torna a Applicazioni Office Windows


Topic correlati a "assegnare pulsanti a userform":


Chi c’è in linea

Visitano il forum: Nessuno e 141 ospiti