www.oocities.org/pontipa001


หน้าแรก
อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer

วันเวลาตัวเลข

เรื่องวันที่ เวลา และ ตัวเลข เป็นเรื่องที่จำเป็นมากในการเขียนโปรแกรม ทางด้านธุรกิจ ตัวอย่างเช่นการคำนวณจำนวนวันในระหว่างวันที่ 2 วันที่ , การพิมพ์ตัวเลขให้มี Comma ,การปัดเศษเมื่อมีการคำนวนตัวเลข  หรือการแปลงจำนวนเงินเป็นตัวหนังสือ เป็นต้น ผมจึงได้รวบรวมฟังชั่นต่างๆที่เกี่ยวข้องกับวัน เวลา และจำนวนเงิน ไว้ให้ท่านได้ Download โปรแกรมไปศึกษา หรือนำไปใช้งานก็ได้

  การตรวจสอบสตริงวันที่ทั้งไทยและอังกฤษ
  การแปลงค่าตัวแปรให้เป็นตัวแปรวันที่
  การแปลงวันที่ให้เป็นรูปแบบ(Format)ต่างๆ
  การหาวันที่ต้นเดือนและวันที่สิ้นเดือน
  ตัวแปรวันที่กับการคำนวณ
  การคำนวณหาอายุ
  ปัญหาการใช้ SQL เพื่อเลือกช่วงวันที่
  ปัญหาการบันทึกค่าวันที่
  ปัญหาวันที่ในการแสดงผลใน Access 95,97
  ระวังการใช้คำสั่ง Val ในการแปลงค่าเป็นตัวเลข
  การแปลงตัวเลขเป็นรูปแบบ(Format)ต่างๆ
  การปัดเศษและการตัดเศษทิ้ง
  การแปลงตัวเลขจำนวนเงินเป็นคำอ่าน
  ระวังเรื่องการคำนวณของตัวแปรต่างชนิด

การตรวจสอบสริงวันที่ทั้งไทยและอังกฤษ

   ใน 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 เป็นต้น