› Sviluppare funzionalita su Microsoft Office con VBA › selezione e assegnazione di nome e testo ad un pulsante a fianco di uno noto
-
AutoreArticoli
-
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
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.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 SubGrazie. 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.
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 SubQual è 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 )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")).SelectPerchè 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.
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....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 SubSalve 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 SubSi 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.
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 -
AutoreArticoli
