Function “Datedif” for OpenOffice.org

ที่สำนักงาน ผมติดตั้ง OpenOffice.org ให้ทุกเครื่อง ยกเว้นอยู่เครื่องหนึ่งที่ยังจำเป็นต้องลง MS Office คู่กันไปด้วย เพราะมีโปรแกรมพิมพ์เช็คที่คนเก่าเขาทำไว้ให้อิงกับ MS Access (ผมยังหาวิธีแก้ไม่ได้)

ปรากฏว่าพอมี MS Office ที่เครื่องนั้น เจ้าของเครื่องก็ไม่ยอมใช้ OpenOffice.org แต่ใช้ Excel ในการทำงาน พอส่งงานไปให้ผู้จัดการก็มีปัญหาสูตรเข้ากันไม่ได้ โดยสูตรที่มีปัญหาจะปรากฏเป็น ERROR

ผมจึงขอร้องแกมบังคับขู่เข็ญให้เธอใช้ OpenOffice.org อย่างจริงจังตั้งแต่นี้ต่อไป เพราะ MS Office ที่ใช้อยู่ทุกวันนี้ เป็นเวอร์ชั่นทดลอง เขาให้ใช้ได้ ๖๐ วัน เมื่อครบเวลา ต้องนำ backup image ที่ยังไม่มี MS Office กลับมา แล้วค่อยลงโปรแกรมออฟฟิศใหม่ เพราะทางบริษัทไม่มีนโยบายซื้อ MS Office (จ่ายเป็นหมื่น แต่ใช้งานไม่คุ้มราคา)

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

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

ไม่นานนักผมก็ได้คำตอบกลับมาว่า

“ให้อ่านที่ http://www.stks.or.th/web/index.php?option=com_content&task=view&id=1727&Itemid=132

เฉพาะ Excel จะมีฟังก์ชัน datedif ให้ แต่ถ้าเป็น calc ต้องใช้สูตรสุดท้ายครับ”

เมื่อทดลองแล้ว ผลที่ได้ยังไม่ได้ตรงตามความต้องการ คือจำนวนเดือน และวันจะมีเศษเป็นจุดทศนิยม จึงอีเมลไปถามอีก และได้คำตอบกลับมาในเวลารวดเร็วว่า

“อันนี้คือปัญหาของ Excel ครับเพราะเราไมได้คำนวณจากปีอธิกสุทินจริงๆๆ

ดังนั้นหากต้องการละเอียดและถูกต้องต้องเขียนโปรแกรมคำนวณเองครับ

excel จะทำปกติไม่ได้ครับ (ต้องเขียน vb action )

ยังไงต้องให้ทีมโปรแกรมเมอร์ดำเนินการให้ดีกว่าครับ

โดยหลักคือ จะต้องเช็คก่อนว่าปีที่จะนำมาคำนวณเป็นปีอาธิกสุทินไหม”

หลังจากที่รบกวนมาหลายอีเมล แต่ยังแก้ปัญหาไม่ได้ตามต้องการ
ผมจึงลองใช้คีย์เวิร์ดที่ได้มาจากอีเมลฉบับก่อน คือ “datedif openoffice.org” เข้าไปหาใน google

แล้วในที่สุดผมก็เจอเว็บนี้เข้า
http://www.openofficetips.com/2007/07/24/who-needs-datedif-revisited/

เมื่อทดสอบทำตามแล้วก็ได้ผลดังนี้

กำหนดให้ A2= วันที่เริ่มงาน, B2= วันสุดท้ายของปี

สูตรคำนวณ :
ปี
=MOD(YEARS(A2;$B$2;0);12)

เดือน
=MOD(12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2));12)

วัน
=INT($B$2-DATE(YEAR($A2);MONTH($A2)+12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2));DAY($A2)))

พอให้น้องที่ทำงานทดสอบแล้วน้องบอกว่าใช้งานได้ดี (มีบ่นว่าสูตรมันยาวนิดหน่อย)

จึงนำเรื่องราวนี้มาโพส เผื่อว่าจะได้ช่วยเผยแพร่วิธีแก้ปัญหานี้ให้คนอื่นๆ ได้อีกต่อไป :)

27 ความเห็น »

  1. Khun T said

    ช่วยเล่าให้ฟังบ้างซิครับว่าใช้แล้วเป็นไงบ้าง

    ปัญหา compat กับ ไฟล์ Word, Excel, PowerPoint เป็นไงบ้าง แล้วภาษาไทยมีปัญหามั้ย

    ใช้ Mail Client อะไรแทน Outlook หรือ Outlook + Exchange พวก Directory Services, Mail Address, Group Mail, Calendar นี่มีมั้ย หรือ User ไม่เคยใช้มาก่อน เลยไม่รู้สึกว่า feature ลดลง

    สำหรับเครื่องที่ออกเเช็ค จริงๆสามารถซื้อแค่ MS Access ตัวดียวได้ ไม่จำเป็นต้องซื้อทั้ง Office แต่เปลี่ยนไปใช้ Calc แทนได้แล้วก็คงไม่เป็นปัญหาแล้ว

  2. noistuff said

    โปรแกรมหลักๆ ที่สำนักงานนี้ใช้ คือ Spread Sheet ครับ ผมก็ให้ใช้ Calc ของ OpenOffice.org แทน ก็สามารถทดแทนได้ ๑๐๐% (ยกเว้นเครื่องที่ผมเล่าให้ฟังข้างบนนี่แหละ แต่ตอนหลังก็ขอให้เขาใช้ OpenOffice.org ในการทำงานแทน MS Office อย่างจริงจังแล้ว)

    เรื่องการเข้ากันได้กับ Word, Excel ผมว่าสบายมากครับ ภาษาไทยก็ไม่มีปัญหา แต่กับ PowerPoint ผมไม่ได้ใช้เลย จากประสบการณ์ที่เคยใช้ เข้ากันไม่ได้อย่างมากครับ เพราะฉะนั้นเวลาที่ได้รับไฟล์แนบทางอีเมลเป็นเอกสารจำพวกนี้ ผมก็จะไม่เปิดไฟล์แนบออกอ่านเลย

    Mail Client ที่นี่ไม่ได้ใช้ครับ เพราะใช้ Web based e-mail กันหมด (yahoo, hotmail, gmail)

    ที่มีปัญหากับ MS Access จริงๆ คือ เจ้าหน้าที่ IT คนก่อน ให้เพื่อนช่วยทำโปรแกรมพิมพ์เช็คให้ ตัวโปรแกรมเป็นเหมือน .exe ครับ ซึ่งไม่สามารถแก้ไขอะไรได้ และผมเองก็ไม่อยากให้ทางสำนักงานซื้อซอฟท์แวร์ที่ใช้ไม่คุ้มกับเงินที่ลงทุนด้วยน่ะครับ (ใช้ MS Access เพื่อพิมพ์เช็คอย่างเดียว ผมว่าไม่คุ้มค่าเงินลงทุนเลย นำเงินที่จะลงทุนส่วนนั้นมาพัฒนาอย่างอื่นดีกว่า)

    ลองตั้งเป็นสถานการณ์ปัญหาการใช้โปรแกรมมาสิครับ ผมจะพยายามช่วยหาทางออกให้ :)

  3. ken said

    กำลังหาอยู่ครับ ขอบคุณครับ

    • noistuff said

      ด้วยความยินดีครับ :) ดีใจที่ได้มีส่วนช่วยครับ :)

  4. ken said

    ขอโทษครับ ทำไมผมใช้Function ไม่ได้ครับ

    =MOD(YEARS(A2;$B$2;0);12)

    • noistuff said

      สงสัยว่าคุณ ken ใช่ OO.o เวอร์ชั่นใหม่ ต้องเปลี่ยนเครื่องหมาย เซมิโคลอน (;) ในสูตรเป็นเครื่องหมาย คอมมา (,) แทนครับ ลอกสูตรข้างล่างนี้ไปลองใช้ดูเลยแล้วกันนะครับ :)

      ปี
      =MOD(YEARS(A2,$B$2,0),12)

      เดือน
      =MOD(12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2)),12)

      วัน
      =INT($B$2-DATE(YEAR($A2),MONTH($A2)+12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2)),DAY($A2)))

      โชคดีครับ :)

    • แก้ว said

      ใช้สูตรคำนวณปี=MOD(YEARS(A2,$B$2,0),12) ไม่ได้คะพอcopyไป มันขึ้น

      #NAME? คะเป็นเพราะอะไรคะ ช่วยตอบให้หน่อยคะงงมากคะ

      • noistuff said

        ลองเปลี่ยนตรงที่เป็น comma (,) ทั้งหมดในสูตรเป็น semi colon (;) แทนนะครับ อาจจะเป็นที่เวอร์ชั่นที่คุณใช้ครับ

  5. saowakhon said

    ไม่เข้าใจตรง กำหนดให้ A2= วันที่เริ่มงาน, B2= วันสุดท้ายของปี

    สมมุติเรากำหนดวันเริ่มงาน 01/01/2011 วันสุดท้ายของคือ คือ 31/12/2011 แบบนี้เหรอค่ะ ช่วยอธิบายให้กระจ่างหน่อยค่ะ

    พอดี เพิ่งมาจับ open office เหมือนกัน คลำสูตรแต่ละตัวยากมากค่ะ

  6. noistuff said

    ถ้าหากพนักงานคนนั้นทำงานมาได้สองปีกว่า คือเริ่มงานวันแรก = วันจันทร์ที่ 15 กันยายน 2008 และต้องการดูว่าเมื่อสิ้นปี 2010 พนักงานคนนี้มีอายุงานเป็นเท่าไหร่ ก็กำหนด A2 = 15 ก.ย. 2008 และกำหนด B2 = 31 ธ.ค. 2010 ครับ :)

  7. แก้ว said

    ลองเปลี่ยนสูตรปีเป็น(;)แล้วคะก็ใช้ไม่ได้คะ แต่สูตรที่เป็นเดือนและวันเป็น(,)
    ก็ใช้ได้นะคะ ช่วยตอบให้หน่อยคะเพราะอะไร

    ขอบคุณคะ

    • noistuff said

      ไม่ทราบว่าใช้ OpenOffice.org เวอร์ชั่นอะไรอยู่ครับ? เดี๋ยวจะลองหาวิธีแก้ไขให้นะครับ

  8. may said

    อยากทราบว่า จะคำนวณหาวันทำงาน ตั้งแต่เริ่มจนถึงปัจจุบัน ให้ออกมาเป็น –ปี–เดือน–วัน จะต้องทำอย่างไรค่ะ ขอบคุณมากเลยค่ะ จากข้างบนเป็นประโยชน์มากนะค่ะ

    • noistuff said

      ผมเดาว่า คงต้องเปลี่ยนจาก B2= วันสุดท้ายของปี ไปเป็น B2= วันที่ต้องการใช้คำนวณ หรือวันที่ปัจจุบัน นะครับ โชคดีครับ :)

  9. แก้ว said

    ใช้ OpenOffice.org เวอร์ชั่น 3.2คะ

    • noistuff said

      เอ .. ผมเพิ่งทดสอบกับ OpenOffice.org 3.2.1 บน Linux Mint 10 ให้เดี๋ยวนี้เอง ก็ใช้งานได้นะครับ แต่มีข้อควรระวังอยู่หนึ่งเรื่อง คือ การพิมพ์ วัน เดือน ปี เนื่องจากหลาย ๆ ครั้ง โปรแกรมมีการตั้งค่าให้อ่านวันที่แบบอเมริกัน คือ เดือน วัน ปี

      ยกตัวอย่างเช่น หากเราต้องการพิมพ์วันที่ 1 เดือน 7 ปี 2006 จะต้องพิมพ์เป็น 07.01.2006 แล้วโปรแกรมจึงจะเข้าใจ ทดสอบได้โดยการพิมพ์วันที่เกิน 12 หากไม่มีอะไรพลาด ก็จะได้วันที่ตามต้องการครับ

      หากผมจะรบกวนคุณแก้ว ช่วยส่งไฟล์ที่บอกว่าทำแล้วเกิดปัญหามาให้ผมดูสักหน่อยจะได้ไหมครับ? กรุณาส่งมาที่ speed net club + ooo32datedif at gmail dot com พิมพ์ติดกันทั้งหมดนะครับ และมีเครื่องหมายบวกตามที่แสดงไว้ด้วยนะครับ ไม่งั้นอาจส่งไม่ถึง

      เมื่อได้รับไฟล์มาแล้ว ผมจะลองหาเวลาช่วยตรวจสอบให้ครับ :)

      ระหว่างนี้ก็ขอให้โชคดีครับ :)

  10. ninlawat said

    ขอบคุณมาก ๆ ค่ะ กำลังเจอปัญหานี้อยู่เลยค่ะ หาจนปวดหัว โชคดีที่ได้มาเจอบล็อกนี้

  11. ท๊อป said

    แล้ว เี่ราจะต่อ สูตร เข้าด้วยกันได้ใหม คับ เอา Y M D มาีรวมกันได้ใหม ครับ

    • ท๊อป said

      เพิ่มเติมครับ ฟอร์ม ประมาณว่า 30 ปี 1 เดือน 10 วัน ประมาณนี้อ่ะคับ จะทำได้ใหม ครับ

      • noistuff said

        คงต้องรบกวนให้ทดสอบดูครับ ได้ผลอย่างไร ช่วยกลับมาแจ้ังให้ทราบ เป็นวิทยาทานแก่คนข้างหลังด้วยยิ่งดีครับ :)

  12. ท๊อป said

    =MOD(YEARS(A2;$B$2;0);12)
    =MOD(YEARS(A2,$B$2,0),12)
    ลอง ทั่ง (;) (,) แล้ว ก็ขึ้น เป็น NAME?
    ฟอมที่ใช่ก็ 01.12.2014
    แต่สูตร เดือน กับ วันใช้ได้นะครับ งง เหมือนกัน

    • noistuff said

      แล้วถ้าเปลี่ยนเป็น 01/12/2014 ล่ะครับ?

      • ท๊อป said

        พอใส่ แบบ (.) เสร็จ ขึ้น ในโปรแกรม มันก็ขึ้น เป็น (/) นะ

    • noistuff said

      ในช่องที่พิมพ์วันที่ลงไป ได้เปลี่ยน format เป็น date แล้วหรือยังครับ? เท่าที่ผมพบปัญหาคือ ช่องที่เราพิมพ์วันที่ลงไปนั้นเป็น format number ครับ ลองเปลี่ยน format ดูก่อนนะครับ ขอบคุณที่อดทน และยังสนใจแก้ไขปัญหาอยู่ครับ คุณคือหนึ่งในความหวังของประเทศเราครับ :)

  13. ท๊อป said

    เย่ ได้แล้ว

    xx ปี xx เดือน xx วัน

    Open 3.3

    =MOD(YEARS(A2;$B$2;0);12)&” ปี “&MOD(12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2));12)&" เดือน "&INT($B$2-DATE(YEAR($A2);MONTH($A2)+12*(YEAR($B$2)-YEAR($A2))+MONTH($B$2)-MONTH($A2)-(DAY($B$2)<DAY($A2));DAY($A2)))&" วัน "

    • noistuff said

      เย้ ยินดีด้วยครับ :D

      ติดที่ format cell จริงๆ ด้วยสินะ :)

  14. bank said

    MOD(YEARS(A2;$B$2;0);12)

    ถ้าระยะปีเกิน 12 ขึ้นไปมันจะตัด เพราะหาร 12

RSS feed for comments on this post · TrackBack URI

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: