วันอาทิตย์ที่ 13 กุมภาพันธ์ พ.ศ. 2554

2 : รู้จัก VBA ของ ACCESS

รู้จัก VBA ของ ACCESS

วัตถุประสงค์

แนะนำการเขียน VBA เข้าไปใน ACCESS และวางแนวคิดการเขียนโปรแกรม VISUAL BASIC เบื้องต้น และพาไปรู้จักกับการฝั่ง code ลง ใน Access

เนื้อหา

                ชุด Microsoft Office ที่เรามักติดตั้งไว้ประจำเครื่องของเรา จะมีส่วนที่เป็นเครื่องมือพัฒนาโปรแกรม ติดมาด้วย  หรือที่เรียกกันว่า Tools  สำหรับชุด Office , Tools  ที่ผนึกรวมเข้ามาก็คือ VBA ( Visual Basic for Application )  ใช้ลักษณะภาษาโปรแกรมเป็น ภาษา Basic   แต่ออกแบบมาเฉพาะ Application ตระกูล Office  บางท่านอาจจะเคยเข้าข้องแวะบ้างแล้ว  จากการทำ Macro ใน Word หรือ Excel   โดยแต่ละ Application ของ Office ก็มี VBA เฉพาะ เพื่องาน Office แต่ละตัว   สำหรับ Access ก็เป็น VBA สำหรับงาน Database โดยตรง   ในตอนนี้เราจะมาศึกษาภาษา VBA ของ Access กันหน่อยครับ

เขียนโปรแกรมใน ACCESS
                เราเขียนโปรแกรมคอมพิวเตอร์ ก็เพื่อสั่งให้คอมพิวเตอร์ทำงานตามที่เรากำหนด  ปัจจุบันเราเขียนโปรแกรมบน โปรแกรมอีกที   หมายความว่ามี โปรแกรมอย่าง Access มา แล้ว เราเข้าไปเขียนโปรแกรมติดเข้าไปใน Access  เพื่อให้สิ่งที่มีอยู่แล้วใน Access ลุกขึ้นมาทำโน่นทำนี่ให้เรา   สิ่งที่ผู้อ่านต้องทำความคุ้นเคยในการเรียนการเขียนโปรแกรมของ Access คือ
ภาษาที่เขียนเป็นอย่างไร
                ภาษาที่จะไปสั่งให้ทำงาน  มีรูปแบบภาษาอย่างไร  เช่นจะทำสูตรคำนวณประกันสังคม จะเปลี่ยนภาษาคนที่ทดในกระดาษ เป็นภาษาคอมพิวเตอร์อย่างไร    สำหรับ Access จะใช้ VBA หน้าตาเหมือนๆ Visual Basic เลยครับ  ท่านที่คุ้นเคยอยู่แล้ว จะเข้าใจได้เร็ว 
                เราใส่โปรแกรมไว้ตรงไหนได้บ้าง
                ความจริงเหมือนเป็นภาพรวมๆ ว่าเราจะเขียนโปรแกรมไปไว้ในส่วนใดได้บ้าง สั่งให้ทำงานอย่างไร  อย่าง Access ก็จะมี 2 ส่วนหลักคือ  คือเขียนโปรแกรมไว้ใน
1 Form / Report  เพื่อให้ แต่ละ Form/Report ทำงานตามที่เราต้อง  เช่นตอน click ปุ่ม  ค้นหารายการ  ก็เปิด Form อีก Form ที่เป็นหน้าจอค้นหาเป็นต้น
2 Module  คือเขียนโปรแกรมเพื่อเก็บเอาไว้ตรงกลาง ใครมาเรียกใช้ก็ได้  อย่างโปรแกรมคำนวณ VAT แทนที่เราจะใส่ไว้ทุก Form/Report เราเอามาไว้ที่ Module ดีกว่า เวลาเปลี่ยน VAT จะได้แก้ง่ายๆ     เสมือนเป็น Global ของ App ทั่วๆ ไป

รู้จัก TOOL เสียก่อน
            ขอแนะนำเครื่องมือเสียก่อนเลยนะครับ จะได้ลองทำตามได้เลย  ให้เข้าไปที่ MENU  Tool-> Macro -> Visual Basic Editor หรือกด Alt+F11 เลยก็ได้ครับ จะเปิดหน้าต่างนี้คือมา  เวลาจะกลับไปที่ Access หน้าเดิม ก้ Swicth ที่ Task bar นะครับ
            ภาพที่ 1 หน้าต่างสำหรับเขียนโปรแกรม

                รูปแบบที่เหมาะสมในการที่ผมแนะนำ จะเป็นตามภาพนะครับ  ประกอบด้วย 4 ส่วนหลักคือ
                1 Project Explorer (Hot key = CTRL+R )
                ส่วนที่แสดงรายการ code ที่มีใน Access ของเราตอนนี้     แบ่งเป็น 3 ส่วนคือ  ส่วนที่เราฝั่ง code ไว้ใน 1 Form/Report กับที่เป็น 2 Module และ 3 Class  สำหรับ Module และ Class จะเก็บไว้ในที่  Tab Module ในหน้าแรกของ Access     เราจะใช้เจ้าส่วน Project Explorer นี้ในการเลือกเข้าไปดู Code ในแต่ละชิ้น
                2 Coding Windows ( Hot key = F7 )
แสดงรายละเอียดโปรแกรมที่เราเขียน  จากการที่เรา Click เลือกจากส่วนของ Project Explorer             และเป็นพื้นที่ส่วนที่เราจะเข้าไปเขียนโปรแกรม ฝังใน Access
3 Properties ( Hotkey F4 )
แสดงค่า Properties หรือ ค่าติดตั้งต่างๆ ของ Form / Report ที่เรากำหลังเปิดหน้าจอ Coding อยู่ จากการ Click เลือกในส่วนที่ 2   หน้าต่างนี้ทำไว้เพื่อให้เราสะดวกในการทำโปรแกรม  เพราะขณะทำโปรแกรม เราจะไป Set Properties ของ Form/Report พวกนี้ในโปรแกรมตลอด จะได้ไม่ต้องกลับไปกลับมากับหน้า Access    
4 Debug Windows/Immediate Window ( Hot key = CTRL+G )
                ใช้สำหรับทำสอบ/ทดลอง โปรแกรม  เสมือนเป็นกระดาษทด แต่จะไม่ถูกนำไปเก็บในโปรแกรม 
หาก Windows ที่แสดงในเครื่องมีไม่เหมือนในภาพ ก็ให้เรียก Windows ออกมาเองโดยใช้ Hot Key หรือจะไป Click เปิดเองจาก Menu View ก็ได้ครับ     

รู้จักโครงสร้างภาษา VBA
                ผมขออธิบายแบบง่ายๆ เพื่อสะดวกในความเข้าใจนะครับ  เพราะหากอธิบายแบบ Text เกรงจะยืดยาว  เซียนโปรแกรมเมอร์ทั้งหลาย อ่านแล้วอาจรู้สึกขัดใจนะครับ
            องค์ประกอบ
ในส่วนของ Code  หรือเรียกว่า Class ก็ได้ มีลักษณะการจัดแบ่งเป็น 3 ส่วนหลักๆ ลองดูภาพที่ 2 ควบคู่กันไปนะครับ 
ภาพที่ 2 หน้าต่างสำหรับเขียนโปรแกรม

                1 ส่วนกำหนดค่า Option  สำหรับกำหนดเงื่อนไข  ให้ ACCESS ทำงานอย่างไร  เป็นการกำหนดตัวระบบ  ค่าที่เราใส่จะมีให้เลือกไม่มาก  ปกติให้กำหนด Option Explicit เป็นอย่างน้อยในบรรทัดแรก เพื่อบอกให้ Access รู้ว่า ตัวแปรทุกตัว ต้องประกาศชื่อ ก่อนใช้เสมอ
                2 ส่วนที่ประกาศตัวแปรกลาง    ตรงนี้อาจมีหลายๆ  บรรทัดเป็นที่ประกาศตัวแปรที่ใช้ร่วมกันของทั้ง Code  ในหน้าต่างนี้ เรามักจะพบคำว่า Dim , Global, Type, Const นำหน้า
                3 ส่วนที่เป็นโปรแกรมย่อยๆ  ที่เราเขียนโปรกรมเข้าไป   แต่ละชุดโปรแกรม สังเกตุง่ายๆ ว่าจะมี เส้นกั้น และจะมีคำว่า
  •  Sub แล้วจบด้วย End Sub  หรือ
  •  Function แล้วจบด้วย End Function
                เจ้า Sub หรือ Function อาจมีคำว่า Public หรือ Private นำหน้า  เพื่อบอกให้รู้ว่า  Sub / Function นั้น ถูกใช้ทั้ง Code ในหน้าต่างนี้ (Private) หรือ ให้หน้าต่างอื่นมาใช้ด้วย ( Public )
ทดลองทำ CODE ตัวอย่าง
1.       ขณะที่อยู่ในหน้าจอ Visual Basic Editor เลือก Menu Insert -> Module  หรือ หากใน Access ก็ให้ไปที่ Tab ของ Module แล้วกด New
2.       บันทึกโปรแกรมตามที่แสดงในภาพ ลงในส่วน Code
3.       ทดลองทดสอบค่าโดยไปที่ Immediate แล้วเริ่มด้วยการพิมพ์  คำสั่งดูตามนี้ดูนะครับ จบคำสั่งให้ เคาะ enter ด้วยนะครับ
คำสั่ง
ผลที่ได้
คำอธิบาย
call setVatrate(7,2)
ไม่มี
ตั้งค่า VAT ก่อนว่าจะใช้กี่ % และทศนิยมกี่ตำแหน่ง  7,2 หมายถึง VAT 7% ทศนิยม 2 ตำแหน่ง
? getVat(1000)
70
คำนวณ VAT
? getBaseVat(1000)
934.57
คำนวณฐานมูลค่าก่อน VAT
? getAmountVat(1000)
1070
คำนวณยอดรวม VAT

            การกำหนดค่าตัวแปร
การประกาศตัวแปรใช้คำสั่ง dim หรือ global  แล้วตามด้วยชื่อตัวแปร  2 แบบนี้ต่างกันตรงที่ global จะใช้กับโปรแกรมที่เราเขียนใน Module เท่านั้น ตัวแปรที่เป็น global  สามารถเรียกใช้งานได้จากทุกๆ โปรแกรมทั้งที่เขียนไว้ใน  form/report/หรือ module ต่างๆ     ปกติ ถ้าตัวแปรไหนไม่ได้ใช้งานระหว่าง form/report หรือ module เราจะไม่ทำเป็น global  เพื่อที่จะประหยัดหน่วยความจำกลาง   ส่วนใหญ่เราจึงใช้ dim เป็นหลัก
เวลาที่เรากำหนดตัวแปร หรือ dim เรามักเรียกว่า การประกาศเลือกทำได้ 2 ที่หลักๆ คือ
ประกาศใน Class ท่อนบนสุด
ตัวแปรพวกนี้ สามารถใช้งานได้ทั้งหน้า โดยจะเรียกใช้จากใน Sub ใดก็ได้ ที่อยู่ในหน้า code หน้าเดียวกัน  เช่น dim ใน form แล้วหากมี sub เล็กๆ ใน form ก็จะใช้ตัวแปรพวกนี้ได้    ตย ตัวแปรชื่อ VATRate, VATDigit, VatPower ที่แสดงในภาพที่ 2   เป็นการประกาศไว้บนบนเผื่อให้  โปรแกรมย่อย ที่เป็น function / sub มาเรียกใช้งาน ค่าที่อยู่ในตัวแปรพวกนี้ หมดอายุทันที่  form/report ถูกปิด  แต่ไปอยู่ใน Module ก็จะหมดอายุตอน Access ถูกปิดครับ
ประกาศใน Sub/Function
เราประกาศไว้เพื่อใช้พักในการคำนวณ  โปรแกรมที่เขียนหลัง dim ที่อยู่ใน sub เดียวกัน จึงจะใช้ได้ ถ้าดูจากภาพที่ 2 จะเห็นว่า ตัวแปรชื่อ CalTemp เป็นตัวแปรที่เขียนไว้ใต้ Function ทุกอัน   แสดงว่าตัวแปรนี้ใช้ใน  Function ใคร Function มัน   แม้จะตั้งชื่อเดียวกันค่าที่เก็บก็ไม่มากวนกัน   เพราะค่าที่อยู่ในตัวแปรพวกนี้ หมดอายุทันที่ ที่เจอคำว่า End Sub หรือ End Function
กำหนดประเภทตัวแปร
ปกติเราต้องบอกให้ ACCESS ทราบด้วยครับว่าตัวแปร  เป็นประเภทตัวเลข ตัวอักษร วันที่  ถ้าไม่บอกว่าอะไร เช่น Dim varX  เฉย varX ก็เป็นอะไรก็ได้    แต่ถ้าบอกว่า Dim varX as Integer  ก็กำลังบอกว่า VarX เป็นตัวแปรแบบจำนวนเต็มนะ  เพื่อความสะดวกลองดูใน Help นะครับ จะมีรายละเอียดตัวแปรทั้งหมด   แต่สำหรับ Appplication ทั่วไป  ไม่ต้องกำหนดก็ได้ครับ  ไม่ได้ให้ผลอะไรแตกต่างจนน่าตกใจ
แต่ละประโยคใน VBA
ภาษาคนก็พูดเป็นประโยค ภาษาคอมก็เหมือนกันครับ 1 ประโยคของ VB ก็ไม่ต้องจบประโยคด้วยเครื่องหมายอะไร อาศัยการขึ้นบรรทัดใหม่อย่างเดียว  ประโยคที่เห็นในภาพ เช่นใน Function SetVatRate ก็เป็นแทนค่า คือบอก Access ว่าเอาค่าที่อยู่ด้านขวามือ ของเครื่องหมาย เท่ากับ ไปใส่ที่ตัวแปรซ้ายมือ   ตรงนี้ไม่ได้ความว่า เท่ากับนะครับ

คำสั่งเงื่อนไข
คอมพิวเตอร์เก่ง 2 อย่างครับ  คือทำอะไรซ้ำๆ กับทำอยางมีเงื่อนไข   การสั่งเงื่อนไขใน Access ก็ ใช้ IF กับ CASE ครับ   , IF ก็คือ ถ้าครับ   ถ้าเป็นแบบนี้นี้ แล้วทำอะไร  ถ้าไม่ใช่ให้ทำอะไร  คำว่า แบบนี้ คือกำหนดตรง condition  ทำอะไรตอนใช่ กับ ไม่ใช่ ก็แยกตรง Else ครับ
SYNTAX
ตัวอย่าง
IF  CONDITION THEN
    TRUE COMMAND 1
    TRUE COMMAND 2
       ….
    TRUE COMMAND n
ELSE         
    FALSE COMMAND 1
    FALSE COMMAND 2
       ….
    FALSE COMMAND n
END IF
If HRX >= 8 And HRX <= 18 Then
       MsgBox "WELCOMR TO AR OFFICE"
Else
       MsgBox "NOT OFFICE HOUR"
End If
สำหรับ SELECT CASE  เป็นการกำหนดเงื่อนไขเหมือนกัน แต่จะแตกเงื่อนไขได้หลายๆ สาย  โดยอาศัยการเช็คค่าตัวแปร ใน ValCheck ว่า หากมีค่าเท่ากับ val1 ก็ทำชุดคำสั่ง val1 เป็นต้น  ตอนชุดท้ายเราใส่ case else ไว้ได้  สำหรับกรณีที่ไม่ตรงกับเงื่อนไขค่าไหนเลย
SYNTAX
ตัวอย่าง
Select Case ValCheck
    Case Val1
       COMMAND11
              COMMAND12
              ….
              COMMAND1N
    Case Val2
              COMMAND21
              COMMAND22
              ….
              COMMAND2N
    Case Else
              COMMANDM1
              COMMANDM2
              ….
              COMMANDMN
    End Select
sub CheckUSer(UserType)
    Select Case UserType
    Case “S”
       Msgbox(“You are Supervisor User”)
    Case “N”
       Msgbox(“You are Normal    
    Case “A”
       Msgbox(“You are Admin User”)
    Case Else
       Msgbox(“No usertype found “)
    End Select
End Sub

1st APP : Login
                มาลองทำโปรแกรม Login สำหรับไฟล์ Access ของคุณดูนะครับ โจทย์ก็คือ ถ้า Login โดยใส่ Username / Password ถูกต้อง และอยู่ในช่วง 08:00 – 18:00  จึงจะยอมให้ทำงานได้  แล้วไปเปิด FORM ตามที่ User ต้องการ  ตอนทำโปรแกรม ถ้า Access ถาม เพื่อจะสร้าง form หรือ control แบบ Wizard ให้ cancel นะครับ เพราะเราจะเขียนโปรแกรมกันเอง  
ภาพที่ 3 ตัวอย่างโปรแกรม LOGIN

1.       สร้าง Form 1 Form ครับ ตั้งชื่อ prgLogin
2.       วาง Control ที่เป็น Text Unbound 2 ชิ้น ตั้งชื่อให้เป็น txtLogin และ txtPassword
3.       สร้างปุ่ม 1  ใส่ caption ว่า OK
4.       Click ขวาที่ปุ่ม OK แล้วหาคำสั่ง Build Event แล้วเลือก Code Builder  จะได้ sub สำหรับใส่โปรแกรมในปุ่มนี้  แล้วทดลองใส่โปรแกรมตามภาพดูครับ 
5.       ทดลองเปิด FORM นี้ดู แล้วใส่ Username / Password ครับ
                Code ที่เราทำนี้เป็นการผูก code ไว้ใน Form ต่างกับ code ชุดแรกที่เราสร้างไว้ใน Module นะครับ  การเขียน code ลงใน form วิธีง่ายก็อย่างที่อธิบาย คือเปิด Form นั้น  แล้วชี้ไปที่ control ตัวนั้นๆ แล้วเลือก Build Event
 ที่เห็นในตัวอย่าง  มีการประกาศตัวแปร DIM HRX สำหรับเก็บชั่วโมงของ เวลาปัจจุบัน โดยใช้ Function ชื่อ Hour()  ร่วมกับ Now() 2 Function นี้เป็น Function ที่มากับ Access เองครับ    เมื่อได้เลขชั่วโมงเก็บไว้ในตัวแปรแล้ว เราก็มา Check เงื่อนไข หากเวลาปัจจุบัน อยู่ระหว่าง 8 ถึง 18 ก็ให้ค่อยมาตรวจ Login และ Password ถ้าเป็น เป็น uthai และ password คือ welcome ( เปลี่ยนเป็นของคุณเองเลยครับ ) ก็จะเปิด Form ด้วยคำสั่ง DOCMD.OPENFORM  ตรงนี้คุณเปลี่ยนเป็นชื่อ FORM ที่มีใน Access ของคุณเองนะครับ   แต่ใน ตย  ผมเรียก Form ชื่อ SYSMENU มา ชื่อ form อยู่เครื่องหมายคำพูดนะครับ
                สำหรับ MSGBOX เป็นคำสั่งสำหรับการแจ้งเตือนผู้ใช้  เราใช้เตือนตอนเงื่อนไข Else ว่า Password ไม่ตรง หรือ ไม่อยู่ในช่วงเวลสทำงาน

ผูกรวมเป็น FORM เดียว
                ในตอนแรกผมได้แนะนำการกำหนดให้ ค่า Startup ของ Access ไว้  คุณลองไปกำหนดที่ Menu Startup แล้วใช้ prgLOGIN นี้เป็น START UP FORM ของ ACCESS ดูนะครับ  คราวนี้ เราก็จะได้โปรแกรม LOGIN ที่เปิดขึ้นมาก่อนเข้าไปใช้ FORM ย่อยๆ ใน ACCESS ในตอนหน้าเราจะมาคุยกันต่อใน FUNCTION ที่มีใน ACCESS ต่อ  เพื่อให้โปรแกรม LOGIN ของเรา ไปอ่าน USERNAME PASSWORD จากฐานข้อมูลได้

ไม่มีความคิดเห็น:

แสดงความคิดเห็น