Jak pobrać dane przycisku, który uruchomił makro — odcinek #18

Dziś chcemy poznać kod, który umożliwi nam odczytanie danych przycisku, który uruchomił makro, dzięki czemu będziemy mogli odczytać informacje bezpośrednio np: z tekstu przechowywanym w przycisku, a nie zamieszczać tych informacji w kodzie VBA.
Dodatkowo będziemy mogli podpiąć to samo makro pod wiele przycisków/kształtów i w zależności od tego, który przycisk klikniesz wpiszą się inne informacje.

Zrobimy to na uproszczonym przykładzie akcji, jakie mogą wykonywać koszykarze z kosmicznego meczu. Mamy 3 przyciski akcji i 5 przycisków zawodników. Odpowiednio przyciski akcji są podpięte pod makro Akcja, a przyciski zawodników pod makro Zawodnik.

VBA 18 - Jak pobrać dane przycisku, który uruchomił makro 01

Dwie najważniejsze dla nas linijki kodu z tych dwóch makr to:
Przycisk = Application.Caller
NazwaPrzycisku = ActiveSheet.Shapes(Przycisk).TextFrame.Characters.Text

Najpierw pobieramy "wewnętrzną" nazwę przycisku (obiektu) który uruchomił makro, a później wykorzystujemy tą nazwę, żeby wyciągnąć dokładną informację o tekście przechowywanym w kształcie/przycisku. Ot i cała filozofia. Reszta kodu służy temu, żeby informacje wstawiały się w odpowiednich miejscach.

Przy tym kodzie ważna jest jeszcze informacja, że warto, żeby tekst w kształtach nie był wpisywany ręcznie tylko pobierany z komórek Excela.

VBA 18 - Jak pobrać dane przycisku, który uruchomił makro 02

Dzięki temu szybko możemy zmienić np: drużynę i jej wszystkich zawodników po prostu przekopiowując w komórki powiązane zawodników z drugiej drużyny.

Sub Zawodnik()
Dim Przycisk As String, NazwaPrzycisku As String
'Pobiera "wewnętrzną" nazwę przycisku/kształtu
Przycisk = Application.Caller
'na podstawie tej nazwy wyciągamy tekst wpisany w tym kształcie
NazwaPrzycisku = ActiveSheet.Shapes(Przycisk).TextFrame.Characters.Text

If Range("C2").Value = "" Then
Range("C2").Value = NazwaPrzycisku
Else
Range("C1").End(xlDown).Offset(1, 0).Value = NazwaPrzycisku
End If
End Sub

Pozdrawiam
Adam Kopeć
Miłośnik Excela

Funkcja POŁĄCZ TEKSTY przed Excelem 2016 — odcinek #17

Od Excela 2016 została wprowadzona funkcja POŁĄCZ.TEKSTY, która w łatwy sposób umożliwia połączenie zwykłych tekstów, liczb, danych z zakresów dane, ale wcześniej nie było takiej funkcji, dlatego poniżej znajdziesz kod VBA, który taką funkcję tworzy i pozwala Ci z niej korzystać w Excelu.

vba-17-funkcja-polacz-teksty-przed-excelem-2016

Function POŁĄCZTEKST(ogranicznik As String, ignoruj_puste As Boolean _

, ParamArray tekst() As Variant) As String

    'Zmienne pomocnicze

Dim i As Integer, j As Integer

    'Pętla po wszystkich elementach parametru tekst

    'funkcja UBound wyznacza pierwszy wymiar parametru tekst

For i = 0 To UBound(tekst)

        'Sprawdzamy, czy aktualny (numer i) element parametru tekst jest zakresem

If TypeName(tekst(i)) = "Range" Then

            'Jeśli jest to musimy przejść po wszyskich jego komórkach

            'może być istotne, że VBA przechodzi od lewej do prawej, później góra dół

For j = 1 To tekst(i).Count

                'Jeśli ustawiłeś, że mają być ignorowane wartości puste to tu jest sprawdzane,

                'czyli argument ignoruj_puste musi być równy True

                'i komórka zakresu (tekst(i)(j)) musi być pusta

If Not (ignoruj_puste And tekst(i)(j) = "") Then

POŁĄCZTEKST = POŁĄCZTEKST & ogranicznik & tekst(i)(j)

End If

Next j

Else

            'Jeśli aktualny (numer i) element parametru tekst nie jest zakresem

            'to możemy go od razu połączyć, zakładam też, że nikt nie wpisze pustej wartości

            'więc nie sprawdzamy czy wartości wpisane są puste

POŁĄCZTEKST = POŁĄCZTEKST & ogranicznik & tekst(i)

End If

Next i

    'a na koniec wycinamy pierwszy ogranicznik, bo wstawia się na początku połączonego tekstu

POŁĄCZTEKST = Right(POŁĄCZTEKST, Len(POŁĄCZTEKST) — Len(ogranicznik))

End Function

 

Chcesz ze mną poznać możliwości VBA? Zobacz kiedy planowana jest następna edycja 30dniowego kursu online:
http://excelw30dni.pl/kategoria-produktu/szkolenia-vba/

Pozdrawiam
Adam Kopeć
Miłośnik Excela

Jak zamienić kropkę na przecinek w VBA — odcinek #16

Jeśli chcesz zamienić kropkę na przecinek za pomocą VBA natkniesz się na pewien problem w polskojęzycznym Excelu.
Często powtarzam, że jeśli nie wiesz jak coś zrobić/napisać w VBA, ale wiesz jak to zrobić w Excelu, to zarejestruj sobie makro, tego co robisz w Excelu, a później analizuj kod. Sprawdza się to w większości sytuacji. Tak też zrobimy teraz, czyli najpierw zarejestrujemy makro, gdzie w Excelu za pomocą opcji Zamień zmienimy kropkę na przecinek, a dopiero później sprawdzimy jak działa zarejestrowany kod VBA.
Do opcji Zamień najszybciej dojdziesz naciskając skrót klawiszowy Ctrl + H, potem wypełniasz odpowiednio pola (Znajdź – kropka, Zamień na – przecinek) i klikasz przycisk Zamień wszystko.

vba-16-jak-zamienic-kropke-na-przecinek-01

Teraz trzeba sprawdzić czy uruchomienie zarejestrowanego kodu zadziała.

vba-16-jak-zamienic-kropke-na-przecinek-02

Okazuje się, że nie do końca, bo w niektórych przypadkach może w ogóle nie dokonać zmiany, a w innych znaki się zmienią, ale liczby nie zostaną poprawnie rozpoznane przez Excela (są wyrównane do lewej).

Musisz pamiętać, że edytor VBA jest angielskojęzyczny, co się wiąże również z tym, że część całkowita jest oddzielona od części dziesiętnej liczby kropką, a nie przecinkiem jak w polskim Excelu. Dlatego w kodzie VBA musisz zrobić dziwną rzecz – zamienić kropkę na kropkę. Resztę zrobią ("przetłumaczą") ustawienia regionalne.

Tym razem zmiana dokonała się poprawnie.

vba-16-jak-zamienic-kropke-na-przecinek-03

Dlatego pamiętaj o tym, że edytor VBA zawsze "mówi" po angielsku, a Excel różnie w zależności od wersji językowej. Z tych różnic wynikają podobne różne dziwne kody.

Sub KropkaPrzecinek() Selection.Replace What:=".", Replacement:=".", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False

End Sub

Chcesz ze mną poznać możliwości VBA? Zobacz kiedy planowana jest następna edycja 30dniowego kursu online:
http://excelw30dni.pl/kategoria-produktu/szkolenia-vba/

Pozdrawiam
Adam Kopeć
Miłośnik Excela

Tab order czyli kolejność przeskakiwania między elementami na formularzu

Jak ustawić kolejność przeskakiwania pomiędzy elementami formularza?

Tab order czyli kolejność przeskakiwania między elementami na formularzu Tab order czyli kolejność przeskakiwania między elementami na formularzu

Kiedy tworzysz w Excelu VBA formularz i dodajesz do niego kolejne elementy, to chciałbyś, żeby kiedy naciskasz przycisk Tab przeskoki następowały w konkretnej kolejności (najczęściej z góry na dół).
Ale nie zawsze udaje się to zrobić od początki, ponieważ najpierw Excel VBA bazuje na kolejności w jakiej dodawałeś elementy.

Co prawda każdy poszczególny element ma własność TabIndex, ale zmieniając tą wartość dla pojedynczego elementu nie masz pewności jak zachowają się inne elementy. Dlatego dużo wygodniej w edytorze VBA otworzyć menu View i wybrać opcję Tab Order (kiedy masz aktywny wybrany formularz).

Otworzy się okienko z wszystkimi elementami wybranego formularza. Możesz przesuwać teraz ich kolejność góra (przycisk Move Up) i dół (przycisk Move Down).

Jak ustawisz właściwą kolejność możesz włączyć formularz i zobaczyć jak naciskając Tab przeskakujesz pomiędzy elementami formularza w wybranej kolejności.

Pewne elementy jak Label nie biorą udziału w tym przeskakiwaniu, mimo że można im ustawić własność TabIndex i pojawiają się w oknie Tab Order.

P.S.

Jeśli chcesz dowiedzieć się więcej na temat Excela lub nie wiesz jak coś zrobić to napisz do mnie. Ja w miarę możliwości odpowiem na Twoje pytanie.

Excel i Adam - kontakt

Bezpośredni odnośnik do filmu na youtube — Tab order czyli kolejność przeskakiwania między elementami na formularzu