2010-10-04 9 views
8

Przypisałem makro do kilku przycisków.Przycisk vba - znalezisko, które zostało kliknięte

Jak mogę dowiedzieć się w środku makra, który przycisk został kliknięty?

robie jako formy obsługi, gdzie można wejść ludzie z rodziny:

name1:
surname1:

name2:
surname2:
| dodanie kolejnego członka |

Chcę, aby przycisk pojawiał się zawsze w ostatnim rzędzie ostatnio dodanej osoby. Dla uproszczenia, myślę, że lepiej mieć 100 pustych formularzy w arkuszu , ale wszystkie niewidoczne na początku.
Następnie, gdy użytkownik kliknie, dodaj kolejnego członka, po prostu pokaż kolejne wiersze, i przejdź do następnej osoby. Ale aby to zrobić, muszę znać moją obecną pozycję.

Podobny z usunięciem spowodowałoby niewidoczne wiersze po kliknięciu przycisku Usuń.

name1:
surname1:
[usuń]

name2:
surname2:
[usuń]

NAME3:
surname3:
| dodaj następny członek |

Potrzebuję wiedzieć, który przycisk usunięcia został kliknięty.

EDIT: Znalezione w sieci - co o tym sądzisz, wydaje się być najlepszy/way

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

Aby wyjaśnić wprowadzone zmiany, wydaje się, że masz tylko jeden zestaw przycisków, ale nadal je przenosisz. Więc wszystko, co naprawdę musisz wiedzieć, to umieszczanie przycisków w rzędzie. Czy to to? –

+0

I liczba przycisków "usuń" i przycisk "bardzo" i "dodaj". – Gadolin

+0

OK, znalazłem, jak uzyskać przycisk, ale wygląda na to, że już go znalazłeś. Możesz uprościć instrukcję Select, ale wygląda dobrze. –

Odpowiedz

13

zawsze napisać otoki dla każdego przycisku, który następnie wywołać makro w pytaniu.

tak:

Public Sub StoreButton_Click() 

    Call StoreTransValues(ActiveSheet) 

End Sub 

Jeśli masz tylko jeden przycisk dla każdej jednej strony, można po prostu właściwość ActiveSheet, i będzie to przycisk znajdujący się na tej stronie.


Edit:

Oto kod, aby uzyskać i użyć nazwy przycisku wywołującego:

Dim ButtonText As String 

ButtonText = Application.Caller 

ActiveSheet.Shapes(ButtonText).Delete 

byłoby użyć metody .Doprowadzić aby przesunąć przycisk.

+0

Nie mogę po prostu dostosować twojej propozycji do mojej sprawy. Nadal muszę dowiedzieć się, jaka jest pozycja klikniętego przycisku, a następnie znaleźć odpowiedni wiersz, a na końcu usunąć wszystkie, np. 2 rzędy powyżej. – Gadolin

1

Ponieważ masz makro podłączone do przycisku (ów), zakładam, że wiesz, który przycisk został kliknięty. Aby uzyskać lokalizację przycisku, użyj tego:

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

Aby przenieść przycisk do nowej lokalizacji, użyj tego:

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

nie, jeśli uprościsz kod, przypisując to samo makro do każdego przycisku, w którym to przypadku makro musi być mądrzejsze –

+0

Otrzymałeś pozycję z odpowiedzią i umieściłeś ją pod adresem http://stackoverflow.com/a/8303944/2932994 – simonides

6

końcu znalazłem rozwiązanie dla określenia, który przycisk w arkuszu było pchnął. Kredyt jest należny firmie Derk pod numerem http://www.ozgrid.com/forum/showthread.php?t=33351.

Mój ostatni przykład kodu:

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 

Jeśli nie potrzebują etykietę, komórki (rs, cs) .Value działa tak samo.

-2
Dim button as a string: 

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