› Sviluppare funzionalita su Microsoft Office con VBA › stessa macro su 19 command button
-
AutoreArticoli
-
ciao
dovrei mettere questa macro
Private Sub CommandButton1_Click() Range("R16").Value = Range("R16").Value & CommandButton1.Caption End Subsu 19 pulsanti
a tutti la stessa
se ti clicco mi devi inserire il tuo caption in una cella
ora uno ad uno è capace anche un pistola del vba come me
si può fare con un comando unico?
grazie
Se vuoi fare una cosa veramente carina, bisogna creare un array di controlli. VBA non è VB6 😉
Ti allego un file di esempio, da adattare (qui sono coinvolte delle Textbox ma il principio è valido).
Domani con calma te lo spiego 🙂
Allegati:
You must be logged in to view attached files.In alternativa magari si può usare la stessa Sub per tutti e invocare Application.Caller per conoscere il controllo chiamante... sto chiudendo quindi mi vengono idee senza freni... 😉
Un esempio al volo con Application.Caller.
Allegati:
You must be logged in to view attached files.bisogna creare un array di controlli
Ti allego un esempietto fatto adesso. Lo schema è sempre lo stesso.
Allegati:
You must be logged in to view attached files.Domani con calma te lo spiego
In pratica bisogna creare una variabile WithEvents in un modulo di classe che definisca una nuova classe di oggetti che deriva dal tipo di oggetto che si vuole pilotare (check box, text box, command button, eccetera). Ogni oggetto ha un suo TypeName preciso.
Nell'evento Initialize del tuo userform si predispone una collezione pubblica di controlli del tipo personalizzato.
Nel modulo di classe personalizzato si scrive il codice relativo agli eventi che si vogliono intercettare quando un oggetto del tipo desiderato viene coinvolto. Intellisense fornisce l'elenco degli eventi disponibili perchè riconosce che l'oggetto della Collection è del tipo derivato da quello "base". Così un button e una label espongono una Caption e un evento Click, mentre una textbox espone per esempio un evento After_Update e una proprietà Forecolor per il testo.
In questo modo si scrive codice compatto e tutti gli eventi e le proprietà si riferiscono all'oggetto che è stato inserito nella Collection (se vuoi escludere un commandbutton da questo gioco, quindi, lo devi rimuovere dalla Collection definita nell'evento Initialize del Form).
Gianfranco55, noto formalista ricercato dalle forze dell’ordine, cerca rifugio nell’ambiente VBA
Volendo puoi creare i pulsanti con una macro invece di farlo manualmente ed assegnare a tutti lo stesso comando
Sub CreateButtons() Dim btn As Button Application.ScreenUpdating = False ActiveSheet.Buttons.Delete Dim t As Range For i = 2 To 6 Step 2 Set t = ActiveSheet.Range(Cells(i, 3), Cells(i, 3)) Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height) With btn .OnAction = "btnS" .Caption = "Btn " & i .Name = "Btn" & i End With Next i Application.ScreenUpdating = True End Sub Sub btnS() MsgBox Application.Caller End Subciao
grazie
ora provo tutte le vostre proposte
per il mio amatissimo AL
guarda che io il file l'ho già fatto ma con una procedura che trovo complessa per chi la deve gestire
(stavo pensando di mettere un comando per pulsante)
te la mostro per farti invidia
QUESTA CARTELLA DI LAVORO
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Call ImpostaCommandButtons End SubMODULO DI CLASSE
Option Explicit Public WithEvents CommandButton As CommandButton Private Sub CommandButton_Click() If Mid(CommandButton.Name, 14, 2) <= 19 Then Range("R16").Value = Range("R16").Value & CommandButton.Caption End If End Subi pulsanti sono circa 30 e messi su un foglio
ho limitato ai primi 19 la macro da eseguire gli altri hanno altre funzioni
MODULO
Option Explicit Dim CommandButtons() As New Classe1 Sub ImpostaCommandButtons() Dim ctrl As OLEObject Dim cont As Long For Each ctrl In ThisWorkbook.Worksheets("Range").OLEObjects If TypeName(ctrl.Object) = "CommandButton" Then cont = cont + 1 ReDim Preserve CommandButtons(1 To cont) Set CommandButtons(cont).CommandButton = ctrl.Object End If Next ctrl End Subcome vedi anche i formulisti come me
riescono a copiare e variare benissimo i codici vba
Occhio che secondo me questa istruzione:
If TypeName(ctrl.Object) = "CommandButton" Then
deve essere così:
If TypeName(oCtrl.Object) = "ICommandButton" Thenperché il TypeName dell'interfaccia del pulsante di comando è "ICommandButton", con la I iniziale ("Interface").
ciao
vecchio trentino
provo a variare ma vedo che il file funziona
ora lo scrivo come dici tu.
il codice sopra l'ho copiato spudoratamente
speravo poterlo semplificare con macro leggibili anche a pirlotti del VBA come me
se non peggio.
va a finire che uso 19 macro al click
non è gestibile da uno che non conosce il VBA bene come voi
ma nel frattempo imparo io qualche cosa
provato
funziona come senza la I
vedo che il file funziona
Se funziona non toccarlo
il codice sopra l'ho copiato spudoratamente
Come tutti noi in questi casi.
-
AutoreArticoli
