Wpis z mikrobloga

Mam dany zestaw przedziałów dat, np.: od 1.03.2019 do 17.03.2019 i tak kilkadziesiąt przedziałów (czasami pokrywają się). Chciałbym sprawdzić ile dni pokrywa się z zakresem który sobie określę, np. od 1.01. do 31.03. Jakaś funkcja czy VBA? Kombinuję z Suma.warunków, ale chyba tak się nie da
#excel
  • 20
  • Odpowiedz
@Imputator: ale chcesz liczyć unikatowe wystąpienia danej daty czy ile razy wystąpiła ogółem? Czyli na przykład: wybierasz jako zakres tylko jeden dzień 01.01 i ten dzień występuje 5 razy w zestawie przedziałów - wynik ma być 5 czy 1?
  • Odpowiedz
@Polinik: @brak_nicku: przy jednorazowych datach dałbym radę, ale mam np.: 1.01-1.01, 12.01-14.01, 21-28.01 i tak kilkadziesiąt, mało tego, cześć się pokrywa tych przedziałów.
Chciałbym określić przedział o wiele dłuższy np.: 1.01-1.03 i ile wchodzi tych małych przedziałów wyżej (ile dni się pokrywa), bez pokrywania się tych samych.
Już ogarnąłem wypisywanie ilości poszczególnych dni z małych przedziałów, teraz zastanawiam się jak wykluczyć dni powtarzające się
  • Odpowiedz
@Imputator:

Chciałbym określić przedział o wiele dłuższy np.: 1.01-1.03 i ile wchodzi tych małych przedziałów wyżej (ile dni się pokrywa), bez pokrywania się tych samych.


Pierwszym krokiem do uzyskania odpowiedzi na pytanie jest zadanie go w taki sposób, żeby nie było wątpliwości o co pytasz... Po drugim opisie ja mam więcej wątpliwości niż po pierwszym, więc może pora na prosty przykład i oczekiwaną odpowiedź?
  • Odpowiedz
@brak_nicku: Dobra Panie Kierowniku, mamy dane pomarańczowe daty (przydziały czasu), chcę policzyć ile dni z pomarańczowych przedziałów mieści się w niebieskim przeziale, ale tak, aby liczba dni z pomarańczowych nie pokrywała się ze sobą. Czyli liczba dni z pomarańczowych dat (mój wynik) nie może być większa niż cały przedział niebieski. W tym przypadku akurat będzie dokładne cały niebieski przedział pokryty.
Imputator - @brak_nicku: Dobra Panie Kierowniku, mamy dane pomarańczowe daty (przydzi...

źródło: comment_bvYhhnwyKL0ZXIGssr5bSqJCKvL1AdEj.jpg

Pobierz
  • Odpowiedz
@Imputator: No i o to chodziło, Panie Kierowniku:) Jeszcze ciut lepiej by było, gdyby te dane były w tabeli, a nie na wykresie, ale już teraz jest jasne.
Formuła:

=SUMA(--(MACIERZ.ILOCZYN((TRANSPONUJ(B4:B7)<=(WIERSZ(INDEKS(A:A;F4):INDEKS(A:A;F5))))*(TRANSPONUJ(C4:C7)>=(WIERSZ(INDEKS(A:A;F4):INDEKS(A:A;F5))));WIERSZ(B4:B7)^0)>0))
Dla danych jak z obrazka na dole. Może nie najprostsza, ale i tak wygląda mniej groźnie niż te wyżej od @DwaNiedzwiedzie :)
brak_nicku - @Imputator: No i o to chodziło, Panie Kierowniku:) Jeszcze ciut lepiej b...

źródło: comment_TrK4OiQviJqBtAik9E9ve8FbmzOImSY6.jpg

Pobierz
  • Odpowiedz
@Imputator: jak masz niedociągnięcia w VBA to pokaż, poprawimy. Wersja VBA przy dużej ilości zakresów i bardzo długim okresie wejściowym na pewno będzie wydajniejsza niż ta formuła oraz PQ, ale jak mówisz o 3 miesiącach i 30 zakresach, to nieistotne.
  • Odpowiedz
@brak_nicku: Sub COunt Dates ()

Dim lastRow As Integer
Dim n As Integer
Dim startDate As Date
Dim endDate As Date
Dim xDate As Date
Diim rowCount As Boolean
Dim daysNumber As Integer
Dim one Day As Date

startDate = Range("C3").Value 'data początkowa interesującego nas przedziału"
endDate = Rane("C4"). Value 'data końcowa
lastRow = Range("B8:).End(xlDown).Row 'wykrywa ostatni wiersz w zestawie przedzaiłów - będą one dopisywane

'wlaściwy program
daysNumber = 0

For
  • Odpowiedz
@Imputator:
1. pierwsze pytanie: jak działa formuła? Zapomniałem dodać, że to formuła tablicowa i trzeba ją zatwierdzić Ctrl+Shift+Enter, może to i oczywiste, ale wolę dopisać
2. druga sprawa: jak chcesz pomocy z kodem, to zawsze wklejaj go bezpośrednio z edytora VBA, ten ewidentnie tak tu nie trafił - literówki typu Diim, zobaczę czy uda mi się rozgryźć skąd wynikają pozostałe błędy kompilacji
3. Już wyżej raz prosiłem: łatwiej odczytać dane
  • Odpowiedz
Jak widać zarówno kod jak i formuła dają ten sam wynik, zatem błąd leży w danych wejściowych - chociać nie bardzo widzę możliwość, żeby ten kod dał wynik wyższy od spodziewanego - prędzej na odwrót, albo.... Zatem jeśli chcesz dalszej pomocy - to najlepiej zrób przykładowy plik z danymi wejściowymi, kodem i oczekiwanym wynikiem i podeślij link. Jak widzisz praca na obrazkach i przepisywanym kodzie nie idzie najlepiej...
@Imputator
  • Odpowiedz
nie liczymy ostatniego dnia


@Imputator: w końcu jakieś konkrety - konkretne dane, konkretne wymagania (ostatnie - pojawiające się znienacka:) - rozwiązanie proste. Skoro nie liczymy ostatniego dnia, to zamiast:

Cells(i, 3).Value >= xDate
Musi być nierówność ostra:

Cells(i, 3).Value > xDate
Taką samą zmianę trzeba by wprowadzić w formule, gdyby miała być wykorzystana.
Kod można by uporządkować i uprościć, ale dzisiaj nie mam już na to czasu.
  • Odpowiedz
@brak_nicku: Szanowny kolego, rozwiązane jest oczywiste, co prawda programista-amator ze mnie, ale testowałem to rozwiązanie, nie wiem dlaczego mi wtedy nadal to nie pasowało, dzięki za pomoc ;)
  • Odpowiedz