นับวันจ่ายเงินเดือนที่เหลือในปี

ผมอยากนับจำนวนวันที่ว่า

  1. เกิดขึ้นระหว่างวันนี้ถึงสิ้นปี (เช่น 31 ธันวาคม) และ
  2. ซึ่งตรงกับวันที่ 15 หรือวันสุดท้ายของเดือน (30 สำหรับเดือนเมษายน มิถุนายน กันยายน พฤศจิกายน; 31 สำหรับเดือนมกราคม มีนาคม พฤษภาคม กรกฎาคม สิงหาคม ตุลาคม ธันวาคม และ 28 กุมภาพันธ์)

มีวิธีที่จะทำสิ่งนี้ให้สำเร็จหรือไม่?


person Anna Lam    schedule 08.08.2012    source แหล่งที่มา
comment
หากเดือนมี 31 วัน คุณยังต้องการให้วันที่ 30 ของเดือนนั้นรวมอยู่ด้วยหรือไม่ แล้วเดือนกุมภาพันธ์ล่ะ?   -  person Doug Glancy    schedule 08.08.2012
comment
คุณสามารถใช้ VBA หรือเพียงแค่ฟังก์ชั่น?   -  person KMC    schedule 08.08.2012
comment
ใช่ รวมวันที่ 31 ธันวาคมด้วย ฉันต้องการใช้ฟังก์ชัน Excel ล้วนๆ   -  person Anna Lam    schedule 08.08.2012


คำตอบ (3)


ดูเหมือนว่าจะใช้งานได้ (แม้ว่าฉันคิดว่ามันอาจจะเป็นระเบียบและฉันแน่ใจว่ามีวิธีที่ดีกว่านี้ ... )

=(12-MONTH(TODAY()))*2 
+ IF(DAY(TODAY())<15,2,
        IF(DAY(TODAY())<DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,1)-1),1,0))

(12 เดือน(วันนี้()))*2 : สองวันสำหรับแต่ละเดือนที่เหลือเต็ม

บวกอีก 2 วันก่อนวันที่ 15

or

บวก 1 วันหากเป็นวันที่ 15 หรือหลังจากนั้น และไม่ใช่วันสุดท้ายของเดือนปัจจุบัน

person Tim Williams    schedule 08.08.2012
comment
+1 โปรดีๆ ตลอดสิ้นเดือน ส่งคืน 10 ตามที่ควร :) - person Siddharth Rout; 08.08.2012
comment
มันทำงานเหมือนความฝัน ฉันเปลี่ยนค่าน้อยกว่าเป็นน้อยกว่าหรือเท่ากับ (บรรทัดสุดท้ายของตัวอย่างโค้ดของคุณ) ดังนั้นฉันจึงสามารถนับวันปัจจุบันคือวันที่ 15 ได้ - person Anna Lam; 08.08.2012

ตัวแปรที่หลีกเลี่ยงสูตรอาร์เรย์

1. For your question as asked

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15}))+(13-MONTH(TODAY()))
= 10

2. For my initial interpretation which was to count any days corresponding to a certain day of the month

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,30}))
=10

ในทางตรงกันข้าม

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,31}))
=8

และ

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,30,31}))
=13

หากต้องการเปลี่ยนวันที่ต้องการ เพียงเปลี่ยนองค์ประกอบ {15,30} เช่น ={1,2,12,15,31} เพื่อนับวันทั้งหมดที่ตรงกับวันที่ 1, 2, 12, 15 และ 31 เป็นต้น

สูตรนี้จะใช้กับปีอธิกสุรทิน

person brettdj    schedule 08.08.2012
comment
+ 1 ใช้ SUMPRODUCT ได้ดี สูตรส่งคืน 8 ตามที่ควร - person Siddharth Rout; 08.08.2012
comment
เบร็ทดีเจ มันให้ผลลัพธ์ที่ไม่คาดคิดสำหรับ {15,30,31} มันควรจะกลับมา 10 หรือฉันพลาดอะไรไป? - person Siddharth Rout; 08.08.2012
comment
@SiddharthRout มันควรจะเป็น 13 - ซึ่งก็คือ :) (ทุกเดือนตั้งแต่ ส.ค. - ธ.ค. มีอย่างน้อย 30 วัน ดังนั้น 8 (จากคำถามก่อนหน้า) +5 = 13) - person brettdj; 08.08.2012
comment
555... ที่นี่ยัง 6.39 น. :D - person Siddharth Rout; 08.08.2012
comment
-- ในสูตรมีอะไรบ้าง - person Enigmativity; 08.08.2012
comment
@Enigmativity corercion เพื่อแปลง TRUE เป็น 1 โดยการคูณด้วย -1*-1 - person brettdj; 08.08.2012
comment
อาจมีเงื่อนไขขอบเขตบางอย่างที่ใช้ไม่ได้ เช่น. ในสูตร 1 NOW() ณ วันที่ 15 ธันวาคม 2555 จะส่งกลับ 1 (ราวกับว่าวันที่ 15 ไม่ควรนับ) แต่ NOW() ณ วันที่ 31 ธันวาคม 2555 จะส่งกลับ 1 เช่นกัน (ราวกับว่าวันที่ 31 ควรนับ) ไม่ชัดเจนว่า OP ต้องการรวมวันที่ปัจจุบันในผลลัพธ์หรือไม่ แต่ดูเหมือนว่าผลลัพธ์ไม่ควรขึ้นอยู่กับว่า TODAY() เป็น EOM หรือวันกลางเดือนโดยพลการ - person andy holaday; 08.08.2012
comment
@andyholaday สูตร 2 ที่ยืดหยุ่นมากขึ้นไม่รวมเงื่อนไขขอบเขตสำหรับวันที่ 31 ธันวาคม 2555 (เช่นส่งคืน 0) ฉันจะอัปเดตส่วนที่ไม่ใช่อาร์เรย์ของสูตร 1 เพื่อความสอดคล้อง คุณเสนอประเด็นที่ยุติธรรมว่าควรระบุเงื่อนไขวันที่ปัจจุบัน - person brettdj; 08.08.2012

สิ่งนี้ควรใช้งานได้ในวันใดก็ได้ของปีใดก็ได้ใน Excel เวอร์ชันใดก็ได้จนถึงปี 2078 (นานกว่านั้นมากใน Excel 2007 หรือใหม่กว่า)

=SUM(IF(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16},1,0))

หมายเหตุ ฉันกำลังตรวจสอบวัน = 1 หรือ 16 โดยชดเชย 1 วัน (แนวคิดคือการหลีกเลี่ยงค่า DAY() สิ้นเดือนที่แตกต่างกัน)

{สูตรอาร์เรย์... กด Ctrl+Shift+Enter เพื่อคอมมิต}

[ภาคผนวก]

หากคุณไม่ต้องการรวมวันปัจจุบัน (เช่น วันนี้คือ 15 สิงหาคม) ให้ใช้สิ่งนี้แทน:

=SUM(IF(DAY(ROW(OFFSET($A$1,TODAY()+1,0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16},1,0))

ปล. ฉันทดสอบทุกวันตั้งแต่วันนี้จนถึงวันอธิกสุรทินปี 2016 และหลังจากนั้น และมันก็ได้ผลดี ทั้งหมดนี้เป็นเพียงการทดสอบหมายเลขแถวที่ถือเป็นอนุกรมวันที่โดยฟังก์ชัน DAY() เพื่อดูว่าเป็น 1 หรือ 16 แต่อนุกรมถูกชดเชยด้วย +1 ดังนั้นจึงตรวจสอบจริงๆ เพื่อดูว่า DAY() เป็น [วันสุดท้ายของเดือนใดก็ตาม] หรือ 15. หากผลลัพธ์เป็นจริง ให้บวก 1 มิฉะนั้นให้บวก 0


[เพิ่มเติมเพิ่มเติม]

ต่อไปนี้เป็นเวอร์ชัน ไม่ใช่อาร์เรย์ ที่ทำงานในลักษณะเดียวกัน:

รวมถึงวันปัจจุบัน:

=SUMPRODUCT(N(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16}))

ไม่รวมวันปัจจุบัน

=SUMPRODUCT(N(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16}))
person andy holaday    schedule 08.08.2012