Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[EXCEL] - Warunkowa zmiana wartości pola tekstowego w na podstawie ciągu znaków

03 Sie 2014 14:09 1953 10
  • Poziom 9  
    Witam
    Szukam pomocy do obróbki zestawienia leków w następujący sposób:
    [EXCEL] - Warunkowa zmiana wartości pola tekstowego w na podstawie ciągu znaków

    Poszukuję programu albo skrytpu, który przeszukałby kolumnę H i jeśli znalazłby w komórce ciąg znaków zawieracych np. Polocaina 5% to żeby zamienił go na Polocainum Hydrochloricum 5%, a w komórkę w kolumnie G wstawił wartość 57. Istotne jest, żeby brane pod uwagę były wszystkie wyrażenia z komórki kolumny H, tzn. żeby można było zdefinoować, że pole zawierające ciąg znaków Polocaina i 5 (bez względu na znak pomiędzy nimi, bo to może być spacja, myślinik albo kropka).
    Oczywiście chciałbym mieć możliwość definiowania jakie ciągi znaków mają być brane pod uwagę i na co zmieniane (akurat zawsze będzie tak, że będą to wyrażenia z kolumny L wstawiane do kolumny H i wartości z K wstawiane do G).
    Nie znalazłem podobnego przykłądu na forum, także prosiłbym o pomoc :)
  • Poziom 33  
    Dzień dobry,
    Proszę opisać dokładnie jak to ma działać, a najlepiej załączyć arkusz z przykładem. W tej chwili widzę dwie kolumny niepowiazanych ze sobą nazw. Powiedzmy, że chcemy szukać w kolumnie H Polocainy. Skąd program ma wiedzieć czym tę nazwę zastąpić skoro odpowiedni zamiennik jest w kolumnie L w zupełnie przypadkowym miejscu? Czy za każdym razem ręcznie będzie Pan wskazywał co na co zamienić (lista wyboru?).
    Jak ma wyglądać to definiowanie znaków między nazwą a liczbą, czy to ma być konkretny znak, czy jeden dowolny znak, czy dowolna liczba znaków?
    Pozdrowienia
  • Poziom 9  
    Dzięki za odpowiedź. Generalnie dane z kolumn L i K mogą znajdować się w zupełnie innym pliku, nie wiem do końca jak to ująć, 'na chłopski rozum' to program powinien przeprowadzić taki algorytm (na przykładzie chociażby tej polcainy):

    IF ciąg znaków w komórce np. H20 zawiera "Polcaina" AND "5" THEN zamień ciąg znaków w tej komórce na "Polocainum Hydrochloricum 5%" AND w komórce G20 (czyli po lewej stronie od nazwy) wstaw liczbę 57

    Istotne jest, żebym mógł sam definiować ten warunkowy ciąg znaków (może być w oddzielnym pliku definiowany) i to na co ma zostać zamieniony, żeby nie musiał odpowiadać dokładnie całej nazwie (tzn jak zdefiniuję ciąg znaków "polca" to też znajdzie), program nie musi przeszukiwać tylko kolumny H bo może cały plik excela (chociaż np. ciąg znaków zawierający "polcaina" będzie w zasadzie znajdował się tylko w kolumnie H). Nie chcialbym, żeby po znalezieniu pojawiała się rozwijana lista wyboru, tylko, żeby plik został przeskanowany na raz i pozamieniał z automatu.

    Dodano po 14 [minuty]:

    Najlepiej gdyby dane do zmiany były pobierane z pliku tekstowego albo z excela (dla powyższego przykładu w komórce A1 byłoby "Polcaina" w B1 "5" w C1 "Polocainum Hydrochloricum 5%" a w D1 "57"
  • Poziom 33  
    No to mamy wreszcie pierwszy konkret: w arkuszu Excela w komórce A1 jest "Polcaina" (tej nazwy nie znajdzie, bo w danych jest "Polocaina", ale listy rozwijanej Pan nie chce), w B1 jest "5", w C1 jest "Polocainum Hydrochloricum 5%", w D1 jest "57". I co dalej?
    Co teraz przeszukujemy i czego dokładnie szukamy? Skoroszyt, arkusz, zakres w arkuszu? Jak zdefiniowany? Przeszukujemy coś (skoroszyt, arkusz, zakres) i szukamy komórki, która zawiera najpierw tekst z komórki A1, a dalej liczbę/tekst z komórki B1. Teraz mamy to zamienić na zawartość C1. Ale co zamienić? Całą zawartość komórki, czy fragment tekstu zaczynający się od "Polcaina" i kończący się gdzie?
    Dalej do komórki położonej na lewo od tej, w której dokonano zamiany wpisujemy liczbę z D1.
    I co dalej? Przeszukujemy dalej, czy kończymy po jednorazowej zamianie?
    I co dalej? Kończymy i czekamy aż w A1:D1 pojawią się nowe dane?
    Czy mamy już następne dane w komórkach A2:D2?
    Co robić gdy tekst nie zostanie znaleziony? Albo gdy będzie znaleziony kilka razy? Czy ma być jakiś komunikat?
    Proszę to dobrze przemyśleć, bo komputer za Pana myśleć nie będzie.
    Pozdrowienia.
  • Poziom 9  
    Przyjmijmy,że zebrane dane (te do zmiany, kolumna H, chodziło o Polocainę w komórce A1, wkradła się literówka) są w Arkuszu1, a dane A1,B1,C1,D1 są w Arkuszu2. Przeszukujemy cały Arkusz1 i zamieniamy wszystkie znalezione pozycje według danych wpisanych Arkuszu2, jeśli znajdzie ciąg znaków z A1 to zamienia cała komórkę na dane z C1, później do porównania i zmiany są brane dane z A2,A3 itd. (i zmieniane kolejno na C2,C3 itd., wiadomo). Wszystkie dane w Arkuszu2 są już wcześniej zdefiniowane, jeśli tekst nie zostanie znaleziony to zostawiamy komórkę niezmienioną.

    Dodano po 14 [minuty]:

    Sytuacja, gdy tekst znajdize się więcej niż raz w jednej komórce się nie zdarzy, ale jeśli trzeba by to określić to może również zostawić komórkę bez zmian.
  • Poziom 33  
    Dobry wieczór,
    W załączniku propozycja makra, która powinno spełniać założenia. Przyjąłem, że pomiędzy tekstem z kolumny A a liczbą z kolumny B może być 1 dowolny znak. Proszę sobie dopasować do swoich danych.
    W Arkuszu2 wzorce do zamiany zaczynają się w komórce A1 i dalej powinny wypełniać kolejne wiersze. Pusta komórka w kolumnie A kończy działanie makra.
    Procedurę uruchamia się przyciskiem w Arkuszu2, procedura kończy działanie w Arkuszu1.
    Jest tylko elementarna obsługa błędów, przywracająca odświeżanie ekranu, bo nie było danych do testowania, więc nie wiem, jakiego rodzaju błędy mogą wystąpić. Może Pan sobie to rozbudować według potrzeb.
    Pozdrowienia.
  • Poziom 9  
    Panie Macieju, serdeczne podziękowania, zrobiłem wstępną próbę i wygląda na to, że makro spełnia dokładnie moje oczekiwania :)) Jutro wprowadzę pełne dane do Arkusza2 i zobaczę jak się wtedy zachowa skrypt. Parę linijek tekstu co mieisąc zaoszczędzi mi ze 2 godziny roboty.
    Gdyby Pan miał chwilę i podesłał jeszcze jedną zmodyfikowaną wersję, w której do kolumny po prawej stronie od nazwy wstawiana byłaby wartość z komórki E1,E2 itd., w którym znalazłyby się ceny leków (do dwóch miejsc po przecinku).

    I proszę podesłać nr konta, "duże piwo" się należy ;)
    Pozdrawiam
  • Poziom 33  
    Dzień dobry,
    Makro jest bardzo proste, więc jakby Pan poświęcił chwilę na jego analizę, to sam by Pan doszedł, co trzeba dopisać.
    Po linii:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    wystarczy wstawić:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Oczywiście w Arkuszu1 musi być przewidziane miejsce na wprowadzanie tych cen.
    Pozdrowienia.

    P.S. Forum nie jest nastawione na zarobek, tylko na wymianę doswiadczeń i naukę.
  • Poziom 9  
    Witam
    Jeszcze raz bardzo dziękuję. Sprawdziłem dzisiaj dokładnie i w zasadzie wszystko jest ok, natomiast czy dałoby się ewentualnie dla kolumny A wyłączyć kontrolę wielkości liter ? Czy jest też szansa, aby wartości z kolumny B były brane pod uwagę niezależnie w jakiej odległości znakowej byłyby od ciągu znaków z pola A ?
    Pozdrawiam
  • Poziom 33  
    Dobry wieczór,
    Rezygnacja z kontroli wielkości liter sprowadza się do zamiany liter szukanego tekstu i wzorca na wielkie litery za pomocą funkcji UCase.
    Wariant z dowolną odległością między nazwą leku z kolumny A a liczbą z kolumny B można uzyskać zmieniając we wzorcu "?" (znak zapytania), który zastępuje 1 dowolny znak gwiazdką "*", która zastępuje dowolny ciąg znaków. Tylko tu musi Pan uważać, żeby jednoznacznie określić wzorzec. Bo proszę pamiętać, że jeśli będzie Pan szukał jako wzorca cyfry "5", to ten wzorzec będzie też znaleziony w liczbie 15, 50, czy 2,5.
    Pozdrowienia.
  • Poziom 9  
    Dzięki, wszystko działa tak jak należy. Pozdrawiam