รู้จัก 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 จากฐานข้อมูลได้
ไม่มีความคิดเห็น:
แสดงความคิดเห็น