หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์
เกาเหลาเทคนิคการใช้
HTML วิธีทำสร้าง
Shortcut บน Desktop
ปัญหาใหญ่ของ
Data transfer
วันเวลาตัวเลข
เรื่องวันที่ เวลา และ ตัวเลข เป็นเรื่องที่จำเป็นมากในการเขียนโปรแกรม ทางด้านธุรกิจ ตัวอย่างเช่นการคำนวณจำนวนวันในระหว่างวันที่ 2 วันที่ , การพิมพ์ตัวเลขให้มี Comma ,การปัดเศษเมื่อมีการคำนวนตัวเลข หรือการแปลงจำนวนเงินเป็นตัวหนังสือ เป็นต้น ผมจึงได้รวบรวมฟังชั่นต่างๆที่เกี่ยวข้องกับวัน เวลา และจำนวนเงิน ไว้ให้ท่านได้ Download โปรแกรมไปศึกษา หรือนำไปใช้งานก็ได้
การตรวจสอบสริงวันที่ทั้งไทยและอังกฤษ
ใน VB สามารถใช้ฟังก์ชั่น IsDate() เพื่อตรวจสอบวันที่ได้ แต่ไม่สามารถตรวจวันที่ไทยได้
ผมได้สร้างฟังก์ชั่นขึ้นมาตรวจสอบวันที่ภาษาไทยไว้ รวมทั้งตรวจสอบวันที่ภาษาอังกฤษด้วย ผมได้อธิบายบางส่วนในหัวข้อ การป้อนข้อมูล ในที่นี้จะอธิบายรายละเอียดอีกครั้ง
ใช้ปี 4 หลัก
txtDateC = ValidDate(txtDateC, "dd/mm/yyyy") 'เพื่อใช้ปีฝรั่งอักกฤษ
txtDateC = ValidDate(txtDateC, "mm/dd/yyyy") 'เพื่อใช้ปีฝรั่งอเมริกัน
txtDateC = ValidDate(txtDateC, "วว/ดด/ปปปป") 'เพื่อใช้ปีของพี่ไทย
ใช้ปี 2 หลัก
txtDateC = ValidDate(txtDateC, "dd/mm/yy") 'เพื่อใช้ปีฝรั่งอักกฤษ
txtDateC = ValidDate(txtDateC, "mm/dd/yy") 'เพื่อใช้ปีฝรั่งอเมริกัน
txtDateC = ValidDate(txtDateC, "วว/ดด/ปป") 'เพื่อใช้ปีของพี่ไทย
สำหรับฟังก์ชั่นนี้ ถ้าใส่วันที่ผิด ผลคือจะส่งค่า " / / " กลับมาให้เช่น
txtDateC = ValidDate("31/02/2541", "วว/ดด/ปปปป") จะส่งค่า " / / "
txtDateC = ValidDate("01/02/2541", "วว/ดด/ปปปป") จะส่งค่า "01/02/2541"
txtDateC = ValidDate("01/02/41", "วว/ดด/ปปปป") ป้อนปี 2 หลักจะส่งค่า "01/02/2541"
txtDateC = ValidDate("01/02", "วว/ดด/ปปปป") จะส่งค่า "01/02/2541" คือใส่ปีปัจจุบันมาให้
txtDateC = ValidDate("01022541", "วว/ดด/ปปปป") ไม่มี / จะส่งค่า "01/02/2541" กลับมา
txtDateC = ValidDate("010241", "วว/ดด/ปปปป") ไม่มี / จะส่งค่า "01/02/2541" กลับมา
txtDateC = ValidDate("0102", "วว/ดด/ปปปป") ไม่มี / จะส่งค่า "01/02/2541" กลับมาโดยใส่ปีปัจจุบันการแปลงค่าตัวแปรให้เป็นตัวแปรวันที่
ใน VB มีฟังก์ชั่นที่แปลงเป็นวันที่ 2 - 3 แบบ คือ CDate, DateValue และ DateSerial เช่น
Dim MyDate As Date
MyDate = DateValue("March 13, 1998")
MyDate = DateSerial(1998,3,13) '*** ใส่ปี เดือน วัน
ผมได้เขียนฟังก์ชั่น StrToDate ขึ้นมาเพื่อแปลงเป็นวันที่ให้ สามารถใช้วันที่ไทยได้
Dim MyDate As Date
MyDate = StrToDate("12/02/1998", "dd/mm/yyyy") 'เพื่อใช้ปีฝรั่งอักกฤษ
MyDate = StrToDate("12/02/98", "dd/mm/yyyy")
MyDate = StrToDate("12/02/2541", "วว/ดด/ปปปป") 'เพื่อใช้ปีของพี่ไทย
MyDate = StrToDate("12/02/41", "วว/ดด/ปปปป")
ก่อนใช้ StrToDate ต้องใช้ฟังก์ชั่น ValidDate ตรวจสอบวันที่ก่อนการแปลงวันที่ให้เป็นรูปแบบ(Format)ต่างๆ
ในกาแสดงวันที่ให้เป็นรูปแบบต่างๆ ปกติถ้าเป็นภาษาอังกฤษ เราใช้ฟังก์ชั่น Format ดังตัวอย่าง
Dim MyDate As Date
Dim MyStr As String
MyDate = DateSerial(1998,3,13) '*** ใส่ปี เดือน วัน
MyStr = Format(MyDate, "dd/mm/yyyy") '** 13/03/1998.
MyStr = Format(MyDate, "dd-mmm") '** 13-Mar
MyStr = Format(MyDate, "mmmm dd, yyyy") '** March 13, 1998".
MyStr = Format(MyDate, "dddd, mmmm d yyyy") '** Friday, March 13, 1998".
ผมได้ทำฟังก์ชั่น DFormat ขึ้นมาโดยใช้รูปแบบเดียวกับ Format แต่ยังขาด dddd เพื่อให้แสดงวันในสัปดาห์ เพราะว่าผมเองไม่ค่อยได้ใช้เลยไม่ได้ทำไว้ สำหรับ DFormat มีรูปแบบการใช้ดังนี้
MyStr = DFormat(MyDate, "วว/ดด/ปปปป") '** 13/03/2541
MyStr = DFormat(MyDate, "ด/ปปปป") '** 3/2541 ถ้า ด ตัวเดียวจะไม่แสเง 0 หน้าเดือน
MyStr = DFormat(MyDate, "วว-ดดด") '** 13-มี.ค. ดดด 3ตัวจะแสดงเดือนย่อ
MyStr = DFormat(MyDate, "วว ดดดด ปปปป") '** 13 มีนาคม 2541
MyStr = DFormat(MyDate, "ดดดด ปปปป") '** มีนาคม 2541
ตัวอย่างการใช้งานสามารถ Download ไปศึกษาได้การคำนวณหาวันที่ต้นเดือนและวันที่สิ้นเดือน
ในการหาวันที่ต้นเดือนและวันที่สิ้นเดือน ช่วยในการทำโปรแกรมได้แยะพอสมควร เช่นเราต้องการพิมพ์รายงานประจำเดือน เมื่อผู้ใช้ป้อนวันที่ต้อนเดือน เราให้ขึ้นวันที่สิ้นเดือน ผู้ใช้จะง่ายขึ้น
Dim FirstDate As Date
Dim LastDate As Date
FirstDate = DateSerial(Year(Date),Month(Date),1) '*** หาวันที่ต้นเดือนก่อน
LastDate = DateAdd("m",1,FirstDate) - 1 '*** เพิ่มเดือนอีก 1 ได้วันที่ต้นเดือนถัดไป ลบ 1 คือสิ้นเดือน
ท่านอาจนำไปสร้างเป็นฟังก์ชั่นก็ได้ ถ้าหากใช้บ่อย
มีวิธีใหม่ซึ่งง่ายดี ได้มาจากในเวบอื่น ดังนี้
LastDate = DateSerial(Year(Date), Month(Date), 0)
หรือจะใช้แบบนี้ก็ได้ สามารถนำไปใช้ภาษาอื่นได้สบาย
Public Function MonthEnd(pDate As Date) As Date
MonthEnd = (DateSerial(Year(pDate), Month(pDate), 28) + 4) _
- Day((DateSerial(Year(pDate), Month(pDate), 28) + 4))
End Function
แบบนี้สามารถนำไปใช้กับภาษาอื่นที่มีตัวแปรวันที่ได้เมื่อใช้ตัวแปรวันที่ลบกันจะได้ค่าเป็นจำนวนวัน
Days = EndDate - StartDate
ถ้าต้องการหาว่าอีก 30 วัน เป็นวันที่อะไร ให้นำไปบวก
NextDate = Date + 30
เมื่อต้องการหาวันในสัปดาห์
MyWeek = WeekDay(Date) '** 1-อาทิตย์ .... 7-เสาร์
ฟังก์ชั่น Day() , Month() และ Year() เพื่อหาวัน ,เดือน และ ปี ตามลำดับ
ใช้ฟังก์ชั่น DateAdd เพือ่คำนวนหาวันที่ เมื่อบวกด้วยช่วงเวลา เช่น
LastDate = DateAdd("m",1,"1-Jan-1998") '** เพิ่มเดือน อีก 1 เดือน ผลที่ได้คือ วันที่ 1 Feb 1998
LastDate = DateAdd("m",1,"31-Jan-1998") '** จะได้ 28 Feb 1998 เพราะเดือน Feb มี 28 วัน
ใช้ฟังก์ชั่น DateDiff เมื่อต้องการหาช่วงเวลา ในระหว่างช่วงวันที่ 2 วัน เช่น
Days = DateDiff("d", StartDate, EndDate) '*** หาจำนวนวันระหว่าง StartDate และ EndDate
Secords = DateDiff("s",StartTime,Now) '*** หาจำนวนวินาที
ปัญหาการใช้ SQL เพื่อเลือกช่วงวันที่ (11 พฤศจิกายน)
จริงๆผมควรจะเขียนเรื่องนี้ไว้ตั้งนานแล้วล่ะ เพราะเป็นปัญหาที่จุกจิกทีเดียว แล้วถ้าคนที่เพิ่งหัดใช้ VB จะมึนไปเลย จนหลายท่านหนีปัญหานี้ไปโดยไปเก็บแบบ String ซะนี่ การเก็บแบบตัวอักษรก็ยุ่งเหมือนงั้นเพราะว่าคุณต้องเก็บแบบ ปีเดือนวันไม่งั้นคุณก็เรียงตามวันที่ไม่ได้ ที่นี้การเก็บแบบ ปีเดือนวันคุณก็ต้องมาแปลงเป็นวันที่อีกนั้นแหละ
ปัญหามันอยู่ที่ตรงไหนกัน?
คำตอบก็คือปัญหาอยู่ที่ว่า การใช้วันที่ในการเลือกใน SQL นั้นต้องใช้รูปแบบ mm/dd/yyyy เท่านั้น บางท่านคงคิดไม่ถึง ยิ่งถ้าเพิ่งเริ่มใช้ละก็ปวดหัวแน่ และนอกจากนี้ปัญหายังอยู่ที่ฟังก์ชั่น Format อีก คือถ้าท่านใช้ฟังก์ชั่น Format(Date,"mm/dd/yyyy") แล้วใน Control Panel คุณเป็นEnglish ก็ไม่มีปัญหา แต่ว่าถ้าใน Control Panel เป็น Thai ละ โอ้โอ ฟังก์ชั่นนี้ดันกลายเป็นวันที่ปีพ.ศ. ซะนี่ แย่จริงๆ
แต่ไม่เป็นไรคุณ Download ฟังก์ชั่น DFormat ไปรับรองไม่มีปัญหาแล้วล่ะทีนี้ แต่อย่าลืมปิดหัวท้ายด้วย #
ดังตัวอย่าง
gSQL = " SELECT * FROM CostH WHERE (CostH.DocDate= #" & DFormat(Date,"mm/dd/yyyy") & "# ); "
ปัญหาการบันทึกค่าวันที่ (17 พฤศจิกายน)
ไหนๆจะอธิบายเรื่องวันที่แล้ว ในสัปดาห์นี้ขออธิบายเรื่องวันที่ต่ออีกสักหน่อย
ในการป้อนข้อมูลบนหน้าจอจะเป็นแบบ Text ถ้าคุณบันทึกวันที่แบบ Text ก็ไม่มีปัญหาอะไรเลย แต่ถ้าจะบันทึกเป็นแบบวันทีละก็ เกิดปัญหาแบบเดียวกัน ก็คือ ถ้าคุณบันทึกแบบนี้
Data1.Recordset!DocDate = txtDocDate
ก็จะเกิดปัญหาเกี่ยวกับเรื่อง Control Panel ที่เป็นภาษาไทยอีกนั่นแหละ ดังนั้นผมแก้ปัญหาเหล่านี้โดยเขียนฟังก์ชั่น ValidDate และ StrToDate ขึ้นมาซึ่งสามารถ Download ได้จากหัวข้อการป้อนข้อมูล (Entry.zip) ซึ่งเป็นตัวอย่างที่ผมทำขึ้นมา
สำหรับการเขียนโปรแกรม ถ้าจะให้ป้อนวันที่ไทยบนหน้าจอ คุณไม่สามารถที่จะ Bound TextBox กับ Database ได้เลย เพราะมีปัญหามากจริงๆ ดังนั้นควรใช้ UnBound แล้วเขียน Code ตามแบบนี้
Dim mValid As String
Dim gDateFormat As String
gDateFormat = "dd/mm/yyyy" '*** กรณีถ้าใช้ปีพ.ศ. ใช้ วว/ดด/ปปปป
ตอนบันทึกใช้ดังนี้
mValid = ValidDate(txtDocDate,gDateFormat)
If Trim(mValid) = "/ /" Then
Data1.Recordset!DocDate = Null
Else
Data1.Recordset!DocDate = StrToDate(mValid,gDateFormat)
End If
ส่วนกรณีนำค่าจาก Database มาแสดงบนจอ ให้ทำดังนี้
If IsNull(Data1.Recordset!DocDate) Then
txtDocDate = " / / "
Else
txtDocDate = DFormat(Data1.Recordset!DocDate,gDateFormat)
End If
นี่ละครับการจัดการเกี่ยวกับเรื่องวันที่ สำหรับผม หลังจากที่ปวดหัวเกี่ยวกับเรื่องวันที่ จนต้องสร้างฟังก์ชั่นใช้เอง และผมใช้รูปแบบนี้เขียนโปรแกรมมาตลอด หลังจากที่คุณได้อ่านถึงตรงนี้แล้ว เรื่องวันที่คงไม่ทำให้ท่านต้องเวียนหัวอีกต่อไป แต่ถ้าใครจะเก็บแบบ Text ก็ตามใจ สำหรับผมแล้วผมเก็บแบบวันที่มาตลอด และจะเก็บแบบวันที่ตลอดไป
ปัญหาการแสดงผลวันที่ใน Access95,97
ในการแสดงผลวันที่ใน Access 95,97 จะมีปัญหามาก วิธีแก้ไข ต้องแก้ที่ Register โดยทำตามขั้นตอนดังนี้
ไปปุ่ม Start->Run เรียกใช้โปรแกรม RegEdit
ไปที่ My Computer\HKEY_CURRENT_USER\Control Panel\International
เพิ่ม iDate = "1' ลงไป แล้ว Restart เครื่องใหม่
หากท่านต้องเขียนโปรแกรมเกี่ยวข้องกับงานของแผนกบุคคล แล้วละก็หนีไม่พ้นจะต้อง เขียนฟังก์ชั่นเพื่อคำนวณอายุอย่างแน่นอน นี่คือฟังก์ชั่นที่คำนวณอายุ
Public Function CalAge(BirthDate As Date, EndDate As Date) As Integer
Dim intAge As Integer
intAge = DateDiff("yyyy",BirthDate,EndDate)
If EndDate < DateSerial(Year(EndDate), Month(BirthDate), Day(BirthDate)) Then
intAge = intAge + 1
End If
CalAge = intAge
End Function
ไม่ต้องห่วงสำหรับคนที่เกิน 29 Feb เพราะฟังก์ชั่น DateSerial จะแปลงเป็น วันที่ 1 March ถ้าหากว่าในปีนั้นไม่มีวันที่ 29ระวังการใช้คำสั่งVal ในการแปลงค่าเป็นตัวเลข
ฟังก์ชั่น Val มี Bug ตรงที่ว่าไม่สามารถแปลงค่าที่มี Comma ได้
Val("123,456") จะได้ค่าแค่ 123
ทางแก้ไขคือให้เลี่ยงไปใช้ CDbl แทน
CDbl("123,456")
หรือใช้ฟังกชั่น StrToNum ที่ผมเขียนไว้การแปลงตัวเลขเป็นรูปแบบ(Format)ต่างๆ
เราสามารถใช้ Format เพื่อแสดงรูปแบบต่างๆได้ดังนี้
Format(8315.4,"00000.00") ผลที่ได้ 08315.40
Format(8315.4,"#####.##") ผลที่ได้ 8315.40
Format(8315.4,"##,##0.00") ผลที่ได้ 8,315.40
เมื่อตอนที่ผมเขียน VB ใหม่ๆ นึกว่าการแสดงรูปแบบตัวเลขมีอยู่แค่นี้ ทำให้มีปัญหาในการพิมพ์ คือเมื่อตัวเลข เป็นศูนย์ต้องการให้พิมพ์ช่องว่าง ในขณะที่ถ้าตัวเลขติดลบ ให้ใส่วงเล็บ แต่มาทราบตอนหลัง ว่า Format สามารถใช้พิมพ์ค่าเหล่านี้ได้สบาย จึงนำมาบอกให้ทราบ
Format(8315.4,"#,##0.00;(#,##0.00); ")
รูปแบบนี้สามารถพิมพ์ช่องว่าง เมื่อมีค่าเป็น 0 และ ใส่วงเล็บเมื่อมีค่าติดลบเนื่องจากใน VB มีแค่ฟังก์ชั่น Int() ให้ค่าจำนวนเต็ม และ Fix() ตัดเศษทิ้ง ไม่มีฟังก์ชั่นปัดเศษ ทศนิยม 2 ตำแหน่ง หรือมากกว่า ทำให้ต้องเขียนฟังก์ชั่นขึ้นมาใช้เอง ดังนี้
ฟังก์ชั่น Round ใช้ปัดเศษ
Public Function Round(ByVal pNumber As Double, ByVal pDigit As Integer) As Double
Dim mPlus As Double, mDivide As Double, mResult As Double
mDivide = 10 ^ pDigit
mPlus = 0.5 / mDivide
mResult = (pNumber + mPlus) * mDivide
Round = Int(mResult) / mDivide
End Functionฟังก์ชั่น Truncate ใช้ตัดเศษทิ้ง
Public Function Truncate(ByVal pNumber As Double, ByVal pDigit As Integer) As Double
Dim mDivide As Double, mResult As Double
mDivide = 10 ^ pDigit
mResult = pNumber * mDivide
Truncate = Int(mResult) / mDivide
End Function
ตัวอย่าง
Round((100 * 177) / 107, 2)
Truncate((100 * 177) / 107, 2)
หมายเหตุ
การคำนวณนั้นต้องใช้ตัวแปรชนิดเดียวกัน ถ้าไม่เหมือนต้องแปลงก่อน โดยใช้้ Function Ccur, CDbl, CInt ...
หากใช้ต่างชนิดกันเช่น Currency คูณกับ Single เศษอาจผิดพลาดได้
**** เตือนไว้ก่อนเดี๋ยวจะหาว่าหล่อไม่เตือน ****การแปลงตัวเลขจำนวนเงินเป็นคำอ่าน
สำหรับฟังก์ชั่นแปลงจำนวนเงินเป็นคำอ่าน เช่น 250.00 เป็น สองร้อยห้าสิบบาทถ้วน Function นี้ใช้มากในการพิมพ์ใบส่งสินค้า ใบเสร็จ หรือ อื่นๆ ผมจึงนำโปรแกรมนี้มาเผยแพร่ให้ผู้สนใจ ซึ่งมีทั้งภาษาไทย และภาษาอังกฤษ แต่คงไม่อธิบายรายละเอียด นะครับ
โปรแกรมแปลงเงินเป็นคำอ่านภาษาไทย/ภาษาอังกฤษDownloadได้ที่บทนำ
โปรแกรมแปลงเงินเป็นคำอ่านภาษาอังกฤษ DownLoad (ฝรั่งเขียน)ระวังเรื่องการคำนวณของตัวแปรต่างชนิดกัน
ผมเคยคำนวณ ตัวแปรที่เป็น Single กับ ตัวแปรที่เป็น Currency แล้วการปัดเศษ จะแปลกมาก เดี๋ยวปัดเศษ เดี๋ยวไม่ปัด กว่าจะหาที่ผิดเจอใช้เวลาเป็นวันๆ เนื่องจากผมลืมเขียนไว้แต่แรกนึกขึ้นได้เลยนำมาแจกให้ทราบ
สรุปได้ความว่า เวลาคุณจะคำนวณ ต้องกำหนดชนิดตัวแปรเหมือนกัน
ถ้าหากตัวแปรไม่เหมือนกันต้องแปลงให้เหมือนกันก่อน โดยใช้ ccur , cdbl, cint เป็นต้น