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: 64076 Skopiuj do schowka Makro plus wyrażenie regularne w celu wyszukania daty.
Autor Wiadomość
perla_nocy
Exceloholic


Posty: 102
Wysłany: 08-02-2019, 11:03   Makro plus wyrażenie regularne w celu wyszukania daty.

Witam,
zastanawiam się czy da się wpasować w makro wyrażenie regularne, które w danym ciągu znaków wyszuka mi datę, np.
"Zakup w dniu 2019/01/31" - po uruchomieniu makra w komórce obok wpisze "2019-01-31"
"Zapłata w dniu 31/01/2019 za.." - wyszuka i wpisze mi tylko datę "2019-01-31"

jak napisać takie wyrażenie regularne, np. dla różnych formatów daty tj. yyyy/mm/dd , dd/mm/yyyy itp? Będę wdzięczny za przykładowe makro.

Pozdrawiam

PS.
kiedyś korzystałem z takiego wyrażenia w notepad++
Kod:
".?(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01]).?"
ID posta: 362199 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 13:41   

Jeśli tylko takie dane to po co skomplikowany pattern?

Myślę, że dla podanych danych wystarczy pattern "\d\d/\d\d/\d{4}" lub "\d{4]/\d\d/\d\d"

Bo raczej nie ma np. "Zakup w dniu 1234/56/78" skoro dane jest poprawne
ID posta: 362216 Skopiuj do schowka
 
 
perla_nocy
Exceloholic


Posty: 102
Wysłany: 08-02-2019, 13:47   

masz rację, a jak taki pattern zastosować w makrze?

a i jeszcze taki przypadek daty - 2019/02/1 lub 1/02/2019 - różnie się czasem komuś wpisze :(
ID posta: 362217 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1303 razy
Posty: 4486
Wysłany: 08-02-2019, 13:50   

Moja propozycja makra zdarzeniowego bez wyrażeń regularnych. Trzeba dopasować do Twoich danych. W tej chwili działa w ten sposób, że po wpisaniu tekstu zwraca datę o 4 kolumny w prawo w tym samym wierszu. Akceptuje różne formaty dat, ale nie wszystkie. Poza tym w tekście może być tylko jeden ciąg od cyfry do cyfry, który jest interpretowany jako data. Czyli nie może być innych cyfr w tekście, ani liczb, które nie są datami.
Edit: zmieniłem kolejność elementów daty, bo ja mam odwrotnie.

Daty_Z_Tekstu.xlsm
Pobierz Plik ściągnięto 21 raz(y) 16.79 KB

Ostatnio zmieniony przez Maciej Gonet 08-02-2019, 13:56, w całości zmieniany 1 raz  
ID posta: 362218 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 13:53   

Dołącz plik bo nie można pisać w Notatniku.
ID posta: 362220 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 14:18   

Maciej Gonet napisał/a:
Moja propozycja makra zdarzeniowego bez wyrażeń regularnych.

zakup w dniu 7/02/19 w punkcie A -> 2019-02-07

Ale zakup w dniu 27/02/19 w punkcie A -> 2027-02-19 ;-)
ID posta: 362225 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1303 razy
Posty: 4486
Wysłany: 08-02-2019, 14:31   

Apollo, dlatego napisałem, że akceptuje różne formaty dat, ale nie wszystkie. Jeśli rok może być pomylony z dniem, należy pisać rok czterocyfrowo. Możliwych kombinacji jest sporo i trudno je wszystkie ogarnąć.
ID posta: 362227 Skopiuj do schowka
 
 
perla_nocy
Exceloholic


Posty: 102
Wysłany: 08-02-2019, 14:39   

co do roku, można przyjąć że zawsze będzie 4 cyfrowy :)
fajnie to działa Macieju ale jednak wygodniejsze byłoby makro dla zakresu z wyboru
i jest mały problem zdarzają się takie ciągi znaków:

"zapłata za 3 transakcje 2019/01/03"

więc pattern chyba byłby skuteczniejszy.
Ostatnio zmieniony przez perla_nocy 08-02-2019, 14:49, w całości zmieniany 3 razy  
ID posta: 362228 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 14:41   

Maciej Gonet napisał/a:
Apollo, dlatego napisałem, że akceptuje różne formaty dat, ale nie wszystkie. Jeśli rok może być pomylony z dniem, należy pisać rok czterocyfrowo. Możliwych kombinacji jest sporo i trudno je wszystkie ogarnąć.

Nie rozumiem. Jeśli pozwalasz na taki zapis "zakup w dniu 7/02/19 w punkcie A" to normalnie kiedy zakup przypada na dzień 27 to ktoś może wprowadzić "zakup w dniu 27/02/19 w punkcie A". Bo on nie rozumie dla czego może wprowadzić 12/02/19 a nie może 13/02/19.

Jeśli pozwalamy na różne zapisy ale nie wszystkie to trzeba wymienić niedozwolone przypadki, bo inaczej nie wiadomo, które są dozwolone a które nie. I tak na drugi dzień raczej nie będzie pamiętał.
ID posta: 362229 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1303 razy
Posty: 4486
Wysłany: 08-02-2019, 14:55   

Ja nie staram się poprawiać Excela, tylko próbuję wykorzystać jego funkcjonalność. Na etapie pisania tego makra zainteresowany nie podał jakie formaty dat wchodzą w grę. Pewne znaczenie ma też ustawienie systemowe formatu daty w komputerze użytkownika. Poza tym zakładam, że z tego będą korzystać inteligentni ludzie, którzy wprowadzą korekty tam, gdzie wynik będzie nieprawdopodobny. Można oczywiście przyjąć, że ograniczamy dopuszczalne formaty dat do określonych wzorców i wtedy wszystkie nie pasujące do wzorca będą od razu eliminowane. Ale to już jest sprawa wyboru użytkownika, ode mnie była tylko sugestia, jak sprawę można rozwiązać, a szczegóły zawsze można dopracować.
Do perla_nocy: przerobienie tego kodu na zakres z wyboru, to nie problem, sam możesz sobie przerobić, albo podać precyzyjnie, jak to ma działać, bo trzeba określić zakres danych do analizy i miejsce na wynik. Natomiast jeśli chodzi o inne cyfry w tekście, to o tym nie było mowy, i to już wymagałoby zmiany koncepcji, więc może apollo lub ktoś inny Ci napisze odpowiedni kod. Bo ja nie pracuję na co dzień z wyrażeniami regularnymi i nie chcę się teraz przez to przebijać.
Ostatnio zmieniony przez Maciej Gonet 08-02-2019, 15:06, w całości zmieniany 1 raz  
ID posta: 362231 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 15:03   

Skoro odbierasz w ten sposób to nie napiszę więcej.
ID posta: 362232 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1236 razy
Posty: 4306
Wysłany: 08-02-2019, 20:15   

perla_nocy napisał/a:
co do roku, można przyjąć że zawsze będzie 4 cyfrowy :)
...
zdarzają się takie ciągi znaków:

"zapłata za 3 transakcje 2019/01/03"

1. Dane muszą zawierać dzień, miesiąc i rok oddzielone myślnikiem, kropką lub ukośnikiem, w porządku "rok miesiąc dzień" lub "dzień miesiąc rok"
2. Rok musi być czterocyfrowy. Dzień i miesiąc mogą być jednocyfrowe lub dwucyfrowe.
3. Podany kod uwzględnia dane tylko od wiersza 2 do wiersza 1000 w kolumnie A. Jeśli trzeba to zmień w kodzie (A2:A1000)
4. Można wprowadzić dane do pojedynczej komórki lub hurtem skasować, wkleić dane do kolejnych komórek (np. skopiować skądś dużo danych i wkleić za jednym zamachem)
5. Kod ładuje wyniki do kolumny obok, dlatego With rng.Offset(, 1). Jeśli ma być do kolumny trzeciej licząc od kolumny z danymi to zmień na With rng.Offset(, 2) itd.
6. Kod nie bada poprawności danych. Jeśli jest "Zakup 1234/56/78" to zwraca 1234-56-78.
7. Kod jest w module Sheet1

Jestem otwarty na wszelkie uwagi.

Book2.xlsm
Pobierz Plik ściągnięto 19 raz(y) 22.26 KB

ID posta: 362241 Skopiuj do schowka
 
 
perla_nocy
Exceloholic


Posty: 102
Wysłany: 11-02-2019, 09:38   

Panowie,
serdecznie dziękuję Wam za pomoc, wykorzystam obydwa rozwiązania.
Apollo, dokładnie o to mi chodziło, dziękuję.
Gdy będę miał trochę więcej wolnego czasu przeanalizuję ten pattern
a tak przy okazji, macie może jakieś linki do tutoriali objaśniających stosowanie wyrażeń regularnych
w Excelu ?

Pozdrawiam :D
ID posta: 362335 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