Jak cofnąć makro – odcinek #20

Ogólnie jeśli chcesz Twoje makro ruszy arkusz, czy też dane w komórkach, to również wyczyści bufor cofania i nie będziesz mógł cofnąć, ani czynności, które wykonało makro, ani czynności, które wcześniej wykonywałeś – Ctrl + Z nie zadziała.

Jeśli Twoje makro nie rusza arkusza, np: wyświetla komunikat za pomocą funkcji Msgbox, to bufor cofania nie jest czyszczony i dalej możesz cofnąć swoje wcześniejsze czynności za pomocą skrótu klawiszowe.

Niektórzy chcieliby móc cofać swoje makra, dlatego został stworzony kod, który wykorzystuje pewną sztuczkę, a mianowicie w swoim makrze na samym jego początku dodajesz linijkę kodu, która zapisuje Twój plik:
ActiveWorkbook.Save

Następnie jeśli Twoje makro zadziałało niepoprawnie uruchamiasz makro, które powinieneś przechowywać w innym pliku np: skoroszycie makr osobistych, które pobiera nazwę Twojego pliku (aktywnego pliku), zamyka go bez zapisywania, a następnie ponownie uruchamia:

Czyli symuluje to co musiałbyś zrobić ręcznie, żeby odzyskać swoje dane 😉

Pozdrawiam
Adam Kopeć
Miłośnik Excela

Jak zmienić kolor słowa w zaznaczonych komórkach – odcinek #19

Krótki opis problemu

Potrzebujemy zmienić kolor tylko wybranych słów/fraz w zaznaczonych komórkach Excela. Sam Excel sobie z tym nie poradzi dlatego musimy napisać odpowiedni kod VBA.

VBA 19 - Jak zmienić kolor słowa w zaznaczonych komórkach (Walentynki) 01

Kod

Sub ZmieńKolor()

Dim MojeSłowo As String, Długość As Integer, i As Integer
Dim r As Range, SF As Integer
‚Jakie słowo frazę chcesz zmienić
MojeSłowo = InputBox(„Podaj słowo jakie chcesz pomalować na czerwono”)
‚Długość słowa/frazy, którą chcesz zmienić
Długość = Len(MojeSłowo)
‚Pętla po wszystkich komórkach (r) w zaznaczonym obszarze (Selection)
For Each r In Selection

‚Pętla po znakach w aktualnej komórce
For i = 1 To Len(r.Value)

‚Ponieważ może nie znaleźć słowa w komórce potrzebujemy obsługiwać
‚błąd wystarczy, że każemy VBA przejść dalej
On Error Resume Next
SF = 0
‚rozróżnia wielkość liter
SF = WorksheetFunction.Find(MojeSłowo, r.Value, i)
‚Nie zwraca uwagi na małe wielkie
‚SF = WorksheetFunction.Find(UCase(MojeSłowo), UCase(r.Value), i)
‚Wracamy do normalnej obsługi błędu
On Error GoTo 0
‚Jeśli zmienna SF większa od zera to znaczy, że tekst został
‚odnaleziony, czyli zmieniamy kolor części tekstu
If SF > 0 Then
r.Characters(Start:=SF, Length:=Długość).Font.Color = RGB(255, 0, 0)
i = SF + 1
‚jeśli nie to kończymy pętlę i przechodzimy do sprawdzania następnej komórki
Else
Exit For
End If

Next i

Next r

End Sub

Pozdrawiam
Adam Kopeć
Miłośnik Excela

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:

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.

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.

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