แสดงบทความที่มีป้ายกำกับ Date แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Date แสดงบทความทั้งหมด

วันอาทิตย์ที่ 29 สิงหาคม พ.ศ. 2553

VBA Excel ตอน เขียน vba แก้ปัญหาสูตร Datedif (จบ)

มาถึงตอนจบของ VBA Excel Series ของการแก้ปัญหา Datedif กันแล้วนะครับ ก่อนไปว่ากันในเนื้อหาของบทความตอนจบ ขอเล่านอกเรื่องซักหน่อยครับ วันที่เขียนบทความนี้ (29/8/2010) มีโอกาสไปดูหนังไทยเรื่องหนึ่ง เงา ครับ ไม่อยากบอกว่าหนังไทยเรื่องนี้เป็นหนังไทยที่ทำให้ผมผิดหวังอีกครั้งหนึ่ง ด้วยเนื้อหาที่พยายามจะป้อนให้ผู้ชมในเวลา 90 นาที กับเรื่องสั้นจำนวนสี่เรื่องที่ผมเองมองว่ามากเกินไป ทำให้ผมรู้สึกว่าถูกบีบบังคับให้ดูเรื่องย่อจริงๆ เห้อ ว่าแล้วขอไว้อาลัยกับหนังลักษณะนี้เลยครับ เทียบกับ 5 แพร่ง 4 แพร่งซึ่งมีเรื่องย่อยจำนวนพอกัน เทียบไม่ได้เลย ขอบ่นกันนิดหนึ่งครับ มาเข้าเรื่อง VBA Excel ของเรากันดีกว่าครับ จากที่ได้แสดงแนวการคิดและการใช้สูตรในชุด Date ของ Excel เข้ามาประยุกต์ใช้เพื่อหาค่า Year Diff , Mont Diff และ Day Diff ซึ่งจะพบว่ามีความยุ่งยากพอสมควรในการใช้งานกับ Excel ในบทความนี้เรามาเขียนฟังก์ชันสำหรับการคำนวณดังกล่าวด้วยเทคนิค VBA ของ Excel กันครับ มาดูกันเลยครับ เริ่มจาก กด Alt + F11 เพื่อเข้าสู่หน้าต่างของ Microsoft Visual Basic ในหน้าต่าง Editor ให้สร้างฟังก์ชันชื่อ MyDateDiff โดยมีรูปแบบดังนี้

Function MyDateDiff(Start_Date as Date,End_Date As Date , form as String) As integer

End Function

โดยมีคัวแปรที่ถูกส่งผ่านดังนี้

Start_Date คือวันเริ่มต้น เป็นตัวแปรชนิด Date

End_Date คือวันสิ้นสุด เป็นตัวแปรชนิด Date

form เป็น รูปแบบที่ต้องการให้ฟังก์ชันคำนวณ โดยในการสร้างฟังก์ชันนี้ผมขอยกตัวอย่างการคำนวณ Year Diff (ผลต่างจำนวนปี), Month Diff(จำนวนเดือนหลังคิดจำนวนปีแล้ว และ Day Diff (จำนวนวันหลังคิดผลของปีและเดือนแล้ว) โดยใช้รูปแบบเป็น “Y” , “MY” , “DY”

เขียน VBA Code ในฟังก์ชัน MyDateDiff ตามวิธีการของบทความที่ผ่านมาดังนี้

Option Explicit

Function MyDateDiff(Start_Date As Date, End_Date As Date, format As String) As Integer

Dim YDiff As Integer

Dim MDiff As Integer

Dim DDiff As Integer

Dim temp As Date

format = UCase(format) 'converted to uppercase

'switch Start_Date & End_Date

If Start_Date > End_Date Then

temp = Start_Date

Start_Date = End_Date

End_Date = temp

End If

' Year Diff

YDiff = Year(End_Date) - Year(Start_Date)

If DateSerial(Year(End_Date), Month(Start_Date), Day(Start_Date)) > End_Date Then

YDiff = YDiff - 1

End If

If format = "Y" Then

MyDateDiff = YDiff

End If

'Month Diff

If Month(End_Date) > Month(Start_Date) Then

If Day(End_Date) >= Day(Start_Date) Then

MDiff = Month(End_Date) - Month(Start_Date)

Else

MDiff = Month(End_Date) - Month(Start_Date) - 1

End If

Else

If Day(End_Date) >= Day(Start_Date) Then

MDiff = Month(End_Date) - Month(Start_Date) + 12

If MDiff = 12 Then

MDiff = 0

End If

Else

MDiff = Month(End_Date) - Month(Start_Date) + 11

End If

End If

If format = "MY" Then

MyDateDiff = MDiff

End If

'Day Diff

If Day(End_Date) >= Day(Start_Date) Then

DDiff = Day(End_Date) - Day(Start_Date)

Else

DDiff = Day(DateSerial(Year(End_Date), Month(End_Date), 0)) - Day(Start_Date) + Day(End_Date)

End If

If format = "DY" Then

MyDateDiff = DDiff

End If

End Function

จากฟังก์ชัน MyDateDiff ที่เขียนขึ้นใน VBA ท่านผู้อ่านสามารถเรียกใช้ได้ใน Worksheets ของ Excel โดยสามารถพิมพ์สูตรนี้ได้ในเซลล์ดังแสดงในภาพที่ 1

VBA ExcelMyDateDiff

ภาพที่ 1 ผลการคำนวณของ Excel จากการใช้ฟังก์ชัน MyDateDiff

ท่านผู้อ่านจะเห็นว่าจากแนวคิดการคำนวณของเราได้ถูกเขียนเป็นฟังก์ชันด้วย VBA และถูกเรียกใช้งานด้วย Excel ได้อย่างง่ายดาย ทำให้ปัญหาที่เราได้พบในบทความก่อนหน้านี้ได้ถูกขจัดไปอย่างสิ้นเชิง แต่จะเห็นได้ว่า ฟังก์ชันMyDateDiff ของเรายังสามารถพัฒนาให้มีความสามารถในการคำนวณจำนวนวันระหว่างวันเริ่มต้นและสิ้นสุด จำนวนเดือนระหว่างวันเริ่มต้นและสิ้นสุดได้อีก ซึ่งท่านผู้อ่านสามารถพัฒนาฟังก์ชัน MyDateDiff ได้เองครับ

จากการนำเสนอในบทความนี้นอกจากกการคำนวณเกี่ยวกับวันที่แล้วยังทำให้เราเห็นว่าเราสามารถสร้างฟังก์ชันการคำนวณขึ้นมาเอง (User define function) ด้วย VBA และสามารถเรียกใช้ฟังก์ชันนี้ผ่าน Excel ได้อย่างง่าย แต่ในขณะเดียวกันหากเราต้องการนำฟังก์ชันนี้ไปใช้กับไฟล์ Excel อื่นจะทำอย่างไร เดี๋ยวผมจะนำเสนอในบทความต่อไปหล่ะกันนะครับ เกี๋ยวกับการสร้างไฟล์ Add-In ใน Excel สวัสดีครับ

วันพฤหัสบดีที่ 26 สิงหาคม พ.ศ. 2553

VBA Excel : date format กรณี สูตร Datedif

สวัสดีครับท่านผู้อ่าน ช่วงนี้พบกันค่อนข้างบ่อยหน่อยนะครับ พอดีว่ามีปัญหาการใช้งาน Excel ของผู้ใช้มาให้ผมคิด ตามที่เราได้เกริ่นไปแล้วเรื่องของสูตร Excel ที่เกี่ยวข้องกับ date และ time ของข้อมูล ล่าสุด HR ของผมส่งแบบฟอร์ม Excel มาให้กรอกข้อมูลของพนักงานในฝ่ายเพื่อเป็นข้อมูลในการนำไปประกอบกิจกรรม Walk Railly ดังแสดงเป็นตารางได้ดังนี้ครับ

ชื่อ – นามสกุล

ชื่อเล่น

อายุงาน (ปี เดือน วัน)

อายุ(ปี)

A

A

1 ปี 2 เดือน 15 วัน

32









ตารางที่ 1 ข้อมูลที่ HR ต้องการจากผม

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

=datedif(วันเริ่ม,วันสิ้นสุด,รูปแบบระยะเวลาที่ต้องการแสดงผล)

โดยรูปแบบระยะเวลาที่ต้องการแสดงผลมีดังนี้

“Y” = ระยะห่างเป็นจำนวนปี

“M” = ระยะห่างเป็นจำนวนเดือนทั้งหมด

“D” = ระยะห่างเป็นจำนวนวันทั้งหมด

“YM” = จำนวนเดือนที่เหลือหลังนับปีแล้ว

“YD” = จำนวนเดือนที่เหลือหลังจากนับปีแล้ว

“MD” = จำนวนวันที่เหลือหลังจากนับเดือนแล้ว

เรามาดูตัวอย่างกันครับ

สมมุติผมเริ่มงานวันที่ 1 ตุลาคม 2548 หากนับอายุงานผมถึงวันที่ 26 สิงหาคม 2553 ผมจะมีอายุงานเท่าไหร่น๊อ

สมมุติผมกำหนดวันเริ่มงานผมในเซลล์ B1 เป็น 1/10/2005

กำหนดวันที่ต้องการคำนวณอายุงานไว้ที่เซลล์ B2 เป็น 26/8/2010

กำหนดให้อายุงานเป็นจำนวนวันอยู่ในเซลล์ B3 จะกำหนดสูตรได้เป็น

=Datedif(B$1,B$2,”D”) ผลที่ได้จะเป็น 1,790 วัน โว้ทำงานนานเหมือนกันนะเนี่ยผม

เมื่อทดลองใช้รูปแบบการแสดงผลอื่นๆจะแสดงได้ดังภาพที่ 1

Excel Date

ภาพที่ 1 ผลลัพธ์จาก Excel สำหรับการใช้รูปแบบของสูตร Datedif

คอลัมภ์ C แสดงสูตร Excel (Datedif) ที่แสดงผลลัพธ์ในคอมลัมภ์ B

ท่านผู้อ่านคงเห็นประโยชน์ของสูตร Excel สูตรนี้และคงคิดถึงการนำไปประยุกต์ใช้ในงานของท่านนะครับ ส่วนผมเองจากปัญหานี้เองทำให้นำไปใช้งานได้อีกเยอะเลยเช่น ด้าน HR ก็นำไปใช้เตือนระยะเวลาทดลองงานของพนักงานได้โดยปรับ Date ในเซลล์ B2 เป็น =Today() เท่านี้เราก็สามารถตรวจสอบระยะในการทดลองงานของพนักงานในแต่ละวันได้แล้วว่าถึงกำหนดรึยังเพื่อที่จะดำเนินการบรรจุพนักงานหรือดำเนินการประเมินผลงานของพนักงานได้อย่างเหมาะสมในช่วงเวลานั้น (ตามกฎหมายต้องไม่เกิน 119 วัน) ในด้านการซ่อมบำรุงรักษาเครื่องจักรก็สามารถนำไปใช้ในกำหนดตารางการบำรุงรักษาเครื่องจักรได้อย่างมีประสิทธิภาพ ในขณะที่บางอุตสาหกรรมผลิตภัณฑ์ที่จะนำออกสู่ตลาดต้องมีขั้นตอนการ Ageing เพื่อให้ผลิตภัณฑ์มีคุณภาพสูงที่สุด เราก็สามารถประยุกต์ใช้ฟังก์ชันนี้ในการตรวจสอบอายุของผลิตภัณฑ์ได้ หรือคนที่กำลังบันทึกผลสำหรับการประเมินผลงานด้วย KPI ก็สามารถประยุกต์ไปใช้ได้นะครับ ก็บอกแล้วครับว่ามี Excel หนึ่งโปรแกรมช่วยเราได้เยอะมากในการทำงาน เดี๋ยวบทความต่อไปผมจะนำเสนอสูตร Excel ในหมวด Date fuction อีกฟังก์ชันหนึ่ง ในการตรวจสอบระยะห่างระหว่างเวลา ท่านผู้อ่านคงอยากรู้ว่าทำไม Datedif ไม่เพียงพอเหรอ เอาเป็นว่าผมทิ้งคำถามไว้หล่ะกันครับว่า ทำไม Excel ถึงซ่อน สูตร Datedif ไว้ทำให้เราไม่สามารถเรียกใช้ได้จากเมนูบารื

ก่อนจบอย่าลืมข้อควรระวังในการคำนวณเกี่ยวกับวันที่ใน Excel นะครับ

Yahoo bot last visit powered by  Ybotvisit.com