Discussion:
excel i formula liczaca ilosc dni tygodnia.
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Adam Lubkowski
2006-10-30 04:31:58 UTC
Permalink
Czolem... musze napisac skrypt ktory bardzo, bardzo przyda sie w pracy
:-)
Podajemy dwie daty - np 26/10/06 i 05/10/06. Potrzebuje policzyc ilosc
dni tygodnia pomiedzy tymi datami - czyli tyle i tyle poniedzialkow,
wtorkow, srod itp itp...
Ogolna ilosc dni mozna wyciagnac z days(), mozna tez inna funkcja
dostac dzien tygodnia w formacie 1-7 podajac jakas date w argumencie,
niestety chyba zabraklo IQ by poskladac to wszystko do kupy.
Wykonalne?

adam.
Darek D.
2006-10-30 17:50:56 UTC
Permalink
Post by Adam Lubkowski
Czolem... musze napisac skrypt ktory bardzo, bardzo przyda sie w pracy
:-)
Podajemy dwie daty - np 26/10/06 i 05/10/06. Potrzebuje policzyc ilosc
dni tygodnia pomiedzy tymi datami - czyli tyle i tyle poniedzialkow,
wtorkow, srod itp itp...
Ogolna ilosc dni mozna wyciagnac z days(), mozna tez inna funkcja
dostac dzien tygodnia w formacie 1-7 podajac jakas date w argumencie,
niestety chyba zabraklo IQ by poskladac to wszystko do kupy.
Wykonalne?
Chyba tak ;)

Mój pomysł na rozwiązanie tego zadania:

========================
Option Explicit
Option Base 1

Sub IleJakichDniTygodnia()
'(c) Darek Dunajewski, 30.11.2006
'Makro oblicza ilość wystąpień każdego z dni tygodnia
'w przedziale czasu pomiędzy podanymi datami
'komórka "A1" - data początkowa
'komórka "A2" - data końcowa

Dim IleRazyDzien(7) As Integer
Dim NazwaDnia As Variant
NazwaDnia = Array("PN", "WT", "ŚR", "CZ", "PI", "SO", "NI")
Dim DataPocz, DataKonc, data As Date
Dim i, d, w, PierwszyDzien, IleTygodni, Reszta As Integer
Dim wyniki As Range
'prezentacja obliczeń od komórki:
Set wyniki = Range("C1")


DataPocz = Range("A1")
DataKonc = Range("A2")
i = 0

For data = DataPocz To DataKonc
i = i + 1
If i = 1 Then
PierwszyDzien = Weekday(DataPocz, vbMonday)
End If
Next data

IleTygodni = Int(i / 7)
Reszta = (i Mod 7) - 1

For d = 1 To 7
IleRazyDzien(d) = IleTygodni
Next d

For d = PierwszyDzien To PierwszyDzien + Reszta
IleRazyDzien(d) = IleRazyDzien(d) + 1
Next d

For w = 1 To 7
wyniki.Offset(w - 1, 0).Value = NazwaDnia(w)
wyniki.Offset(w - 1, 1).Value = IleRazyDzien(w)
Next w
End Sub
========================

Życzę aby w wyniku obliczeń, makro podawało jak największą ilość sobót i
niedziel ;)

Pozdrowienia - Darek D.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
mcg
2006-10-31 11:15:29 UTC
Permalink
Post by Adam Lubkowski
Czolem... musze napisac skrypt ktory bardzo, bardzo przyda sie w pracy
:-)
Podajemy dwie daty - np 26/10/06 i 05/10/06. Potrzebuje policzyc ilosc
dni tygodnia pomiedzy tymi datami - czyli tyle i tyle poniedzialkow,
wtorkow, srod itp itp...
Ogolna ilosc dni mozna wyciagnac z days(), mozna tez inna funkcja
dostac dzien tygodnia w formacie 1-7 podajac jakas date w argumencie,
niestety chyba zabraklo IQ by poskladac to wszystko do kupy.
Wykonalne?
adam.
sprobuj formuly tablicowej
=SUMA(JEŻELI(TEKST(B1:B31;"dddd")="poniedziałek";1;0))

gdzie b1:b31 to zakres w ktorym sa daty
dla innych dni wpisujesz wtorek itd-mozesz tez to powiazac z lista dni
umieszcasona w jakims zakresie
mcg
Adam Lubkowski
2006-11-01 03:00:43 UTC
Permalink
dzieki za pomoc... ale niestety nie pomoglo :/

Darek D. - nie wiem czy doszla wiadomosc na priv - skrypt wysypuje sie
na tej linii:
IleRazyDzien(d) = IleRazyDzien(d) + 1

mcg - chodzilo bardziej nie o liste dat tylko dwie daty od-do - a
policzyc trzeba ile pomiedzy tymi datami pojawi sie danych dni.

adam.
Darek D.
2006-11-01 09:44:23 UTC
Permalink
Post by Adam Lubkowski
dzieki za pomoc... ale niestety nie pomoglo :/
Darek D. - nie wiem czy doszla wiadomosc na priv - skrypt wysypuje sie
IleRazyDzien(d) = IleRazyDzien(d) + 1
Jak to nie pomogło?!
Sprawdzałem, u mnie od kilku dni chodzi tak samo, czyli przy zadanych przeze
mnie datach bez problemu ;)
Jednak możliwe, że jest jakiś błąd, który ujawnia się np. w konkretnym
zakresie dat - tak sobie gdybam.
Błąd pojawia się za każdym razem, bez względu na zakres dat, czy od czasu do
czasu, a może przy konkretnych datach?

Pisząc "skrypt wysypuje się" podaj jakieś szczegóły, np. jaki komunikat jest
wyświetlany?
Podaj zakres dat dla których otrzymujesz błąd, to sprawdzę u siebie.

Ja używam Excela 2000 ale to nie powinno mieć znaczenia.

Pozdrowienia - Darek D.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-11-01 20:38:52 UTC
Permalink
Witam!
Post by Darek D.
Post by Adam Lubkowski
dzieki za pomoc... ale niestety nie pomoglo :/
Darek D. - nie wiem czy doszla wiadomosc na priv - skrypt wysypuje
IleRazyDzien(d) = IleRazyDzien(d) + 1
Jak to nie pomogło?!
Sprawdzałem, u mnie od kilku dni chodzi tak samo, czyli przy zadanych
przeze mnie datach bez problemu ;)
Jednak możliwe, że jest jakiś błąd, który ujawnia się np. w konkretnym
zakresie dat - tak sobie gdybam.
Błąd pojawia się za każdym razem, bez względu na zakres dat, czy od
czasu do czasu, a może przy konkretnych datach?
Wysypuje się np: przy datach: 01-10-2006 i 01-11-2006 :-) Bład "Subscript of
range". Dlaczego? Sam łatwo zgadniesz. Nie wspominam o błędzie "Overflow"
przy 01-10-2006 i 01-11-9999 :-)
Proponuję uprościć funkcje, np. do takiej postaci:

Sub ileDniTygodnia()

Dim DataPocz As Long
Dim DataKon As Long
Dim i As Long, d As Long
Dim tablDni(1 To 7) As Long
Dim Wyniki As Range

DataPocz = Range("A1")
DataKon = Range("A2")
Set Wyniki = Range("E1")

For i = DataPocz To DataKon
d = Weekday(d, vbMonday)
tablDni(d) = tablDni(d) + 1
Next

For i = 1 To 7
With Wyniki
.Offset(i - 1, 0) = Format(i + 1, "ddd")
.Offset(i - 1, 1) = tablDni(i)
End With
Next

End Sub

W sumie dość prymitywna, ale skuteczna :-)

Tajan
Tajan
2006-11-01 20:50:27 UTC
Permalink
Post by Tajan
d = Weekday(d, vbMonday)
powinna wyglądać tak:

d = Weekday(i, vbMonday)

Tajan
Hubert Dołęga
2006-11-02 15:49:03 UTC
Permalink
Post by Adam Lubkowski
Czolem... musze napisac skrypt ktory bardzo, bardzo przyda sie w pracy
:-)
Podajemy dwie daty - np 26/10/06 i 05/10/06. Potrzebuje policzyc ilosc
dni tygodnia pomiedzy tymi datami - czyli tyle i tyle poniedzialkow,
wtorkow, srod itp itp...
Ogolna ilosc dni mozna wyciagnac z days(), mozna tez inna funkcja
dostac dzien tygodnia w formacie 1-7 podajac jakas date w argumencie,
niestety chyba zabraklo IQ by poskladac to wszystko do kupy.
Wykonalne?
Zakładając, że daty początkowa i końcowa są umieszczone w komórkach
A1 i A2:

=FREQUENCY(WEEKDAY(ROW(INDIRECT(A1&":"&A2));2);{1;2;3;4;5;6;7})

=CZĘSTOŚĆ(DZIEŃ.TYG(WIERSZ(ADR.POŚR(A1&":"&A2));2);{1;2;3;4;5;6;7})


Powyższą formułę wprowadź jako tablicową w zakresie 7 wierszy.


Pozdrawiam,
--
Hubert Arkadiusz Dołęga

Zanim napiszesz na priva zdejmij majtki-.
Tajan
2006-11-02 17:49:41 UTC
Permalink
(...)
Post by Hubert Dołęga
=CZĘSTOŚĆ(DZIEŃ.TYG(WIERSZ(ADR.POŚR(A1&":"&A2));2);{1;2;3;4;5;6;7})
Powyższą formułę wprowadź jako tablicową w zakresie 7 wierszy.
Warto wspomnieć, że w aktualnych wersjach Excela powyższa funkcja działa
prawidłowo do
daty 05-06-2079 :-)

Tajan

Loading...