2010-10-04 37 views
8

Ho assegnato macro a pochi pulsanti.pulsante vba - trova che è stato cliccato

Come posso scoprire all'interno di quale pulsante è stato premuto il pulsante?

sto facendo come modulo di utente, dove può popoli di ingresso da parte della famiglia:

nome1:
surname1:

nome2:
surname2:
| aggiungi membro successivo |

Desidero che il pulsante venga visualizzato sempre nell'ultima riga dell'ultima persona aggiunta. Per semplicità penso che sia meglio avere come 100 moduli vuoti nel foglio ma tutti invisibili all'inizio.
Quindi, quando l'utente fa clic su Aggiungi membro successivo, faccio semplicemente visualizzare le righe successive, e passa al pulsante successivo. Ma per farlo ho bisogno di sapere la mia posizione attuale.

Simile all'eliminazione rendere le righe invisibili quando si fa clic sul pulsante di rimozione.

nome1:
surname1:
[rimuovi]

nome2:
surname2:
[rimuovi]

NAME3:
surname3:
| aggiungi prossimo membro |

Ho bisogno di sapere quale pulsante di rimozione è stato cliccato.

EDIT: Trovato in Web - cosa ne pensi, sembra essere migliore/modo

Dim r As Range 
Set r = ActiveSheet.Buttons(Application.Caller).TopLeftCell 
Range(Cells(r.Row, r.Column), Cells(r.Row, r.Column)).Select 
+0

Quindi per chiarire la tua modifica, sembra che tu abbia solo un set di pulsanti, ma continui a spostarli. Quindi tutto ciò che devi sapere è come posizionare i pulsanti di seguito. È così? –

+0

I numero di pulsanti "Rimuovi" e al pulsante "Aggiungi". – Gadolin

+0

OK, ho trovato come ottenere il pulsante, ma sembra che tu l'abbia già trovato. Puoi semplificare l'istruzione Select ma sembra a posto. –

risposta

13

scrivo sempre wrapper per ogni pulsante che quindi chiamare la macro in questione.

Come così:

Public Sub StoreButton_Click() 

    Call StoreTransValues(ActiveSheet) 

End Sub 

Se si dispone di un solo pulsante per un qualsiasi pagina, si può solo ottenere la proprietà ActiveSheet, e sarà il tasto in quella pagina.


Edit:

Ecco il codice per ottenere e utilizzare il nome del tasto di chiamata:

Dim ButtonText As String 

ButtonText = Application.Caller 

ActiveSheet.Shapes(ButtonText).Delete 

Si potrebbe utilizzare il metodo .Portare per spostare il pulsante.

+0

Non posso semplicemente adattare la tua proposta per il mio caso. Devo ancora scoprire qual è la posizione del pulsante su cui si fa clic, quindi individuare la riga corrispondente e infine rimuovere tutti, ad es. 2 righe sopra. – Gadolin

1

Dato che una macro è collegata al/ai tasto/i, presumo che tu sappia quale pulsante è stato cliccato. Per ottenere la posizione del pulsante, usare questo:

ActiveSheet.Shapes("ButtonName").TopLeftCell.Address 

Per spostare un pulsante in una nuova posizione, utilizzare questo:

Dim NewAddress as Range 
NewAddress = ActiveSheet.Cells(5, 5) 'Or where ever you need it to go 
ActiveSheet.Shapes("ButtonName").Left = NewAddress.Left 
ActiveSheet.Shapes("ButtonName").Top = NewAddress.Top 
+0

non se si semplifica il codice assegnando la stessa macro a ciascun pulsante, nel qual caso la macro deve essere più intelligente –

+0

Ottenuta la posizione con la risposta e posizionata con http://stackoverflow.com/a/8303944/2932994 – simonides

6

ho finalmente trovato la soluzione per determinare quale pulsante in un foglio di lavoro è stato spinto. Il credito è dovuto a Derk allo http://www.ozgrid.com/forum/showthread.php?t=33351.

Il mio codice ultimo esempio:

Sub HereIAm() 
    Dim b As Object 
    Dim cs, rs As Integer 
    Dim ss, ssv As String 
    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     rs = .Row 
     cs = .Column 
    End With 
    ss = Left(Cells(1, cs).Address(False, False), 1 - (ColNumber > 26)) & rs 
    ssv = Range(ss).Value 
    MsgBox "Row Number " & rs & " Column Number " & cs & vbNewLine & _ 
     "Cell " & ss & " Content " & ssv 
End Sub 

Se non è necessario l'etichetta cellule, cellule (RS, CS) .Value funziona pure.

-2
Dim button as a string: 

    button = ActiveSheet.Shapes(Application.Caller).Name 
Problemi correlati