nome del bottone clickato
Hai un problema con Excel? 
nome del bottone clickato
di pregiudicato_83 (utente non iscritto) data: 24/01/2015 16:41:55
ciao a tutti e grazie per l'aiuto già avuto in altre occasioni.
semplificando il problema è questo:
vorrei mettere 2,3,4..N pulsanti in un foglio (controlli activex) e quando ne clicko uno, ottenere il nome del pulsante nella cella A1.
sembra una banalità ma ho girato mezzo internet e non ne sono uscito.
qui il codice a cui sono arrivato ma non funziona.
ciao e grazie
Private Sub CommandButton1_Click()
nome_controllo= ActiveSheet.Shapes(Application.Caller).Name
range("A1")=nome_controllo
End Sub |
di Vecchio Frac data: 24/01/2015 17:40:00
Ti stesso dici che hai piazzato dei command buttons ActiveX (e si vede anche dal codice che esponi).
In realtà tu sai già perfettamente quale pulsante hai cliccato: è nella firma del codice.
Se poi intendi dire che hai un codice comune, che richiami alla pressione di ogni command button che crei, anche qui non c'è possibilità di errore: sempre l'evento Click di ogni singolo buoon devi scrivere, e quindi puoi passarne il nome al modulo comune.
Private Sub CommandButton1_Click() '<<<< questo codice si esegue quando premi il command button 1
range("A1")= "Command Button 1"
End Sub
- OPPURE -
Private Sub CommandButton1_Click() '<<<< questo codice si esegue quando premi il command button 1
call scrivi_mio_nome("command button 1")
End Sub
private sub scrivi_mio_nome(s as string)
range("A1")= s
end sub
|
di lepat (utente non iscritto) data: 24/01/2015 17:42:09
a me funziona la tua macro
di Vecchio Frac data: 24/01/2015 17:44:54
@lepat
Sul mio Excel 2010 *non* funziona, tu che versione hai usato per testare il codice?
di lepat (utente non iscritto) data: 24/01/2015 17:54:21
preciso meglio, la macro di pregiudicato_83 funziona bene con i pulsanti da controlli modulo, non con quelli ActiveX
di Vecchio Frac data: 24/01/2015 17:59:06
Ah ecco, e bè già, infatti Application.Caller si usa proprio con quel tipo di controlli.
Il punto è però che il nostro interlocutore utilizza controlli ActiveX (lo vedi anche dal codice che usa).
di pregiudicato_83 (utente non iscritto) data: 24/01/2015 18:58:46
Ciao, il problema è semplificato, so di avere il nome del controllo, ma nel caso specifico avrei la necessità che venga preso in automatico (per poi passarlo a una funzione)
inoltre dopo tutto il tempo che ci ho passato....è diventata anche una questione "un po' personale".
In ogni caso non vi sembra strano che non si possa avere accesso al nome del controllo attivato?
di mabolsie (utente non iscritto) data: 24/01/2015 19:27:42
Ciao pregi.... hai posto una questione abbastanza semplice ma adesso hai calato un carico da 90, puoi allegare il file completo così vediamo come funziona ?
Ciao Max
di Vecchio Frac data: 24/01/2015 21:45:28
cit. "ma nel caso specifico avrei la necessità che venga preso in automatico (per poi passarlo a una funzione) "
---> Ma non ha senso: nel momento in cui tu clicchi su un controllo, lui esegue il codice associato a se stesso, che non è impostabile come se fosse un controllo modulo (al quale puoi assegnare una macro). E quindi tu per forza devi passare dalla porzione di codice che Excel gli ha preimpostato (evento _Click per i commandbutton).
Inserisci un command button active-x nel foglio.
Quando ci fai doppio clic sopra, ti si apre l'editor di codice con già la routine di default dell'evento click per quell'oggetto. Da quel momento in avanti hai il controllo dell'oggetto, il suo nome, e tutti i metodi che espone.
Creare altre sub o funzioni puoi: ma non verranno mai scatenate direttamente da quel controllo, quindi è inutile generare una sub comune (non puoi avere matrici di controlli active-x indicizzabili sul foglio).
di isy data: 24/01/2015 23:05:55
Cit: Creare altre sub o funzioni puoi: ma non verranno mai scatenate direttamente da quel controllo, quindi è inutile generare una sub comune (non puoi avere matrici di controlli active-x indicizzabili sul foglio).
Allego un esempio per rilevare il pulsante premuto, un esempio
File: ControlButtonHandler.xls
di Vecchio Frac data: 25/01/2015 08:49:47
L'esempio di isy crea una collezione di controlli che però purtroppo sul mio Excel 2010 non funziona (Err 1004, Impossibile trovare la proprietà Object per la classe OLEObject).
Era quello che avevo sperimentato io ma non avendo tempo per capire l'errore ho preferito lasciar perdere ^_^
Grazie comunque isy, l'esempio è sicuramente valido per altre circostanze.
di lepat (utente non iscritto) data: 25/01/2015 09:59:02
mi sembra molto più semplice rinunciare ai pulsanti ActiveX ed utilizzare il primo codice postato
di prgiudicato_83 (utente non iscritto) data: 25/01/2015 10:33:34
Frac, siamo d'accordo sul fatto che si possa fare tutto scrivendo il nome ogni volta, e ormai sono convinto che sia la strada migliore, ciò non toglie a mio avviso l'utilità di andare a fondo della questione. nel caso specifico, dovendo gestire molti bottoni mi veniva "comodo" e "pulito" scrivere qualcosa del tipo:
Private Sub CommandButton1_Click(): call(funzione):End Sub
Private Sub CommandButton23_Click(): call(funzione):End Sub
Private Sub CommandButton53_Click(): call(funzione):End Sub
Private Sub CommandButton121_Click(): call(funzione):End Sub
......
Private Sub CommandButton173_Click(): call(funzione):End Sub
ma visto che non è possibile (almeno in modo semplice) passerò alla funzione il nome del bottone digitandolo.
ringrazio come al solito degli interventi che stimolano sempre ragionamenti.
special thanks to mabolsie & isy Ciao e buona domenica
di Vecchio Frac data: 25/01/2015 11:11:58
Eh lo so che è più comodo e pulito.
E anzi non servirebbe nemmeno la gestione del singolo pulsante perchè ci sarebbe un evento globale che viene invocato alla pressione del singolo.
di lepat (utente non iscritto) data: 25/01/2015 11:30:27
I controlli activeX offrono maggiori possibilità di personalizzazione, ma i pulsanti in particolare cosa offrono di più rispetto a quelli normali
di Vecchio Frac data: 25/01/2015 17:47:37
@isy
Ok, ho scovato il problema e corretto l'errore per versione Excel 2010.
Bisogna fare riferimento a Object e non a OLEObject quando si testa il tipo di controllo in esame.
Bene, così funziona!
'in modulo1:
If TypeName(obtCommandButton.Object) = "CommandButton" Then
'e più sotto:
Set clsEvents.Control = obtCommandButton.Object |
di pregiudicato_83 (utente non iscritto) data: 26/01/2015 11:32:53
ok, ho capito che mi devo studiare le classi, ho guardato un po in giro e aprono delle frontiere importanti per un sacco di progetti che ho fatto e che potrei migliorare/semplificare. peccato che non si trovi tantissimo materiale sulle classi. ciao
di Vecchio Frac data: 26/01/2015 13:55:21
cit. "ho capito che mi devo studiare le classi"
---> Mah, con VBA non è strettamente necessario, anche se sapere cosa sono, cosa puoi farci e come si usano, quando si usano sarebbe meglio.
Vuoi Approfondire?