Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 59271 Skopiuj do schowka 64. Łączenie tekstów sformatowanych inicjowane funkcją
Autor Wiadomość
Maciej Gonet
Excel Expert


Posty: 4037
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 105 raz(y) 23.59 KB

Połącz_teksty_sformat_funkcją_dyn_F.xlsm
Pobierz Plik ściągnięto 111 raz(y) 25.54 KB

ID posta: 333402 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

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