Sviluppare funzionalita su Microsoft Office con VBA selezione e assegnazione di nome e testo ad un pulsante a fianco di uno noto

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

    mariome

      salve.

      Su vari fogli ho due pulsanti modulo affiancati, uno già definito con nome, testo e assegnazione identici per tutti i fogli ed uno invece soltanto predeterminato e posizionato col nome che cambia per ogni foglio, quindi non identificabile senza selezionarlo direttamente. Vorrei sapere se è possibile e come, partendo dalla selezione di quello noto selezionare l'altro per poter fare le varie assegnazioni. Ho pensato all'uso di offset ma non ho trovato la dicitura giusta per un pulsante. Grazie 

      #16439 Score: 1 | Risposta

      patel
      Moderatore
        51 pts

        non ho capito bene, allega un file di esempio con aggiunte spiegazioni

        #16440 Score: 0 | Risposta

        mariome
        Partecipante

          Il pulsante noto è Pippo, l'altro per esempio lo vorrei chiamare Pluto su tutti i fogli (questo è un esempio con 3, in realtà ne ho 20). Ma il problema per me è la selezione del secondo che è comunque sempre a fianco, a destra del pulsante Pippo ma che avendo nomi diversi e generici (pulsante2, pulsante3...) non lo posso identificare per tutti i fogli per cui pensavo di usare l'offset, riferendomi a quello già noto (Pippo), ma non so se sia possibile poterlo utilizzare anche per i pulsanti come per le celle. Spero di essere stato chiaro. Ripeto a me più che altro serve capire come arrivare alla selezione del secondo, anche solo su un unico foglio, per il resto, le varie assegnazioni sugli altri fogli, mi è noto come procedere, Grazie

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

          patel
          Moderatore
            51 pts

            l'offset non esiste, però non ho capito casa ci vuoi fare col secondo pulsante, cosa intendi per selezionarlo.

            Però invece di creare manualmente il secondo lo potresti creare da codice così

            Sub CreateButton()
              Dim btn As Button
              Dim t As Range
                Set t = ActiveSheet.Range("E4")
                Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
                With btn
                  .OnAction = "macro1" ' nome della sub associata
                  .Caption = "Pulsante "
                  .Name = "Pulsante1"
                End With
            End Sub
            #16468 Score: 0 | Risposta

            mariome
            Partecipante

              Grazie. Però l' esigenza è diversa. Vorrei poter cambiare il nome ed il testo di un pulsante già posizionato e creato senza un nome assegnato ma dato di default tipo pulsante123...di cui quindi a priori conosco solo il nome di quello di fianco a sinistra (Pippo) . In alternativa per sfruttare la tua proposta potrei cancellarlo e reinserirne uno nuovo. Ma per cancellarlo dovrei comunque poterlo selezionare(....Select o ....Activate), cioè accedervi per poterlo elaborare. 

              #16473 Score: 1 | Risposta

              albatros54
              Moderatore
                89 pts

                Allora, prim di ogni cosa cambia i pulsanti che hai inseriti nel foglio e li sostituisci con i pulsanti "ActiveX", che si trovano piu in basso nello stesso menu, perchè questi supportano la proprieta "Caption", una volta sostituiti i pulsanti assegna al pulsante di Dx la  "caption" che vuoi, mentre al pulsante di Sx la lasci invariata.

                Assegna al pulsante di Dx, sull'evento click  la routine che ti posto, fai sapere. Se ho capito

                Private Sub CommandButton1_Click()
                Dim N As Integer
                    x = ActiveSheet.OLEObjects.Count
                    For N = 1 To x
                        If ActiveSheet.OLEObjects(N).Object.Caption <> "Pippo" Then
                            ActiveSheet.OLEObjects(N).Object.Caption = "Pluto"
                        End If
                    Next
                End Sub

                 

                 

                Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                Sempre il mare, uomo libero, amerai!
                ( Charles Baudelaire )
                #16489 Score: 0 | Risposta

                mariome
                Partecipante

                  Ok albatros54, però così facendo comunque dovrei cancellare manualmente i pulsanti modulo che ho già su molti fogli e dovrei cambiare la forma dei codici chiamati però se non ho alternativa.... Una cosa: usando "registra macro" ho visto che la selezione del pulsante che ho adesso la fa in questo modo:

                      ActiveSheet.Shapes.Range(Array("Button 123")).Select
                  

                   Perchè viene usata la dicitura Array e per identificare il pulsante? Non è che quando ci sono più pulsanti li inserisce in una matrice per cui potrebbero essere identificabili con un indice con una posizione nella matrice? E quale è la funzione della dicitura Shape?  Sempre Grazie.

                  #16490 Score: 1 | Risposta

                  patel
                  Moderatore
                    51 pts

                    prova questa

                    Sub a()
                    For Each sh In ActiveSheet.Shapes
                      'MsgBox sh.Name
                      If sh.Name <> "Pippo" Then sh.Select
                    Next
                    End Sub
                    #16498 Score: 0 | Risposta

                    mariome
                    Partecipante

                      Ottimo Patel, Siccome di pulsanti non definiti dopo Pippo potrei averne anche più di uno per completare l'opera manca solo di poter limitare il ciclo, in questo caso a due. E' possibile? Altrimenti occorre una istruzione che lo interrompa dopo la modifica del nome e del testo del  primo pulsante che incontra diverso da Pippo. Ecco il tuo codice a cui ho aggiunto la modifica del nome e testo col ciclo che vorrei poter chiudere (dopo la modifica) nel caso che di pulsanti diversi da Pippo ne abbia vari. Ho provato con un For da 1 a 2 ma non sono stato capace di trovare la dicitura giusta e non so neppure se in questo caso si possa fare:

                      Sub a()
                      For Each sh In ActiveSheet.Shapes
                        'MsgBox sh.Name
                        If sh.Name <> "Pippo" Then
                          sh.Select
                          Selection.Name = "Pluto"
                          Selection.Characters.Text = "Pluto" & Chr(10) & ""
                          With Selection.Characters(Start:=1, Length:=6).Font
                              .Name = "Calibri"
                              .FontStyle = "Normale"
                              .Size = 10
                              .Strikethrough = False
                              .Superscript = False
                              .Subscript = False
                              .OutlineFont = False
                              .Shadow = False
                              .Underline = xlUnderlineStyleNone
                              .ColorIndex = 1
                          End With
                        End If
                      Next
                      End Sub
                      #16499 Score: 1 | Risposta

                      patel
                      Moderatore
                        51 pts

                        prova così

                        Sub a()
                        n = 0
                        For Each sh In ActiveSheet.Shapes
                        
                          If sh.Name <> "Pippo" Then
                            n = n + 1
                            sh.Select
                            Selection.Name = "Pluto" & n
                            Selection.Characters.Text = "Pluto" & n
                          End If
                        Next
                        End Sub
                        #16517 Score: 0 | Risposta

                        mariome
                        Partecipante

                          ....e quindi ponendo una condizione su n con relativo punto di uscita è possibile scegliere quanti pulsanti  modificare oppure, come era mia esigenza, se il pulsante da modificare è uno solo si pone il punto di uscita alla fine dell'unico passaggio. Riporto i due casi definitivi. Grazie mille Patel per avermi seguito e supportato verso una soluzione che inizialmente temevo impossibile.

                           

                          Sub d()
                          N = 0
                          For Each sh In ActiveSheet.Shapes
                            If sh.Name <> "Pippo" Then
                             If N <= 1 Then
                              N = N + 1
                              sh.Select
                              Selection.Name = "Pluto" & N
                              Selection.Characters.Text = "Pluto" & N
                             Else
                             Exit Sub
                             End If
                            End If
                          Next
                          End Sub
                          
                          Sub c()
                          For Each sh In ActiveSheet.Shapes
                           If sh.Name <> "Pippo" Then
                              sh.Select
                              Selection.Name = "Pluto"
                              Selection.Characters.Text = "Pluto"
                              Exit Sub
                           End If
                          Next
                          End Sub
                          
                          #16518 Score: 1 | Risposta

                          zer0kelvin
                          Partecipante
                            5 pts

                            Salve a tutti.

                            Utilizzando Application Caller e TopLeftCell è possibile determinare quali sono i pulsanti che si trovano sulla stessa riga.

                            Questo è un esempio valido per soli due pulsanti come nel file allegato.

                            Sub Trova_Pulsante()
                                
                                Dim Sp As Shape, Caller As Shape, Target As Shape
                                
                                With ActiveSheet
                                    Set Caller = .Shapes(Application.Caller)
                                    For Each Sp In .Shapes
                                        If Sp.TopLeftCell.Row = Caller.TopLeftCell.Row And Sp.TopLeftCell.Address <> Caller.TopLeftCell.Address Then
                                            Set Target = Sp
                                            Exit For
                                        End If
                                    Next Sp
                                End With
                                If Not Target Is Nothing Then
                                    With Target
                                        .Select
                                        'oppure fai quello che vuoi
                                    End With
                                End If
                                
                            End Sub
                            #16523 Score: 0 | Risposta

                            mariome
                            Partecipante

                              Si imparano tante cose.... Grazie ZerOkelvin. Siccome il pulsante di sx (Pippo)  ha già una assegnazione ad una subrotine dici che sia possibile chiamare la tua sub Trova_Pulsante o da un terzo pulsante o direttamente da una macto, immagino che sia l'application.caller il problema. 

                              #16529 Score: 0 | Risposta

                              mariome
                              Partecipante

                                Ok, sostituisco l' Application.Caller con una variabile col nome del pulsante tramite una InputBox ed il gioco è fatto. Grazie per l'ulteriore spunto e soluzione.

                                Sub Trova_Pulsante()
                                    
                                    Dim Sp As Shape, Caller As Shape, Target As Shape, Nome As String
                                    Nome = InputBox("inserisci il nome")
                                    With ActiveSheet
                                        Set Caller = .Shapes(Nome)
                                        For Each Sp In .Shapes
                                            If Sp.TopLeftCell.Row = Caller.TopLeftCell.Row And Sp.TopLeftCell.Address <> Caller.TopLeftCell.Address Then
                                                Set Target = Sp
                                                Exit For
                                            End If
                                        Next Sp
                                    End With
                                    If Not Target Is Nothing Then
                                        With Target
                                            .Select
                                            'oppure fai quello che vuoi
                                        End With
                                    End If
                                    
                                End Sub
                                #16530 Score: 0 | Risposta

                                mariome
                                Partecipante

                                  Oppure trarre La variabile Caller direttamente da tastiera ma non saprei come fare e neanche se si possa fare.

                                Login Registrati
                                Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
                                Rispondi a: selezione e assegnazione di nome e testo ad un pulsante a fianco di uno noto
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni: