เพื่อมุ่งให้เกิดคุณภาพจากการอบรมสูงสุด Excel Expert Training ให้การอบรม Excel กลุ่มเล็กๆ ไม่เกิน 6 คนทุกคนสามารถเรียนรู้ Excel อย่างใกล้ชิด จะมาคนเดียวหรือมาเป็นกลุ่มแล้วนัดวันอบรมแบบส่วนตัวก็ได้ ผู้เข้าอบรมทุกคนสามารถติดตามเนื้อหาที่อบรมได้อย่างชัดเจนจากจอภาพด้านหน้าของตัวเอง
Page 1 of 3 123 LastLast
Results 1 to 10 of 25

Thread: สูตร excel หรือ function ที่ใช้เกี่ยวกับการหาวันที่ต้องวางบิลกับลูกค้า

  1. #1
    gaka
    Guest

    สูตร excel หรือ function ที่ใช้เกี่ยวกับการหาวันที่ต้องวางบิลกับลูกค้า

    สูตร excel หรือ function ที่ใช้เกี่ยวกับการหาวันที่ต้องวางบิลกับลูกค้าเพราะลูกค้าจะกำหนดวันที่วางบิลไว้ เช่น ทุกวันที่ 10-15 ของทุกเดือน หรือ ทุกจันทร์ที่ 2 และ 4 ของทุกเดือน หรือ เฉพาะวันที่ 25 ของทุกเดือน ซึ่งแต่ละเงื่อนไข นับจากวันที่ใน ใบกำกับภาษีเป็นต้นไป
    เช่น
    กรณีทุกวันที่ 10-15 ของทุกเดือน
    ถ้า ใบกำกับภาษีออกวันที่ 8 พ.ค. 2551 ก็วางบิลวันที่ 10 พ.ค. 2551
    แต่ถ้าออกใบกำกับวันที่ 12 พ.ค. 2551 ก็ให้วาง 12 พ.ค. 2551 เลย (เพราะอยู่ในช่วงวางบิลพอดี
    แต่ถ้าเลยไปเช่น ออกใบกำกับวันที่ 16 พ.ค. 2551 ก็จะต้องวางบิล 10 มิ.ย. 2551 (รอบถัดไป)
    หรือ

    กรณีทุกวันจันทร์ที่ 2 และ 4 ของทุกเดือน

    ระบบจะทราบได้อย่างไรว่า วันที่ในใบกำกับภาษี นั้นก่อน หรือหลังวันจันทร์ที่ 2 หรือ จันทร์ ที่ 4 ของแต่ละเดือน เพื่อจะจัดกรุ๊ป ลงวันที่ต้องวางบิลได้ครับ

    อาจารย์ , เพื่อน ๆ มีคำแนะนำหรือเปล่าครับตอนนี้กำลังมืน ว่า function ที่เขียนขึ้นมา คืนค่าไม่ถูก เกิด Out of Range (น่าจะเกิดจากการวนลูปค่าใน อะเรย์ ครับ แก้ไม่ตกซะที)

    สาเหตุที่ไม่ใส่ Code เพราะอาจเป็นการชี้นำ ซึ่งอยากได้แนวความคิดหรือแนวทางแก้ปัญหาจากหลาย ๆ ท่านโดยไม่ถูกปิดกั้นหรือชี้นำ มากกว่าครับ ประกอบกับ รหัสที่ผมเขียนมัน invalid เอาลงมาให้ดู ก็อายจริง ๆ

  2. #2
    สมเกียรติ
    Guest
    กรณีที่ 1

    =DATE(YEAR(C5), MONTH(C5)+(DAY(C5)>To), IF(DAY(C5)<From,From,IF(AND(DAY(C5)>=From,DAY(C5)<=To),DAY(C5),From)))

    C5 เป็นวันที่ในเอกสาร
    From = 10
    To =15

    กรณีที่ 2 ให้หาวันจันทร์ที่ 2 และ 4 มาใช้งาน

    =DATE(YEAR(C19),MONTH(C19),1)-(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))-$D$9+(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))<$D$9)*7)+IF(C19<=DATE(YEAR(C19),MONTH(C19),1)-(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))-$D$9+(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))<$D$9)*7)+14,14,IF(C19<=DATE(YEAR(C19),MONTH(C19),1)-(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))-$D$9+(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))<$D$9)*7)+28,28,42))

    C19 เป็นวันที่ในเอกสาร
    D9 เป็นเลข 2 แทนวันจันทร์

    สูตรยาวๆนี้จะสั้นลงมาก ถ้าแยกส่วนของการคำนวณต่อไปนี้ไว้อีกเซลล์หนึ่งครับ
    =DATE(YEAR(C19),MONTH(C19),1)-(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))-$D$9+(WEEKDAY(DATE(YEAR(C19),MONTH(C19),1))<$D$9)*7)

    หรือแยกส่วนอีกหน่อย
    =DATE(YEAR(C19),MONTH(C19),1)

    แล้วนำผลที่ได้ไปใช้ต่อในสูตร จะทำให้ไม่ต้องคำนวณซ้ำในแต่ละสูตร

    ผมแนบตัวอย่างการคำนวณหาวันในสัปดาห์ก่อนและหลังมาให้ดูด้วยครับ

    ส่วนกรณีทุกวันที่ 25 น่าจะทำเองได้ไม่ยากแล้วล่ะครับ ถ้าผ่านการใช้สูตรข้างบนเหล่านี้เป็น

  3. #3
    gaka
    Guest
    ขอบคุณครับ อาจารย์สมเกียรติ ถ้าโพสท์ความเห็นกันหลาย ๆ คนแล้ว สุดท้ายผมจะนำไฟล์ที่ผมคิด (ที่บอกว่าไม่ค่อยดีมาแชร์ไอเดียครับ)

  4. #4
    สมเกียรติ
    Guest

    Arrow

    ตามใจครับ พอดีคุณ gaka เป็นสมาชิกมานาน พอจะเข้าใจกันอยู่ แต่ถ้าเป็นสมาชิกใหม่ ขอให้ช่วยแนบแฟ้มที่ตนเองทำมาเลยตั้งแต่แรก ไม่งั้นอาจทำให้มองในแง่ไม่ดีว่า นี่จะถามเพื่อลองภูมิกันหรือแอบยกการบ้านมาให้คนอื่นทำก็เป็นได้

    สำหรับสมาชิกอื่นขอเรียนย้ำว่า ฟอรัมนี้มีไว้ให้ใช้เรียนรู้ ไม่ต้องมากลัวถูกติกัน ถ้าจะติก็ต้องติเพื่อก่อ ผู้ที่ติต้องให้คำแนะนำต่อด้วย ไม่ใช่เอาแต่ตำหนิอย่างเดียว


  5. #5
    อรวีร์
    Guest

    Smile

    อรวีร์ขอเสนอสูตรหาวันจันทร์แรกของเดือนของวันที่ใน C5 ดังนี้ค่ะ
    =C5-DAY(C5)+MOD(8-WEEKDAY(C5-DAY(C5)),7)+1

    ส่วนวันจันทร์ที่สอง,สาม,สี่ ก็แก้เลขท้ายเป็น +8, +15, +22 ตามลำดับค่ะ

  6. #6
    สมเกียรติ
    Guest
    Quote Originally Posted by อรวีร์ View Post
    อรวีร์ขอเสนอสูตรหาวันจันทร์แรกของเดือนของวันที่ใน C5 ดังนี้
    =C5-DAY(C5)+MOD(8-WEEKDAY(C5-DAY(C5)),7)+1
    แล้วถ้าอยากได้วันอื่นที่ไม่ใช่วันจันทร์จะแก้เพิ่มตรงไหนครับ ขอบคุณครับ

  7. #7
    gaka
    Guest
    หาทางออกไม่เจอ ผมหัดทำเป็น UserDefineFunction ครับติดปัญหาตรง
    Code:
    public function billdate(std as long, stp as long) as date
    dim nextdate()
    dim maxval as variant, minval as variant
    redim nextdate(1)
    nextdate(0) = 10 'กำหนดวันเริ่มต้น โดยตั้งใจทำเป็นพารามิเตอร์รับค่าเข้า function แต่ยังทำไม่เป็น เลยกำหนดเป็นค่าคงที่ซะก่อน
    nextdate(1) = 25
                    maxval = WorksheetFunction.Max(nextdate)
                    minval = WorksheetFunction.Min(nextdate)
    if invdate <= maxval and invdate >= minval then
    billdate = invdate
    elseif invdate > maxval then
    billdate = minval +30
    else
    billdate = minval
    end if
    end function
    กำลังหาทางสร้าง patten แบบต่อไป ไว้เสร็จจะนำมาแชร์กันครับ

    เพิ่มเติม ถ้าหาวันทำงาน (ไม่นับเสาร์อาทิตย์) ถัดไป ผมใช้ =IF(WEEKDAY(A2,2)<6,A2,A2+8-WEEKDAY(A2,2)) ใช้พารามิเตอร์ 2 ในฟังชั่น Weekday เพื่อบังคับให้ ค่า 6-7 หมายถึง วันเสาร์-อาทิตย์ โดยที่ 1 หมายถึงจัุนทร์

  8. #8
    อรวีร์
    Guest

    Smile

    =C5-DAY(C5)+MOD(6+D9-WEEKDAY(C5-DAY(C5)),7)+1

    โดยที่ . . .
    C5 เก็บวันที่/เดือน/ปี ที่อ้างถึง
    D9 เก็บเลข 1=อาทิตย์, 2=จันทร์ , . . . .

  9. #9
    สมเกียรติ
    Guest
    สูตรของผม
    E10
    =$B$10-(WEEKDAY($B$10)-$D$9+(WEEKDAY($B$10)<$D$9)*7)+7*D10

    สูตรของคุณอรวีร์
    F10
    =$B$10-DAY($B$10)+MOD(6+$D$9-WEEKDAY($B$10-DAY($B$10)),7)+1+(7*(D10-1))

    B10 คือ วันที่กำหนด
    D9 คือ วันในสัปดาห์ 1=sun, 2=mon
    D10 คือ เลขที่สัปดาห์

    เมื่อลองเปรียบเทียบสูตรของผมกับสูตรคุณอรวีร์แล้ว พบว่าสูตรของผมจะเพิ่มจำนวนสัปดาห์ให้กับวันที่กำหนดจนเป็นวันต้นสัปดาห์ ส่วนสูตรของคุณอรวีร์จะหาวันต้นสัปดาห์จากวันที่กำหนดได้เลยครับ

    ดังนั้นถ้าจะใช้สูตรของผมในกระทู้นี้ซึ่งจะหาวันต้นสัปดาห์ที่ 2 และ 4 จึงจำเป็นต้องคิดย้อนไปหาวันที่ต้นเดือนให้ได้ก่อน สูตรจึงยาวกว่ามาก เพราะถ้าไม่ย้อนไปเริ่มต้นเดือน สูตรของผมจะหาสัปดาห์ถัดๆไปจากวันที่กำหนดเลื่อนไปตามจำนวนสัปดาห์ที่ต้องการ

    ผมได้ปรับสูตรคุณอรวีร์ให้เทียบวันที่กับวันต้นสัปดาห์ที่ 2 และ 4
    ถ้ายังไม่ถึงสัปดาห์ที่ 2 ให้ใช้วันต้นสัปดาห์ที่ 2 แต่
    ถ้ายังไม่ถึงสัปดาห์ที่ 4 ให้ใช้วันต้นสัปดาห์ที่ 4 มิฉะนั้น
    ให้ใช้วันต้นสัปดาห์ที่ 2 ของเดือนถัดไป
    ตามสูตรนี้ครับ

    F19
    =C19-DAY(C19)+MOD(6+$D$9-WEEKDAY(C19-DAY(C19)),7)+1+IF(C19<=(C19-DAY(C19)+MOD(6+$D$9-WEEKDAY(C19-DAY(C19)),7)+1+7),7,IF(C19<=(C19-DAY(C19)+MOD(6+$D$9-WEEKDAY(C19-DAY(C19)),7)+1+21),21,35))

    C19 คือ วันที่กำหนด

    น่าจะมีสูตรที่คิดหาวันเริ่มสัปดาห์ที่ 2 หรือ 4 ให้เลยโดยไม่ต้องใช้ IF ซ้อนกัน ... ยังคิดไม่ออกครับ

  10. #10
    อรวีร์
    Guest

    Smile

    อรวีร์ขอเสนอเพิ่มอีกสูตรหนึ่งแทนที่ F19 เดิมเป็น . . .
    =(C19-WEEKDAY(C19+5)+7)+MOD(CEILING(DAY(C19-WEEKDAY(C19+5)+7),7)/7,2)*7

    แล้ว Copy ลงมาถึง F22
    ซึ่งสูตรใหม่นี้จะสั้นกว่าเดิม แต่ให้ผลลัพธ์เหมือนเดิม คือ ได้ผลเป็นจันทร์ที่ 2 หรือจันทร์ที่ 4
    ถ้าเกินจันทร์ที่ 4 ก็ขยับไปอีก 2 สัปดาห์(ซึ่งถือว่ายังไม่ถูกต้อง เพราะบางเดือนมีวันจันทร์ 5 วัน เช่นเดือน 6 ปี 2008)

    ถ้าจะทำให้สมบูรณ์ต้องแก้ไขอีกหน่อยค่ะ รอท่านอื่นช่วยแก้ไขเพิ่มเติม หรือจะมีสูตรใหม่อื่น . . .

Similar Threads

  1. Replies: 2
    Last Post: 20 Mar 2008, 15:34
  2. Replies: 4
    Last Post: 28 Jan 2008, 23:15
  3. excel เกิด error เวลา copy สูตร hyperlink
    By khomee in forum Excel Expert Forum Library 2012 - 2007
    Replies: 4
    Last Post: 14 Nov 2007, 14:29
  4. Replies: 2
    Last Post: 14 Aug 2007, 18:23

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •