logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] MS Excel 2010 - Obliczenie formuły zapisanej w sąsiedniej komórce

przemek1przemek 07 Cze 2020 13:23 627 20
REKLAMA
  • #1 18743161
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Witam,
    jak zmodyfikować kod aby wynikiem była funkcja wyszukaj.pionowo?
    próbowałem przy użyciu powyższego kodu, ale zwraca błąd run-time error 1004.
    tekst wpisuje w c1, w d1 powinna pojawić się funkcja.
    Załączam plik i proszę o pomoc.
    Załączniki:
    • Zeszyt1.xls (32.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 18743202
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Na arkushe zastap ; na , w C1
  • #3 18743221
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    dziękuje za odpowiedz, ale niestety nie działa wciąż pomimo zmiany.
  • Pomocny post
    #4 18743238
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    wtedy nie zastap tylko w makro FormulaLocal
  • #5 18743273
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    tym razem działa znakomicie.
    dziekuje.
  • #6 18743914
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Jeszcze jedno pytanie,
    jak przerobić kod

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$C$1" Then Exit Sub
    Range("D1").FormulaLocal = "=" & Range("C1")
    Range("C1").Activate
    End Sub

    żeby działał w zakresie wierszy 1-10?
  • REKLAMA
  • #7 18744428
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Napisałeś to niejasno, czy chodzi o zakres komórek C1:C10? I czy komórki będą zmieniane pojedynczo, czy po kilka naraz? Jeśli pojedynczo i jeśli ten zakres to można tak:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    Instrukcję Target.Select możesz przywrócić jeśli jest potrzebna.
    Załączniki:
    • Formuła_w_zakresie.xls (32.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #8 18744741
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Tak dokładnie to dla wszystkich komórek z zakresu c1:c10, o ile w danej komórce występuje tekst a nie liczba, zamienić ten tekst w kolumnie d na funkcje.
  • #9 18744870
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Mógłbyś być bardziej precyzyjny. To jest procedura zdarzeniowa, więc uruchamia się gdy zajdzie zdarzenie polegające na zmianie zawartości (treści) komórki w zakresie C1:C10. Chodzi o to czy te komórki będą wypełniane pojedynczo czy hurtem (np. przez kopiowanie). Teraz napisałeś tak, że nie wiem czy ta procedura ma się wykonać jednorazowo po zapełnieniu wszystkich komórek C1:C10, wtedy trzeba by było wywoływać ją przyciskiem lub skrótem klawiaturowym, czy ma się wykonywać natychmiast po dokonaniu zmiany w komórce (wtedy procedura zdarzeniowa).
    Ale taka procedura zdarzeniowa nie zadziała, jeśli w komórce jest działająca formuła i tylko jest przeliczana, a nie edytowana.
  • #10 18744957
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Nie mam dużego doświadczenia w vba, dlatego może mało precyzyjne słownictwo za które przepraszam.
    Myślałem o uruchomieniu procedury przy otwieraniu arkusza tj worksheet activate. Co do wypełniania kolumny c, będzie wypełniana hurtem.
  • #11 18745431
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Nie piszesz od razu, o co Ci dokładnie chodzi, a tu każdy szczegół ma znaczenie.
    Jeśli Twój skoroszyt zawiera tylko jeden arkusz, zdarzenie Worksheet_Activate nigdy nie zajdzie, bo jedyny arkusz jest zawsze aktywny. Dopiero gdy będą dwa lub więcej arkuszy to po przełączeniu z innego arkusza na pierwszy zajdzie to zdarzenie. Przy jednym arkuszu należy oprogramować zdarzenie Workbook_Open.
    W module uniwersalnym umieść procedurę:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    Wywołaj tę procedurę w zdarzeniach Workbook_Open (w module skoroszytu) i Worksheet_Activate (w module Arkusza1). To drugie będzie potrzebne, gdy będzie więcej niż 1 arkusz. Przy takim sposobie działania po zmianach w kolumnie C trzeba zapisać i zamknąć skoroszyt, a następnie otworzyć ponownie, żeby procedura się wykonała. Albo gdy będzie więcej arkuszy, można przełączyć na inny arkusz, a potem wrócić do pierwszego.
    Załączniki:
    • Formuła_w_zakresie2.xls (36.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #12 18745734
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    działa pięknie, niestety okazało się również ze nie mogę użyć WorksheetFunction.IsText ponieważ jednak nie wszystkie tekstowe komórki maja być zamienione na funkcje.
    Chce się zatem odnieść do komórek z błędem(N/D!, #AGR!), zmieniłem kod na
    If IsError(cel) Then
    ale niestety procedura nie działa. gdzie tkwi błąd?
  • #13 18745755
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Pokaż załącznik z tymi danymi i błędami. Skąd można wiedzieć dlaczego nie działa jak nawet nie opisałeś dokładnie jakie są dane i co to dokładnie znaczy "nie działa".
  • #14 18745792
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    dodaje załącznik, procedura ma zamienić tekst z kolumny C na formułę w kolumnie d ale tylko wtedy gdy w kolumnie f jest błąd #AGR!,#N/D!
    Załączniki:
    • Kopia Formuła_w_zakresie2.xls (40.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 18745848
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Mętnie to opisujesz, o co w tym chodzi?
    Czy chcesz testować dowolny błąd (funkcja IsError testuje dowolny błąd), czy tylko wskazane błędy? Jeśli wskazane, to jakie, bo nie ma błędu #AGR!, jest albo #ADR! albo #ARG!
    Poza tym to co proponujesz, jest moim zdaniem bez sensu, bo wprowadzasz do kolumny D to co już tam było, a błąd w kolumnie F też pozostaje bez zmiany.
    Kod ma zaledwie kilka linijek, a nawet nie zastanowiłeś się jak on działa.
    Jeśli poprzednio cel był w kolumnie C, a kopiowanie formuły było z C do D, to było tak:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    Teraz cel jest w F, a kopiowanie ma być nadal z C do D, więc przesunięcia (Offset) muszą się zmienić:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    Ale tak jak napisałem wcześniej nie widzę sensu w tej modyfikacji.
    Załączniki:
    • Kopia Formuła_w_zakresie2.xls (35.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 18747493
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    A gdybym wywoływał procedure kopiowania z kolumny C do D w Arkusz1 poprzez workscheet change ale komórek w zakresie a1:a6 arkusza 2 to jak do tego się zabrać? dodatkowo tylko zmieniony wiersz powinien się przeliczać tj zmiana w Arkusz2 A1 uruchamia kopiowanie formuły w Arkusz2 z C1 do D1.
    Załączniki:
    • Formuła_w_zakresie3.xls (36 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #17 18747577
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Jeśli nadzorowane zmiany mają być w Arkuszu2, to procedura Worksheet_Change powinna być umieszczona w module Arkusza2. W tej procedurze można odwoływać się do Arkusza1 bezpośrednio (przez nazwę kodową) albo pośrednio przez kolekcję Worksheets jako Worksheets(1) albo Worksheets("Arkusz1"). Przykładowy kod:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • Formuła_w_zakresie3.xls (36.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #18 18747806
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Każda zmiana w Arkusz2 A1(bez warunku isText) uruchamia kopiowanie formuły w Arkusz1 z C1 do D1 (ale tutaj już powinny się kopiować tylko jeżeli tekst). Proszę o poprawienie kodu, walczę z tym ale dociera do mnie jak mało wiem w temacie VBA.
    Załączniki:
    • Kopia Formuła_w_zakresie3-2.xls (39.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #19 18747844
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Zobacz, czy teraz jest to o co Ci chodziło.
    Target odnosi się do tego arkusza, w którym występuje zdarzenie i jest to odwołanie, a Target.Address jest tekstem adresu bez kwalifikatora arkusza, więc można go użyć w dowolnym arkuszu.
    Załączniki:
    • Formuła_w_zakresie3-2.xls (36.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 18747958
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    działa jak należy, teraz dopasuje do swoich potrzeb.
    Dużo się przy tym nauczyłem, za co dziękuje Ci bardzo.
  • #21 19672201
    przemek1przemek
    Poziom 7  
    Posty: 32
    Ocena: 1
    Rozwiązanie podał Maciej Gonet, dziękuje za pomoc

Podsumowanie tematu

✨ Użytkownik pyta o modyfikację kodu VBA w Excelu 2010, aby w komórce D1 pojawiała się funkcja WYSZUKAJ.PIONOWO na podstawie tekstu w C1. Po kilku próbach i błędach, w tym błędzie run-time error 1004, użytkownik otrzymuje pomoc w postaci zamiany separatorów oraz użycia właściwości FormulaLocal. W kolejnych wiadomościach użytkownik prosi o rozszerzenie kodu na zakres C1:C10 oraz o uwzględnienie błędów w kolumnie F. Ostatecznie, po wielu iteracjach, użytkownik uzyskuje działający kod, który kopiuje formuły z kolumny C do D, w zależności od zmian w arkuszu oraz błędów w innych komórkach.
Wygenerowane przez model językowy.
REKLAMA