ID tematu: 59271
|
64. Łączenie tekstów sformatowanych inicjowane funkcją |
Autor |
Wiadomość |
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Posty: 10323
|
Wysłany: 03-11-2017, 10:25 64. Łączenie tekstów sformatowanych inicjowane funkcją
|
|
|
Zagadnienie łączenia tekstów sformatowanych na poziomie znaków często powraca w pytaniach użytkowników Forum. Najczęściej proponuje się w takim przypadku użycie makroinstrukcji. Ja również w jednym z wcześniejszych postów wskazywałem takie rozwiązanie. Użycie funkcji byłoby wygodniejsze, gdyż łatwiej przekazuje się argumenty, ponadto można uwzględnić separatory, rozdzielające łączone fragmenty oraz łączyć teksty sformatowane w komórkach ze stałymi tekstowymi podanymi bezpośrednio jako argumenty. Poszerzenie funkcjonalności musi oznaczać jednak większą złożoność rozwiązania. Idea łączenia tekstów sformatowanych pozostanie taka sama jak w rozwiązaniu podanym wcześniej. W przypadku tekstów niesformatowanych, podanych jako stałe tekstowe, należy przyjąć format domyślny, najlepiej oparty na czcionce i jej rozmiarze, zdefiniowanych w stylu Normal.
Ponieważ zarówno separator, jak i łączone fragmenty tekstu mogą być sformatowane i pochodzić z obiektu komórki, ale mogą być też niesformatowane i pochodzić ze stałej tekstowej, należy przy łączeniu uwzględnić oba te przypadki. Składnia funkcji byłaby taka:
Kod: | = F_Połącz(kom_docelowa As Range; sep As Variant; ParamArray dane())
| Dwa pierwsze argumenty są obowiązkowe, pierwszy oznacza komórkę, w której chcemy umieścić wynik (nie może to być komórka z formułą, gdyż wynik formuły nie może być formatowany na poziomie znaków, a tylko jako całość). Powinien to być zakres jednokomórkowy. Drugi argument oznacza separator, zadeklarowany jako Variant, może to być zarówno stała tekstowa niesformatowana, jak i adres komórki z tekstem, jak również tekst pusty, jeśli nie chcemy oddzielać danych separatorem. Dalej mamy dane do połączenia, zadeklarowane jako tablica parametrów (z dowolną liczbą elementów). Można tu podać zarówno adresy pojedynczych komórek, jak i adresy zakresów (zakresy są odczytywane wierszami), jak też stałe tekstowe (nie przewidziałem obsługi stałych tablicowych).
Oczywiście nie zrobimy tego samą funkcją UDF, gdyż funkcje te nie mogą zbyt wiele poza wykonywaniem zwykłych obliczeń. Ten temat też był już dyskutowany. W każdym razie na pewno funkcja UDF nie może swobodnie modyfikować właściwości Characters. Takie operacje są dostępne tylko dla makroinstrukcji. Żeby osiągnąć swój cel musimy wykorzystać mechanizm zdarzenia Change, aby procedura jego obsługi wykonała to, czego sama funkcja nie ma prawa wykonać. Rolą funkcji jest przepisanie wszystkich danych rozdzielonych separatorami do jednej tablicy typu Variant i umieszczenie jej wraz z adresem docelowym w zmiennych publicznych (to funkcja może zrobić). Po zakończeniu edycji komórki z formułą, generowane jest zdarzenie Change, w przebiegu obsługi którego wykonane zostaną przewidziane operacje konstrukcji sformatowanego tekstu i umieszczenie go w komórce docelowej. Dopiero taki „tandem” zapewni nam rozwiązanie problemu.
Szczegóły realizacji mogą być różne. Przedstawiam dwa warianty. Pierwszy z nich można określić mianem funkcji „statycznej”, która będzie się przeliczać tylko po edycji formuły funkcji, a nie będzie reagować na zmiany argumentów. Dzięki temu kod będzie nieco prostszy, wykonanie szybsze, a wyniki będzie można łatwo skasować w razie potrzeby. Drugi wariant to funkcja „dynamiczna”, przeliczająca się automatycznie po zmianie danych. W tym wariancie funkcja działa nieco wolniej, a ponadto nie da się usunąć wyniku aktywnej formuły (bo on się automatycznie odtwarza).
W wariancie „statycznym” jest to jeden zestaw danych, odnoszący się do komórki z formułą, po zakończonej właśnie edycji. W wariancie „dynamicznym” trzeba utworzyć tablicę danych, odnoszących się do wszystkich komórek z formułami, podlegającymi przeliczeniu. Gdy dane zostaną przygotowane przez funkcję, procedura zdarzeniowa może je połączyć i umieścić w komórce docelowej (w wariancie „statycznym”) lub komórkach docelowych (w wariancie „dynamicznym”). Funkcja nie musi zwracać żadnej szczególnej wartości, u mnie zwraca wartość PRAWDA, aby potwierdzić, że nie było błędu wykonania. W pierwszym wariancie ograniczyłem modyfikację wyniku tylko do przypadków, kiedy komórka z formułą funkcji jest poddawana edycji, a w drugim przypadku wprowadziłem dodatkową zmienną, która kontroluje przeliczanie funkcji (które jest automatycznie generowane programowo) i pomija je gdy nie jest potrzebne. Przeliczanie trwa stosunkowo długo, bo każdy znak musi być opracowany osobno. I chociaż odświeżanie ekranu jest wyłączone, to jednak zapis do komórek trwa relatywnie długo.
Funkcje umieściłem w osobnych plikach, aby różnice między tymi rozwiązaniami były bardziej czytelne. Gdyby jednak zaszła konieczność korzystania z obu naraz, to można nadać im różne nazwy i po niezbędnych modyfikacjach kodu umieścić w jednym pliku. Jeśli nie zamierzamy wykorzystywać wszystkich atrybutów znaków, możemy uprościć procedurę Wstaw (jest taka sama w obu rozwiązaniach).
Połącz_teksty_sformat_funkcją_stat_F.xlsm
|
Pobierz Plik ściągnięto 534 raz(y) 23.59 KB |
Połącz_teksty_sformat_funkcją_dyn_F.xlsm
|
Pobierz Plik ściągnięto 510 raz(y) 25.54 KB |
|
|
| ID posta:
333402
|
|
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|
Strona uĹźywa plikĂłw cookies.
Kliknij tutaj, Ĺźeby dowiedzieÄ siÄ jaki jest cel uĹźywania cookies oraz jak zmieniÄ ustawienia cookie w przeglďż˝darce.
KorzystajÄ
c ze strony uĹźytkownik wyraĹźa zgodÄ na uĹźywanie plikĂłw cookies, zgodnie z bieĹźÄ
cymi ustawieniami przeglÄ
darki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe
|