Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

VBA Excel - zamiana tekstu w wielu komórkach

Natasza Romanova 19 Oct 2018 10:23 1467 5
  • #1
    Natasza Romanova
    Level 2  
    Dzień dobry!
    Nie znam się ni w ząb na programowaniu, a potrzebuję wykonać w Excelu szereg powtarzalnych czynności. Otóż: w kolumnie B, w każdym jej kolejnym wierszu, chciałabym zamienić wartość "x" na wartość "y". Wartość "y" będzie zmienna w zależności od od zawartości sąsiadującej komórki w kolumnie A, wartość x jest stała

    Np. w komórce B4 --> ciąg znaków ("x") powinien być zastąpiony ciągiem znaków z komórki A4 ("y");
    w komórce B5 --> ciąg znaków ("x") powinien być zastąpiony ciągiem znaków z komórki A5;
    itd. 300 razy dla każdego wiersza kolumny. Kolumn docelowo ze 20, ale to już inna rzecz.

    Zmiany te mają na celu stworzenie odwołań do konkretnej lokalizacji. O ile lokalizacja istnieje, wszystko jest ok. Natomiast jeśli lokalizacja, do której się odwołuję nie istnieje, chciałabym, żeby w komórce wpisana została wartość "0".

    Na razie tworzę zwykłe odwołanie:



    =SUMA('D:\FOLDER\PODFOLDER\[Plik źródłowy(zmienna nazwa).xlsx],Arkusz1(stała nazwa dla danej kolumny)'!$dana komórka Ark.1)

    i wstawiam do odpowiedniej komórki w kolumnie B. Działa, ale jest żmudne, nudne i człowiek dostaje oczopląsu po godzinie takiego 'kopiuj-wklej'. Pomyślałam, że skoro odwołuję się zawsze do tej samej komórki, to mogę sobie uzupełnić kolumnę jednym adresem, w którym będę zmieniać tylko nazwę pliku źródłowego. Nazwa pliku jest taka sama, jak zawartość kolejnych wierszy w kolumnie A.

    Wykonanie odwołań to banał. Jeśli chodzi o pojedynczą zamianę jednej frazy na drugą, też nie stanowi to problemu. Problemem jest dla mnie dopiero zmuszenie programu do samodzielnego wykonania tej czynności w wierszu poniżej. Nagrywanie makra jakoś nie zdaje egzaminu :/ Zwyczajnie nie wiem, od czego zacząć.

    Niestety nie znam składni VBA i mam obawy, że mniej czasu zajmie mi wykonanie tego na piechotę, niż samodzielne stworzenie działającego makra. Albo po prostu źle się do tego zabieram. Może istnieje funkcja, która zrobi to za mnie?

    Byłabym wdzięczna za sugestie albo jakąkolwiek próbę rozwiązania tej skomplikowanej dla mnie zagadki.
  • #3
    PRL
    Level 40  
    'Byłabym wdzięczna za sugestie'

    Moja sugestia jest taka, czy Ty chcesz importować dane z wielu plików, które znajdują się w określonej lokalizacji?
    Tak zrozumiałem Twoją wypowiedź.
  • #4
    Maciej Gonet
    VBA, Excel specialist
    Ja też się zastanawiałem nad tą sumą. Czasem daje się to na zabezpieczenie przed tekstem lub pustym tekstem w komórce źródłowej, żeby zamienić to na zero.
    Podejrzewam, że przy tej liczbie plików raczej będą zamknięte, dlatego ja proponuję rozwiązanie nie tak proste, ale mam nadzieję skuteczne przy zamkniętych plikach.

    Najpierw trzeba utworzyć odpowiednie formuły z odwołaniami w formie tekstowej, wykorzystując układ tabeli do kopiowania. Byłaby to formuła tego rodzaju:
    Code: text
    Log in, to see the code
    Taka formuła da się kopiować i powinna wygenerować wszystkie potrzebne wzory w postaci tekstów. W załączniku jest to Arkusz2.
    Następnym krokiem jest zamiana tych formuł tekstowych na właściwe formuły. Można to zrobić przez zaznaczenie całego obszaru, skopiowanie go np. Ctrl+C, a następnie wklejenie specjalne w to samo miejsce jako wartości. Uzyska się wyniki jak w Arkuszu3, czyli np.
    Code: text
    Log in, to see the code
    czyli właściwie już to o co chodzi, tylko to jeszcze nie są działające formuły, a jedynie ich teksty.
    Żeby zamienić je na działające formuły, trzeba użyć na przykład narzędzia "Znajdź i Zamień", zamieniając znak "=" na "=". Znak ten występuje na początku każdej formuły. Działanie to może się wydawać bez sensu, ale powoduje ono jak gdyby przywołanie do edycji każdej formuły i jej ponowne zatwierdzenie, co skutkuje "uaktywnieniem" formuły. I wszystko byłoby pięknie, gdyby autorka postu nie napisała, że niektóre odwołania mogą nie istnieć. To powoduje problem, bo w takim przypadku narzędzie "Znajdź i zamień" się zatrzyma i wyświetli monit o wskazanie właściwego pliku. Można wtedy kliknąć Anuluj, ale i tak trzeba od nowa zaznaczyć pozostałe komórki i powtarzać procedurę. Wreszcie otrzymamy rezultat, jak w Arkuszu4. Ale to ma sens gdy tych plików brakujących jest mało i można sobie z tym poradzić. Niestety nie znam sposobu, jak z poziomu Excela zablokować te monity.
    Można to natomiast zrobić dość łatwo w VBA, za pomocą właściwości DisplayAlerts. Dlatego jeśli tych plików brakujących jest dużo, lepiej czynności te od Arkusza2 wykonać za pomocą makra.
    Same formuły w Arkuszu2 przygotowujemy tak samo, następnie zaznaczamy wszystko lub wszystkie formuły i uruchamiamy takie makro:
    Code: text
    Log in, to see the code
    Nie jest to demon szybkości, bo działa na komórkach, ale powinno spełnić swoje zadanie (makro można uruchomić z okienka Makra albo Alt+F8) i wybrać nazwę BezKom. Wynik powinien być taki jak w Arkuszu5. W tej chwili są tam same zera, bo nie ma plików źródłowych.
    Proszę sprawdzić i dopasować do swoich danych.
    Plik dołączam w formacie .xls, bo forum nie przyjmuje formatu .xlsm. Trzeba go sobie zapisać jako .xlsm, bo jest używana funkcja JEŻELI.BŁĄD, która w .xls nie działa.
  • #5
    Natasza Romanova
    Level 2  
    Prot wrote:
    Witam!
    Zupełnie niezrozumiałe jest po co wprowadzasz do swojej formuły funkcję Suma() :?:
    Jeśli masz otwarty :!: plik odwołania zewnętrznego (...)


    No właśnie mam zamknięty. Plików odwołania jest milion i teoretycznie mogę je wszystkie otworzyć, ale to chyba bez sensu.
    Użyłam SUMY, gdyż ADR.POŚR wywalał mi błędy.

    PRL wrote:

    (...) czy Ty chcesz importować dane z wielu plików, które znajdują się w określonej lokalizacji (...)


    Tak właśnie chcę zrobić. Lokalizacja jest wspólna, zmieniają się tylko pliki, z których wyciągam dane.

    Dzięki za sugestie, biorę się za działanie :)