Sviluppare funzionalita su Microsoft Office con VBA stessa macro su 19 command button

Login Registrati
Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
  • Autore
    Articoli
  • #39674 Score: 0 | Risposta

    gianfranco55
    Partecipante
      91 pts

      ciao

      dovrei mettere questa macro

      Private Sub CommandButton1_Click()
      Range("R16").Value = Range("R16").Value & CommandButton1.Caption
      End Sub

      su 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

      #39675 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        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.
        #39677 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          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... 😉

          #39678 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            Un esempio al volo con Application.Caller.

            Allegati:
            You must be logged in to view attached files.
            #39680 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              vecchio frac ha scritto:

              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.
              #39683 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                272 pts

                vecchio frac ha scritto:

                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).

                #39685 Score: 0 | Risposta

                alfrimpa
                Partecipante
                  33 pts

                  Gianfranco55, noto formalista ricercato dalle forze dell’ordine, cerca rifugio nell’ambiente VBA     

                  #39686 Score: 0 | Risposta

                  patel
                  Moderatore
                    51 pts

                    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 Sub
                    

                     

                    #39696 Score: 0 | Risposta

                    gianfranco55
                    Partecipante
                      91 pts

                      ciao

                      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 Sub

                      MODULO 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 Sub

                      i 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 Sub
                      

                      come vedi anche i formulisti come me

                      riescono a copiare e variare benissimo i codici vba   

                      #39697 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        272 pts

                        Occhio che secondo me questa istruzione:

                        gianfranco55 ha scritto:

                        If TypeName(ctrl.Object) = "CommandButton" Then

                        deve essere così:

                        If TypeName(oCtrl.Object) = "ICommandButton" Then

                        perché il TypeName dell'interfaccia del pulsante di comando è "ICommandButton", con la I iniziale ("Interface").

                        #39698 Score: 0 | Risposta

                        gianfranco55
                        Partecipante
                          91 pts

                          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

                          #39699 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            gianfranco55 ha scritto:

                            vedo che il file funziona

                            Se funziona non toccarlo   

                            #39704 Score: 0 | Risposta

                            patel
                            Moderatore
                              51 pts

                              gianfranco55 ha scritto:

                              il codice sopra l'ho copiato spudoratamente 

                              Come tutti noi in questi casi.

                            Login Registrati
                            Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
                            Rispondi a: stessa macro su 19 command button
                            Gli allegati sono permessi solo ad utenti REGISTRATI
                            Le tue informazioni: