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

Pytanie o formułe. Zliczanie komórek. Trzy warunki.

mocuk 27 Maj 2011 22:22 2418 14
  • #1 27 Maj 2011 22:22
    mocuk
    Poziom 9  

    Witam mam taki problem. Chciałbym napisać funkcję, która zliczałaby mi komórki, które są żółte, drugi warunek: tylko te z roku 2011 i trzeci: tylko te przy których jest litera np. "z".
    Zliczanie ilości komórek po kolorach wziąłem z innego tematu. Robi się to przez:

    Code:
    Function LiczKolory(zakres As Range, kolor As Integer)
    
    For Each kom In zakres
      If kom.Interior.ColorIndex = kolor Then
        LiczKolory = LiczKolory + 1
      End If
    Next
    End Function

    Ale za nic nie mogę dodać aby liczyło dodatkowo wg tego drugiego i trzeciego warunku. Proszę o pomoc.

    0 14
  • #2 27 Maj 2011 22:38
    adamas_nt
    Moderator Programowanie

    Jeśli kryteria są stałe to kombinuj w ten deseń

    Code:
    If kom.Interior.ColorIndex = kolor And Year(kom.Value) = 2011 And kom.Offset(0, 1) = "z" Then
    Możesz też dopisać je do listy argumentów funkcji i wywoływać je z czterema (zakres;kolor;rok;znak).

    0
  • #3 27 Maj 2011 23:01
    mocuk
    Poziom 9  

    Czyli mam rozumieć że nowy kod miałby wyglądać w ten sposób:

    Code:
    Function LiczKolory(zakres As Range, kolor As Integer)
    
    For Each kom In zakres
     If kom.Interior.ColorIndex = kolor And Year(kom.Value) = 2011 And kom.Offset(0, 1) = "z" Then
        LiczKolory = LiczKolory + 1
      End If
    Next
    End Function

    A jeśli chodziłoby mi o to, że rok może się zmieniać tak jak ta literka, bo nie zawsze będę miał 2011 i literę "z", czasem te parametry będą mi się zmieniać. Jak wtedy miałby wyglądać ten kod?

    0
  • #4 27 Maj 2011 23:36
    adamas_nt
    Moderator Programowanie

    Trzeba dopisać argumenty...

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Wywołanie:

    Pytanie o formułe. Zliczanie komórek. Trzy warunki.

    0
  • #5 28 Maj 2011 11:07
    mocuk
    Poziom 9  

    Sprecyzuję dokładnie, bo jeszcze nie mam gotowego formularza do zliczania, a może byc tak że pojawi się więcej warunków. Chciałbym, żeby jedna formuła po prostu zliczała mi tylko żółte biorąc pod uwagę rok i literkę raz "z", raz "a", raz "o" w zależności co chcę policzyć, następna formuła, żeby zliczała mi żółte biorąc pod uwagę miesiąc (bo chciałbym sprawdzić sobie ile było żółtych w danym miesiącu - w zależności od litery "z", "a" lub "o"). Jeśli chodzi o datę, którą miałoby brać to najpierw z "rzeczywisty termin realizacji", jeśli nie byłoby go w komórce, to żeby liczyło wg daty z "termin realizacji". Na dole załączam uproszczony formularz, o który by mi chodziło.

    Pytanie o formułe. Zliczanie komórek. Trzy warunki.

    Aha i czy każdorazowo trzeba włączać daną funkcję i przyciskać enter żeby zliczyło na nowo, czy da się to jakoś zmienić?
    Z góry przepraszam, że tak męczę.

    0
  • #6 28 Maj 2011 18:27
    adamas_nt
    Moderator Programowanie

    Szybciej byłoby gdybyś sprecyzował od razu...
    Zerknij do załącznika, przetestuj (zwróć uwagę na procedurę zdarzeniową arkusza), dostosuj do własnych potrzeb.

    0
  • #7 28 Maj 2011 19:36
    mocuk
    Poziom 9  

    Wszystko ok, tylko dalej nie mogę zliczyć wg miesięcy. Chodzi o to, że chciałbym sprawdzić ile w danym miesiącu było żółtych. Pojawił się też inny problem, który widać na załączonym obrazku, w L9 wpisuję funkcję i nie chce mi liczyć.
    Pytanie o formułe. Zliczanie komórek. Trzy warunki.

    0
  • #8 28 Maj 2011 20:51
    adamas_nt
    Moderator Programowanie

    Nieprawidłowo zapisujesz daty. Czy dobrze ustawiłeś przesunięcie (offset), itd, itp.
    W pierwszym poście mowa była o roku, teraz miesiąc. Nie lepiej gdybyś załączył ten plik z opisem finalnej wersji argumentów?

    0
  • #10 29 Maj 2011 10:26
    adamas_nt
    Moderator Programowanie

    Trochę za dużo zamieszania jak na funkcję VBA. Może lepiej kilka kolumn pomocniczych, prosta funkcja i formuła Excela? Wydaje się prościej...

    0
  • #11 29 Maj 2011 16:50
    mocuk
    Poziom 9  

    wszystko ok, tylko, że litery "o", "z", "a" mogą się zmieniać między sobą jako, że (o - otwarte, a - anulowane, z - zakończone: odnosi się do projektu). Do tego w dokumencie docelowym będą występować 2 kolory, żółty i zielony, ale chodzi mi tylko o liczenie tylko tego żółtego. To co napisałeś jest dobrze, ale wolałbym, żeby nie było aż tyle funkcji, bo osoba która będzie prowadzić ten dokument jest "zieloną" dziewczyną i raczej tego nie ogarnie, tym bardziej, że z tego co widzę, będzie trzeba dużo zmieniać w tych funkcjach w zależności od tego co chce się osiągnąć.
    Możesz mi powiedzieć co oznacza: e2k3 i e2k7?
    Ta formuła: =liczkolory(B2:B7;6;2011;"z"), była dobra tylko trzeba jakoś zmieniać żeby uwzględniało litery ("o", "z", "a") w wybranej kolumnie przeze mnie.
    Trzeba by było tylko napisać funkcję taką samą jak wcześniejszą tylko, żeby brała pod uwagę jeszcze miesiące.
    Tą formułę: =liczkolory(B2:B7;6;2011) wykorzystałbym do liczenia wszystkich żółtych.

    0
  • Pomocny post
    #12 29 Maj 2011 18:14
    adamas_nt
    Moderator Programowanie

    Uprę się jednak przy funkcjach wbudowanych. Zrobiłem tabelkę wyników, gdzie argumenty zmieniasz w trzecim wierszu arkusza(pierwszy tabelki).
    W następnym wierszu masz wyniki wg argumentów, dalej bez uwzględnienia miesiąca, w trzecim bez roku i miesiąca, w czwartym bez koloru. I można tak dopisać wszystkie możliwości.
    Zmieniasz kod (literkę), dusisz Enter i masz przeliczone wyniki.
    Kolumny pomocnicze ukryłem, żeby nie raziły w oczy.

    0
  • #13 29 Maj 2011 22:16
    mocuk
    Poziom 9  

    Wielkie dzięki, wszystko śmiga jak ta lala :) Póki co nie mam jeszcze finalnego excela w którym chcę wykorzystać te funkcje, więc będę musiał wszystko jeszcze dostosować i wtedy mogą pojawić się jeszcze jakieś pytania :)

    0
  • #14 03 Cze 2011 14:13
    mocuk
    Poziom 9  

    mam pytanie, bo widzę, ze wpisałeś jakieś kody w Visual Basic i funkcje działają mi tylko w tym arkuszu który wysłąłeś, czy można zrobic tak aby działało to we wszystkich, czy musze do każdego te kody wpisywać. Arkusze chciałbym móc tworzyć w każdej chwili jak mi się skończą, lub dla różnych osób.
    Normalny kod mam np. taki:

    Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.CalculateFull
    End Sub

    w arkuszu który mi wysłałeś jest taki:
    Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.CalculateFull
    If Target.Address = "$O$3" Then
      Target.Interior.ColorIndex = Target.Value
    End If
    End Sub

    O co chodzi z tym $O$3?
    wpisane jest też takie coś:
    Code:
    Function CzyKolor(kom As Range, kolor As Integer)
    
      CzyKolor = IIf(kom.Interior.ColorIndex = kolor, 1, 0)
    End Function

    rozumiem że to pod funkcję czykolor.

    Aha i zauważyłem, że w Office 2002, wszystkie te funkcje zmineiają się na #LICZBA, wiesz co może być powodem?

    0
  • #15 03 Cze 2011 23:49
    adamas_nt
    Moderator Programowanie

    mocuk napisał:
    Aha i zauważyłem, że w Office 2002, wszystkie te funkcje zmineiają się na #LICZBA, wiesz co może być powodem?
    Spróbuj precyzyjniej zdefiniować zakresy w formułach. Zamiast Np "K:K" zrób "K3:K50"

    W komórce O3 definiujesz Nr koloru, więc dodałem podgląd: 6-komórka żółknie, 3-czerwienieje, itd. Oczywiście całą gałąź If-End If można wywalić bez szkody dla funkcjonowania wyliczeń.

    Przy stosowaniu funkcji użytkownika, a takie tylko działają na kolorach, trzeba jakoś wymusić przeliczanie formuł. Stąd tyle zabiegów...

    0