GRY-Online.pl --> Archiwum Forum

Excel - prośba o pomoc

26.01.2011
00:40
[1]

Saul Hudson [ Legend ]

Excel - prośba o pomoc

Witam,

Podczas robienia projektu na zaliczenie utknąłem w pewnym miejscu.
2 kolumny mają za zadanie wskazać 2 sygnały - kupna i sprzedaży. Nie są one przypisane do poszczególnych wierszy, zmieniają się one w zależności od wybranych wcześniej wartości. Wszystko jest ok jeśli ostatnim* sygnałem jest sygnał sprzedaży (S). Problem pojawia się, gdy ostatnim* sygnałem jest kupno (K). Nie umiem wyeliminować tych wartości, tak aby liczenie kończyło się na sygnale S.
Czy jest na to jakiś sposób bez użycia makr? A jeśli nie, to czy ktoś orientuje się jak skonstruować taki mechanizm?

* ostatni sygnał w sensie chronologicznym, natomiast w tabeli ostatni sygnał jest na górze (start na dole tabeli).

Z góry dziękuję za wszelką pomoc.


Excel - prośba o pomoc - Saul Hudson
26.01.2011
00:47
[2]

Narmo [ nikt ]

Funkcja JEŻELI. Sprawdzasz komórkę w poprzednim wierszu, jeżeli równa się ona S robisz jedną rzecz, jeżeli się nie równa, to inną. Ale jeżeli dobrze pamiętam, to komórki mają określoną "pojemność", więc nie można kombinować ze zbyt długimi formułami.

26.01.2011
00:58
[3]

Saul Hudson [ Legend ]

Funkcja jeżeli nie przejdzie. W kolumnie z sygnałami występują w różnej ilości (w zależności od wcześniej wybranych wartości) sygnały S i K. Chodzi o to, że ostatnia kolumna ma się zsumować, a jeżeli ostatnim sygnałem jest K to niepotrzebnie pomniejsza się wyliczona suma.

26.01.2011
09:27
[4]

Widzący [ Legend ]

Nie potrafię niczego wydumać z tej tabelki. Dla celów próbnych rób tabelki mieszczące się na ekranie, łatwiej znaleźć sens.
Funkcja ORAZ jest lepsza do porównywania wielu komórek ze wzorcem gdyż JEŻELI ma bardzo ograniczoną liczbę zagłębień. Do wyszukania ostatniego K możesz użyć funkcji L konwertującej chronologię do wartości i funkcji MAX dla znalezienia ostatniej wg. chronologii, jeżeli jest to K to eliminujesz z sumowania jeżeli S to sumujesz całość.

26.01.2011
09:39
[5]

pablo397 [ sport addicted ]

szczerze mowiac to w ogole nie zrozumialem o co chodzi - ale jesli funkcja JEŻELI nie przechodzi - moze warto sprobowac w visual basicu - jest dosyc prosty - jak wytlumaczysz lopatologicznie to sie zastanowie co by tu wykombinowac :)

na szybko - jakas pentelka w VS plus ELSE? przeleci ona wszystkie wiersze i posprawdza Twoje warunki - nie wiem sam, bo z rysunku nie moge nic wywnioskowac (albo jeszcze sie nie rozbudzilem :P)

26.01.2011
09:45
[6]

blackhood [ sentimental fool ]

Też próbowałem coś zrozumieć z tego obrazka, najlepiej chyba jak byś plik wrzucił.

26.01.2011
10:23
[7]

Saul Hudson [ Legend ]

Ok, widzę że z mojego opisu nici.
Jeszcze raz

Tutaj jest plik -> zakładka np. KGHM


W komórkach E1 i E2 mam zmienne które wpływają na całą tabelę. Poruszają się się po swojej kolumnie w zależności od E1 i E2. Teraz tak, tabela zaczyna się na dole więc ostatni sygnał przy dacie 30-06-2010 jest pierwszym z punktu widzenia tabeli. Chodzi o to, że ostatnim sygnałem ma być S, ale jeśli pobawimy się w komórkami E1 i E2 to czasem wyskakuje że ostatni sygnał to K, który nie powinien być brany pod uwagę. Kolumna I odpowiada za sumowanie sygnałów kupna i sprzedaży. Powinna być tak zrobiona, żeby kończyła pobieranie danych na ostatnim S. Przykładowo jak ustawi się E1=23 i E2=28 to sygnały K będą ostatnie (góra tabeli) i dadzą wynik ujemny, który pomniejszy sumę wszystkich poprzednich sprzedaży i kupn.
Jeszcze dla lepszego zobrazowania - jeśli np. E1=21 a E2=22 to wszystko jest ok, bo S jest ostatnie (początek tabeli).

Mam nadzieję, że to coś bardziej przybliży.

26.01.2011
10:53
[8]

blackhood [ sentimental fool ]

Strasznie to zagmatwane :)
Dlaczego nie możesz w kolumnie I wstawić warunku, żeby mnożyło komórki, jeżeli wartość z E czy F <>"K" ? Czy wcześniejsze K są potrzebne, a tylko ostatnie nie?

26.01.2011
10:57
[9]

Saul Hudson [ Legend ]

To "K" (może być ich kilka sąsiadujacych - jedno wyświetla wartość ujemną, pozostałe wartość zerową) które następuje po ostatnim "S" wędruje sobie po kilku wierszach. Jedno K wyświetla wartość ujemną, ale nie można jednoznacznie określić w której komórce ostatecznie wyląduje. I tu cały problem.

26.01.2011
11:08
[10]

blackhood [ sentimental fool ]

A w kolumnie I jest Ci potrzebna ta minusowa wartość? Jak nie, to można tam dać taki warunek, że jeżeli w komórce F będzie K i komórka H>0, to wtedy do I wstawić 0, chociaż nie, bo jak potem wystąpi jeszcze S, to to K powinno jednak być odjęte.

26.01.2011
14:43
[11]

blackhood [ sentimental fool ]

Ciężka sprawa, nie bardzo mam czas, ale pokombinowałbym z jakąś dodatkową kolumną, która by wyciągała dane z F i I, coś typu =JEŻELI(F5="K";JEŻELI(I5<0;-1;0);JEŻELI(I5>0;1;0)) jak to przeciągnąć na całość i zsumować, to przy scenariuszu, który Ci nie pasuje, czyli ostatnie K ujemne, suma tej kolumny powinna chyba dawać -1. Ale jak to wykorzystać? ;p

26.01.2011
14:45
[12]

pablo397 [ sport addicted ]

już sprawa rozwiązana - zrobiłem makro, które wykonuje wszystko co trzeba. troche toporne, bo trzeba ręcznie kliknąć na przycisk uruchamiający makro a poza tym przed przeliczeniem musi sprawdzić każdy ze 122 rekordów czy formuły sie zgadzają, co troche trwa - ale autor jest zadowolony :)

26.01.2011
15:02
smile
[13]

Saul Hudson [ Legend ]

Tak, potwierdzam.

pablo397 uratował mi dziś dupsko ;)
Jeszcze raz dziękuję.

26.01.2011
15:22
[14]

pablo397 [ sport addicted ]

poprawilem troche - gotowy kod jakby ktos ciekawy był, z przykładowego zeszytu PGE (2) - uruchamiany podczas zmiany wartości w komórkach E1,E2

****

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ThisWorkbook.Worksheets("PGE (2)").OnEntry = "DidCellsChange"

End Sub

Sub DidCellsChange()
Dim KeyCells As String
KeyCells = "E1:E2"

If Not Application.Intersect(ActiveCell, Range(KeyCells)) _
Is Nothing Then KeyCellsChanged

End Sub


Sub KeyCellsChanged()
zmienna1 = 5
Range("H5").Select
Do While Not IsEmpty(Range("H" & zmienna1).Value)
Range("H" & zmienna1).FormulaR1C1 = "=IF(RC[-2]=""K"",-RC[-1],RC[-1])"
zmienna1 = zmienna1 + 1
Loop

zmienna1 = 5

Do While Range("E" & zmienna1) = "K"
Range("H" & zmienna1) = 0
zmienna1 = zmienna1 + 1
Loop


Range("H5").Select

End Sub



****

krótki opis:

pierwsze dwie procedury zerżnąłem ze strony microsoftu i służą one do uruchomienia procedury głównej gdy nąstąpi zmiana w komórkach E1:E2.

główna procedura składa się z dwóch etapów:

1 etap - przywracanie wartości domyślnych formuły dla kolumny H

2 etap - zerowanie wartości w kolumnie H dla każdego rekordu, w którym kolumna E ma wartość "K" aż do pierwszej wartości "S".

po co pierwszy etap? znacząco on wydłuża działanie procedury, ale jest niezbędny, gdyż po zmianach wartości pól E1 lub E2 następują przesunięcia w kolumnie E wartości "K" lub "S" i należy przywrócić całą kolumnę E do stanu początkowego, żeby nie było przekłamań. jest to skutek działań drugiego etapu, który zmienia usuwa formułę z kolumn H i wstawia wartość 0 dla wartości "K" w kolumnie E. łopatologicznie mówiąc - po każdym uruchomieniu drugiego etapu nalezaloby od nowa otworzyc caly arkusz - pierwszy etap eleminuje ten problem.

jakby ktos obcykany byl - moze znajdzie lepszy sposob, bo moj jest dosyc powolny - za kazda zmiana w komorkach E1 lub E2 nastepuje parosekundowa przerwa na potrzeby makra. ale ze w sume nigdy nie umieszczalem VBA w excelu to jak na pierwszy raz jestem zadowolony :)

© 2000-2024 GRY-OnLine S.A.