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.
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 ® 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
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.
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.
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
Od Excela 2019 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.
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,
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.
Teraz trzeba sprawdzić czy uruchomienie zarejestrowanego kodu zadziała.
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.
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, _
Jak ustawić kolejność przeskakiwania pomiędzy elementami formularza?
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.