Your SlideShare is downloading. ×
แบ่งปัน แนวทางการประยุกต์ใช้ Macro & VBA บน Access
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

แบ่งปัน แนวทางการประยุกต์ใช้ Macro & VBA บน Access

7,753
views

Published on

แบ่งปัน แนวทางการประยุกต์ใช้ Macro & VBA บน Access

แบ่งปัน แนวทางการประยุกต์ใช้ Macro & VBA บน Access

Published in: Education

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,753
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
261
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 1/47 แนวทางการพัฒนาระบบงานบน Access การพัฒนาระบบงานใน Access 1. Macro 2. Coding (VBA) 3. ActiveX Control (Control) เครื่องมือสำาหรับติดต่อกับผู้ ใช้ Macro คือ? เป็นคำาสั่งที่ Access เตรียมไว้ให้เลือกใช้ตามเหตุการณ์ที่ ต้องการ สร้างแล้ว Save เลยไม่ต้องดับเบิลคลิกเหมือน Form, Report (ดูหน้า 25 เป็นต้นไปจะเป็น Action ของ Macro ทั้งหมด) Action แบ่งเป็น 2 ประเภท คือ 1. Action ที่ไม่ต้องการส่วนขยาย เช่น Show AllRecord 2. Action ที่ต้องการส่วนขยาย เช่น Close แนวคิดการสร้าง Macro สร้างได้ 2 วิธี 1. Macro ที่ไม่มี Macro ย่อย (เอาข้อความที่ปุ่มไปตั้งชื่อใน Macro Name) 2. Macro ที่มี Macro ย่อย (การตั้งชื่อ Macro หลักให้ตั้งชื่อ ตามชื่อฟอร์มนั้นๆ) หลักการสร้างและใช้งาน Macro 1. ต้องทราบว่า Macro ตัวไหนใช้กับวัตถุตัวไหน 2. ต้องทราบ Event Event ต่างๆ ที่ควรทราบ • On Click = Command Button, ListBox • On Dbl Click = ListBox • On GotFocus, LostFocus = ใช้คีย์บอร์ดเลื่อนโดยกด ปุ่ม Tab • On Mouse Down = กดเมาส์ค้างไว้ • On Mouse Up = ปล่อยเมาส์
  • 2. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 2/47 • On Mouse Move = เมาส์เลื่อนผ่าน (Control Tip Text) • On Key Down = กดแช่ • On Key up = ปล่อย • On Key Press = ใช้ใน VB6 มีตัวตรวจสอบได้ว่ากดปุ่ม อะไร (Ascie Code) • After Update = TextBox, ComboBox • On Current = Form • On Load = Form ปฏิบัติ Macro1 Macro ที่ไม่มี Macro ย่อย (Close) 1. นำาตาราง tblSale มาสร้างฟอร์มตั้งชื่อว่า frmSail 2. กำาหนด Form Header/Footer 3. กำาหนด Form Header ว่า Sale Detail (ใช้ Label) 4. กำาหนด Properties รูปภาพ Size Mode: Stretch 5. กำาหนด Form Footer เป็นปุ่ม Close (ใช้ Command Button) กำาหนด Properties ControlTipText ว่า ปิด ฟอร์มครับ 6. สร้าง Macro ใหม่ตั้งชื่อว่า macClose • Action = Close • Save = Promt 7. ที่ปุ่ม Close กำาหนด Event: On Click = macClose 8. วาดฟอร์มจากตารางที่เหลือทั้งหมด (ทำาตามขั้นตอนที่ 1 – 7) ปฏิบัติ สร้าง MainForm/SubForm (การสร้างจะต้องมีฟิลด์ที่ ลิงก์กัน) 1. สร้าง Mainform จากตาราง tblOrder ตั้งชื่อว่า mfrmOrder 2. สร้าง Subform (Wizard) จากตาราง tblOrder ตั้งชื่อว่า sfrmOrderDetail • เปลี่ยน DefaultView: Continuous Form • เปลี่ยนมุมมอง นำา Label ไปวางไว้บน Form Header
  • 3. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 3/47 • เพิ่ม Label ตั้งชื่อ Amount เพื่อนำา Item มาคูณ Price • เพิ่ม TextBox กำาหนด Property: Control Source = Item * Price • ที่ Form Footer เพิ่ม TextBox ตั้งชื่อว่า Total กำาหนด Property: Control Source = Sum(Item * Price) *** #Name (อ้างอิงชื่อผิด), #Error (ใส่สูตรผิด)
  • 4. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 4/47 ปฏิบัติ สร้างฟอร์มเมนูตั้งชื่อว่า frmMenu Main Menu Open Customer Open Sale Open Product Open Order Exit Database ปฏิบัติ Macro2 ที่มี Macro ย่อย (Open Form) 1. สร้าง Macro หลักชื่อ macMenu 2. สร้าง Macro ย่อย • OpenCustomer -> OpenForm -> frmCustomer • OpenSale -> OpenForm -> frmSale • OpenProduct -> OpenForm -> frmProduct • OpenOrder-> OpenForm -> frmOrder • ExitDatabase -> Quit 3. นำา Macro macMenu ไปกำาหนดให้กับปุ่มต่างๆ ในฟอร์ม frmMenu ปฏิบัติ สร้างฟอร์ม frmWelCome 1. สร้าง Macro ชื่อ macWelcome Action Action Argument OpenForm Formname: frmMenu Close Objectname: frmWelcome 2. เปิดฟอร์ม fmrWelcome กำาหนด Property ดังนี้ OnTimer macWelcome Time Interval 5000 ปฏิบัติ สร้าง Macro เพื่อกำาหนดให้ฟอร์มเปิดขึ้นเองอัตโนมัติ 1. สร้าง Macro ใหม่ตั้งชื่อว่า Autoexec Action FormName OpenForm frmWelcome 2. นำา Macro ไปกำาหนดที่ฟอร์ม frmWelcome ปฏิบัติ Macro3 ที่มี Macro แบบมี Condition
  • 5. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 5/47 1. สร้าง Macro ใหม่ชื่อ macOrder MacroN ame Action Where Condition OpenCu stomer OpenF orm frmCus tomer Cust_Number = Forms! mfrmOrder!Cust_Number PrintOrd er OpenR eport rptOrde r Order_Number=Forms! mfrmOrder!Order_Number 2. นำา Macro ไปกำาหนดให้กับฟอร์ม frmOrder การสร้าง Macro ค้นหา 1. การค้นหาข้อมูลครั้งละ 1 Record 2. การค้นหาข้อมูลครั้งละหลาย Record (Apply Filter) ปฏิบัติการค้นหาข้อมูลครั้งละ 1 Record 1. สร้างฟอร์มจากตาราง NwindEmployees ตั้งชื่อฟอร์มว่า frmEmployee 2. ที่ Form Header วาด TextBox ตั้งชื่อ Label: FindID, TextBox:txtFindID 3. สร้าง Macro ชื่อ macEmployee แล้วสร้าง Macro ย่อย ดังนี้ MacroName Action Action Argument FindEmId GotoControl ControlName: EmployeeID FindRecord Find What: =txtFindID 4. นำา macEmployee ไปกำาหนดเหตุการณ์ After Update ที่ txtFindID (สังเกตผล) 5. เพิ่มเติม MacroName: FindEmid ดังรูป Macro Name Condition Action Action Argument FindE mId GotoCo ntrol ControlName: EmployeeID FindRec Find What:
  • 6. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 6/47 ord =txtFindID GoToCo ntrol ControlName: txtFindID [txtFindID]<>[Employ eeId] MsgBox Find not Found, Critical, Find ID ... SetValu e Item: [txtFindID], Expression: “” ... GoToCo ntrol ControlName: txtFindID
  • 7. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 7/47 6. สร้าง Macro ต่อเพื่อไป SetFocus ตอนเปิดฟอร์มให้ Cursor อยู่ที่ txtFindID (ใช้เหตุการณ์ OnLoad) MacroName Condi tion Action Argument SetFocus GotoCon trol ControlName: txtFindID 7. สร้าง Macro ต่อเพื่อกำาหนดให้ txtFindID กับ EmployeeID ตรงกันตอนเลื่อน Record (กำาหนด เหตุการณ์ Form เป็น On Current) MacroNa me Condit ion Action Argument SetPointe r SetVal ue Item: txtFindID, Expression: EmployeeID ข้อจำากัดของการค้นข้อมูลครั้งละ 1 Record 1. Find Next ไม่ทราบว่าจะจบเมื่อไหร่ 2. Find Record เห็นทีละ Record 3. *** ถ้าต้องการค้นหาข้อมูลครั้งละหลายๆ Record ต้องใช้ Action ที่ชื่อ Apply Filter ขั้นตอนการค้นหาข้อมูลครั้งละหลายๆ Record 1. สร้าง Query ก่อน 2. นำา Query ที่ได้ไปสร้างฟอร์ม 3. วาด Combobox เพื่อเลือกดูข้อมูล 4. สร้าง Macro 5. กำาหนด Event: After Update ที่ ComboBox ปฏิบัติการค้นหาข้อมูลครั้งละหลายๆ Record (Apply Filter) 1. สร้าง Query โดยเลือกตารางทั้งหมดยกเว้น Nwind 2. ตั้งชื่อ Query ว่า qryAmount โดยเลือกฟิลด์ต่างๆ ดังนี้ 3. Cust_Number, Cust_Name, Order_Date, Product_Number, Product_Name, Item, Price 4. นำา qryAmount ไปสร้างฟอร์มดังขั้นตอนต่อไปนี้ 5. สร้างฟอร์มใหม่กำาหนดรูปแบบเป็น AutoForm: Tabbular ตั้งชื่อฟอร์มว่า frmAmount
  • 8. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 8/47 6. ที่ FormFooter วาด TextBox เพื่อสร้างเป็นตัวนับจำา นวณ Record ว่ามีกี่รายการ โดยพิมพ์สูตรที่ ControlSource ดังนี้ =” จำานวนข้อมูลทั้งสิ้น” & Count (Cust_Number) & “รายการ” 7. ที่ FormFooter วาด ComboBox มาวาดเพื่อเลือกดู Customer กำาหนด Property ดังนี้ • Name: cboCustomer • Row Source: tblCustomer • Limit To List: Yes (กำาหนดให้เลือกได้อย่างเดียว) • Column Count: 2 • Column Width: 1cm; 1.5cm • Bound Column: 1 8. สร้าง Macro ชื่อ macAmount สร้าง Macro ย่อยชื่อ Find Amount ดังนี้ (เสร็จแล้วนำาไปกำาหนดเหตุการณ์ After Update ที่ cboCustomer) Macro Name Action Argument Find Amount Applyfilter Where condition:Cust_Number=Forms! frmAmount!cboCustomer 9. สร้างปุ่ม All เพื่อแสดง Record ทั้งหมด จากนั้นสร้าง Macro ย่อยชื่อ AllRecord กำาหนด Action: ShowAllrecord 10. สร้างปุ่ม SortAmount กับปุ่ม SortOrderDate และ ปุ่ม Calculator โดยกำาหนด Macro ดังนี้ Macro Name Action Argument SortAmount GotoControl Amount RunCommand SortAscending SortOrderDate GotoControl Order_Date RunCommand SortDescending Calculator RunApp c:winntsystem 32calc.exe สรุปหัวข้อนี้
  • 9. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 9/47 • Event TextBox = After Update • Event ComboBox = After Update, Click • RunCommand = Run Menu หรือ ToolBar • RunApp = Run โปรแกรมอื่น (มีข้อแม้ว่าต้องไป Run file.exe เท่านั้น)
  • 10. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 10/47 การสร้างฟอร์มแบบ ListBox (แนวคิดตารางทั้ง 2 ตารางต้องมีฟิลด์ที่เหมือนกัน) ปฏิบัติการสร้างฟอร์ม ListBox ต้องการสร้างรายการ Sale และ Customer โดยมีเงื่อนไข ว่าเวลาเลือก Sale ต้องให้ปรากฏ Customer ของ Sale นั้นๆ 1. สร้างฟอร์มใหม่ตั้งชื่อ frmListBox 2. วาด ListBox ตัวแรกตั้งชื่อ Label: Sale แล้วกำาหนด Property ดังนี้ (เสร็จแล้วสังเกตผล) • Name:lstSasle • RowSource: tblSale • Column Count: 2 • Column Width: 1cm; 1.5cm • Bound Column: 1 3. วาด ListBox ตัวที่ 2 ตั้งชื่อ Label: Customer แล้ว กำาหนด Property ดังนี้ (เสร็จแล้วสังเกตผล) • Name:lstCustomer • RowSource: tblCustomer • คลิกที่ ... แล้วกำาหนดค่าดังรูป (เสร็จแล้ว Run ดูสิครับ ว่าเกิดปัญหาอะไรขึ้นบ้าง) • Column Count: 3 • Column Width: 1cm; 1cm; 1.5cm • Bound Column: 2 4. ทดลอง Run Form สังเกตผล (จะต้องเปิด/ปิดฟอร์ม รหัส จึงจะตรงกัน จะต้องแก้ไขด้วย Macro) 5. สร้าง Macro หลักตั้งชื่อว่า macListBox เมื่อสร้างเสร็จ แล้วนำาไปกำาหนดเหตุการณ์ On Click ให้กับ lstSale MacroName Action Argument UpdateCustomer Requery ControlName: lstCustomer
  • 11. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 11/47 6. วาด ListBox ตัวที่ 3 ตั้งชื่อ Label: Order แล้วกำาหนด Property ดังนี้ (เสร็จแล้วสังเกตผล) • Name:lstOrder • RowSource: คลิกที่ ... • เลือก Field: Cust_Number, Order_date, Product_Number, Product_Name, Item, Price, Amount:Item*Price • ที่ Cust_Number กำาหนด Criteria: [lstCustomer] • Column Count: 7 • Column Width: 1cm; 1.5cm; 1cm; 1.8cm; 1; 1.5; 1.5 • Bound Column: 3 7. ทดลอง Run Form สังเกตผล (จะต้องเปิด/ปิดฟอร์ม รหัส จึงจะตรงกัน จะต้องแก้ไขด้วย Macro) 8. สร้าง Macro เมื่อสร้างเสร็จแล้วนำาไปกำาหนดเหตุการณ์ On Click ให้กับ lstCustomer MacroName Action Argument UpdateOrder Requery ControlName: lstOrder 9. สร้าง Macro เพื่อไปเปิดฟอร์ม frmProduct โดยมีเงื่อนไข ให้รหัสที่เปิดตรงกันสร้าง Macro เมื่อสร้างเสร็จแล้วนำาไป กำาหนดเหตุการณ์ On DblClick ให้กับ lstOrder Macro Name Actio n Argument OpenPr oduct Open Form FormName: frmProduct View: Form Where Condition: Product_Number=Forms!frmListBox! lstOrder
  • 12. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 12/47 การสร้างฟอร์มแบบ Option Group ต้องการสร้างฟอร์มจากตาราง NwindCustomer โดย ต้องการดูกลุ่มลูกค้าเป็นกลุ่มดังนี้คือ A-E, F-J, K-O, P-T, U-Z, All สามารถทำาได้ดังนี้ครับ 1. สร้างฟอร์มจากตาราง NwindCustomer ตั้งชื่อว่า frmNwindCustomer 2. เพิ่ม Form Header, Footer 3. วาด Option Button บน Header 4. วาด Option Group โดยใช้ Wizard • Step1: Label Name (กำาหนดค่าที่จะนำาไปใช้ 6 ค่า ด้วยกันคือ A-E, F-J, K-O, P-T, U-Z, All) • Step2: กำาหนดค่า Default เป็น All • Step3: โปรแกรมจะบอกค่า Value เพื่อนำาไปกำาหนดใน Where Condition • Step4: เลือกให้โปรแกรมบันทึกค่านี้ไว้ • Step5: เลือกรูปแบบปุ่ม • Step6: ตั้งชื่อว่า fraCompany 5. สร้าง Macro ชื่อ macNwindCustomer ไปกำาหนด เหตุการณ์ On Click ที่ fraCompany Where Condition: CompanyName Like “[A-E]” การสร้าง Macro แบบ Auto 1. Autoexec (ไม่จำาเป็นต้องมี Macro ย่อย) Action Argument OpenForm Form: frmWelCome 2. Autokeys (จำาเป็นต้องมี Macro ย่อย เพราะต้องนำา Shortcut Key ไปตั้งชื่อ Macro ย่อย) MacroNa me Action Argument {F10} Quit ^m OpenForm frmMenu
  • 13. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 13/47 ^+P OpenReport rptOrder Macro Vs Coding (VBA) ข้อแตกต่างของ Macro / Coding 1. Coding ทำางานได้เร็วกว่า Macro 2. Coding ทำา Debug ได้ แต่ Macro ทำาไม่ได้ 3. Coding สร้างตัวแปรได้ Macro สร้างไม่ได้ 4. ใช้ Macro เป็น AutoKeys ได้เพียงอย่างเดียว 5. ดังนั้นระบบงานจริงๆ เราควรใช้ Coding หรือแปลง Macro เป็น Coding โดย Coding จะเก็บที่ Module (เวลาใช้งานกับฟอร์มต้อง Copy หรือ Move ไปที่ฟอร์ม นั้นๆ และต้องทราบด้วยว่าจะนำาไปใช้กับ Object ตัวไหน และจะใช้ใน Event ไหน) 6. Module ไว้เขียนฟังก์ชันการใช้งาน Macro 3 ชนิดที่ Coding ทำาไม่ได้ 1. Autoexec 2. Autokeys 3. Menubar ขั้นตอนการแปลง Macro เป็น Coding (Module) 1. คลิกขวาที่ Macro เลือก Save As • As: Module • Add error Handler…ให้โปรแกรมเขียนแก้ Error ให้อัตโนมัติ • Include macro Comment … ให้โปรแกรมเขียน Comment ให้อัตโนมัติ 2. ปรากฏ Coding ในหน้าต่าง VBA สีต่างๆ ใน Coding • สีเขียว = Comment (โปรแกรมไม่อ่าน) • สีนำ้าเงิน = Keyword Text (โปรแกรม) • สีดำา = ไม่ใช่คำาสงวน (โปรแกรมอ่าน) • สีแดง = Syntax Error Text (โปรแกรมอ่าน)
  • 14. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 14/47 ความหมายในการเขียนโปรแกรม 1. Procedure คือ โปรแกรมย่อย มี 2 ชนิด • Sub Procedure เขียนเพื่อเป็นเหตุการณ์ของวัตถุ • Function Procedure เขียนเพื่อช่วยในการคำานวณ / ทำางาน 2. Private Sub เขียนเพื่อเป็นเหตุการณ์ของวัตถุ แยกแต่ละ เหตุการณ์ ตระกูลของ VB 1. VBA -> MS Office ส่วนมากใช้พัฒนาระบบงานใน Access & Excel แปลงเป็น MDE ได้ลักษณะเดียวกับ EXE แต่ MDE สามารถเปิดดูตารางได้ เพราะฉะนั้นเราต้องสร้างความ ปลอดภัยในลักษณะไฟล์ MDW 2. VB (VB 6) -> Programming อย่างเดียวไม่มี Macro • ข้อดี คือ ใช้งานได้กว้างกว่ารวมถึงควบคุม Office ก็ได้ • ข้อเสีย คือ ยุ่งยาก • สามารถ Compile เป็น EXE. ได้ (แก้โค๊ดไม่ได้) 3. VB Script -> เป็นภาษาที่โต้ตอบ HTML ได้ (Web Site) 4. VB.NET -> เป็น Version ใหม่ (ถัดจาก VB 6) ใช้ สำาหรับงาน Web Service (สูงกว่า Web Site) • กินพื้นที่ 8 GB • ต้องมี Hardware เพียงพออย่างตำ่า 80 GB • ใช้งานได้ดีกับ Windows 2003 ปฏิบัติการแปลง Macro เป็น Coding (Module) 1. ให้แปลง Macro macClose กับ Macro macMenu 2. คัดลอกคำาสั่ง DoCmd.Close , "" 3. เปิดฟอร์ม frmCustomer 4. กำาหนด Event: OnClick เป็น Event Procedure 5. วางคำาสั่ง DoCmd.Close , "" 6. ทดลอง Run Programe ครั้งที่1
  • 15. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 15/47 7. ลบ Module macClose 8. ทดลอง Run Programe ครั้งที่2 9. คัดลอกคำาสั่งจาก macMenu ไปยังฟอร์ม frmMenu (ทำาลักษณะเดียวกับข้อ 2 – 8 เพิ่มเติมให้ตั้งชื่อปุ่มด้วย ครับ) Access Programming 1. Object Oriented Program (OOP) 2. Event Driven 3. Class • แบบมองเห็น (Control) • แบบมองไม่เห็น (VBA) ต้องประกาศตัวแปร และต้อง พิมพ์คำาสั่ง Set จึงจะใช้งานได้ 4. Object 5. Property 6. Method 7. Argument หลักการเขียนโปรแกรม พิมพ์ชื่อ Object แล้วตามด้วย Property หรือ Method โดยมีหลักการดังนี้ 1. Object.Property = Value 2. Object.Method ให้ตามด้วยเคาะวรรค อาจจะมี Argument หรือ ไม่มี Argument ก็ได้ หลักการตั้งชื่อ Object 1. ตั้งให้สื่อความหมาย 2. ใช้ภาษาอังกฤษ 3. ห้ามเกิน 255 ตัวอักษร 4. ห้ามขึ้นต้นด้วยตัวเลข 5. ห้ามซำ้ากัน 6. ควรใส่ Prefix นำาหน้าชื่อ Object ด้วยเพื่อบอกให้ทราบถึง ชนิดของ Object เปรียบเทียบความหมายของคำาใน Access กับ VBA 1. Action ใน Access = Method ใน VBA
  • 16. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 16/47 2. ac คือค่าคงที่ใน Access = vb ค่าคงที่ใน VBA 3. Cm คือหน่วยวัดใน Access = TWIP คือหน่วยวัดใน VBA 4. Yes, No ใช้ใน Access = True, False ใช้ใน VBA 5. ลำาดับที่ 1 ใน Access = ลำาดับที่ 0 ใน VBA (ComboBox, ListBox) ปฏิบัติทดสอบการเขียนโปรแกรม 1 1. สร้างฟอร์มใหม่ตั้งชื่อว่า frmTestVBA1 2. วาด TextBox ตั้งชื่อว่า txtTest 3. วาด Command Button ตั้งชื่อว่า cmdTest และตั้ง ชื่อ Caption ว่า Text กำาหนด Event: Onclick แล้ว เขียน Coding ดังนี้ (เปรียบเทียบกับ Property ใน ระหว่างเขียนเพื่อจะได้เข้าใจหลักการไปด้วย) Private Sub cmdTest_Click() txtTest.BackColor = 255 'Red txtTest.ForeColor = vbYellow txtTest.ControlTipText = "MyTest" txtTest.Locked = True txtTest.TextAlign = 2 'Center txtTest.Width = 2880 '5cm txtTest.Value = "Access VBA" End Sub ปฏิบัติทดสอบการเขียนโปรแกรม 2 1. วาด TextBox ตั้งชื่อว่า Text1 2. วาด Command Button ตั้งชื่อว่า cmdFocusText1 และตั้งชื่อ Caption ว่า Focus Text1 กำาหนด Event: Onclick แล้วเขียน Coding ดังนี้ Private Sub cmdFocusText1_Click() Text1.SetFocus End Sub ปฏิบัติทดสอบการเขียนโปรแกรม 3
  • 17. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 17/47 1. วาด Command Button ตั้งชื่อว่า cmdClose และตั้ง ชื่อ Caption ว่า Close กำาหนด Event: Onclick แล้ว เขียน Coding ดังนี้ Private Sub cmdClose_Click() DoCmd.Close , , acSaveYes End Sub ปฏิบัติทดสอบการเขียนโปรแกรม 4 1. วาด Command Button ตั้งชื่อว่า cmdExitProgram และตั้งชื่อ Caption ว่า Exit Program กำาหนด Event: Onclick แล้วเขียน Coding ดังนี้ Private Sub cmdExitProgram_Click() DoCmd.Quit acQuitSaveAll End Sub ปฏิบัติทดสอบการเขียนโปรแกรม 5 1. วาด Command Button ตั้งชื่อว่า cmdOpenEmployee และตั้งชื่อ Caption ว่า Open Employee กำาหนด Event: Onclick แล้วเขียน Coding ดังนี้ Private Sub cmdOpenEmployee_Click() DoCmd.OpenForm "frmEmployee" End Sub ปฏิบัติทดสอบการเขียนโปรแกรม 6 1. เปิดฟอร์ม mfrmOrder 2. กำาหนด Event: OnClick ที่ cmdOpenCustomer (…) แบบมีเงื่อนไขดังนี้ Private Sub cmdOpenCustomer_Click() DoCmd.OpenForm "frmCustomer", , , _ "Cust_number= !mfemOrder!Cust_number", , acDialog End Sub *** การขึ้นบรรทัดใหม่ให้เคาะ 1 เคาะแล้วตามด้วย เครื่องหมาย_ แล้ว Enter *** ไม่สามารถแยกหรือขึ้นบรรทัดระหว่างภายใน เครื่องหมายคำาพูดได้
  • 18. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 18/47
  • 19. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 19/47 Statement in VBA (คำาสั่งที่เสริมความสามารถให้กับ VBA ) 1. With…End With 2. If…End If 3. Select…End Select 4. Do…Loop 5. For…Next Exit Statement 1. Exit Do 2. Exit For 3. Exit Sub 4. Exit Function With…End With 1. ช่วยให้ไม่ต้องพิมพ์ชื่อวัตถุซำ้า 2. ทำาให้โปรแกรมทำางานได้เร็วขึ้น ปฏิบัติ With … End With 1. เปิดฟอร์ม frmTestVBA1 2. เปลี่ยนแปลง Coding ดังนี้ With txtTest .BackColor = 255 'Red .ForeColor = vbYellow ' .ControlTipText = "My Test" .TextAlign = 2 ' Center .Width = 2880 '5cm .Value = "Access" End With
  • 20. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 20/47 If…End If 1. ช่วยในการตัดสินใจ 2. อย่าไปปนกับฟังก์ชัน IF (แต่การใช้งานเหมือนกัน) If…End If เขียนได้ 2 แบบ 1. เขียนบรรทัดเดียว ไม่ต้องมี End If If condition Then Statement [Else elseStatements] ตัวอย่างที่1 If A>10 Then B=1 ตัวอย่างที่2 If A>10 Then B=1 Else B=2 2. เขียนหลายบรรทัด ต้องปิดท้ายด้วย End If If condition Then If A>10 Then Statements B=1 Else Else elseStatements B=2 End If End If ปฏิบัติ If…End If 1 สร้างฟอร์มใหม่โดยใช้ข้อมูลจากตาราง NwindEmployee ตั้งชื่อฟอร์มว่า frmPageBreak(IF) โดยใช้ Control PagePreak มาเป็นตัวแบ่งหน้าเป็น 2 หน้า 1. กำาหนด Form Header/Footer 2. สร้างปุ่มที่ Form Footer ตั้งชื่อปุ่มว่า cmdGotoPage ตั้งชื่อ Caption ว่า Goto Page2 3. เขียนโปรแกรม Event: On Click ที่ cmdGotoPage ดังนี้ Private Sub cmdGotoPage_Click() If cmdGotoPage.Caption = "Goto Page2" Then DoCmd.GoToPage 2 cmdGotoPage.Caption = "Goto Page1" Else DoCmd.GoToPage 1 cmdGotoPage.Caption = "Goto Page2" End If End Sub
  • 21. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 21/47 ปฏิบัติ If…End If 2 If condition-1 Then If Sale>=10000 Then Statements Commis = 0.1 ElseIf condition-2 Then ElseIf Sale>=5000 Then elseStatements Commis = 0.05 ElseIf condition-n Then ElseIf Sale>=3000 Then elseStatements Commis = 0.03 Else(นอกนั้นให้เป็น...) Else elseStatements Commis = 0 End If End If ปฏิบัติ 1. สร้างฟอร์มใหม่ตั้งชื่อ frmGrade 2. ต้องการตัดเกรดโดยสร้าง TextBox ชื่อ txtMark และ สร้าง Label ชื่อ lblGrade 3. กำาหนด Event: After Update ให้กับ txtMark และ เขียนโปรแกรมดังนี้ Private Sub txtMark_AfterUpdate() If txtMark.Value >= 80 Then lblGrade.Caption = "A" ElseIf txtMark.Value >= 70 Then lblGrade.Caption = "B" ElseIf txtMark.Value >= 60 Then lblGrade.Caption = "C" ElseIf txtMark.Value >= 50 Then lblGrade.Caption = "D" Else lblGrade.Caption = "F" End If End Sub
  • 22. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 22/47
  • 23. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 23/47 Select…End Select • คล้ายกับ IF • ช่วยให้พิมพ์โปรแกรมได้สั้นลง • จุดต่างกับ IF คือ • ถ้าเงื่อนไขเดียวใช้ IF • ถ้าเงื่อนไขเยอะๆ(โดยตรวจสอบจากสิ่งเดียว) ใช้ Select จะ เหมาะกว่า • ถ้าเงื่อนไขเยอะๆ(โดยตรวจสอบจากหลายสิ่ง) ใช้ IF จะ เหมาะกว่า รูปแบบ Select Case variable Select Case Sale Case value 1 Case Is >= 10000 (กรณีที่ 1) Statements Commis = 0.1 Case value 2 Case Is >= 5000 (กรณีที่ 2) Statements Commis = 0.05 Case value n Case Is >= 3000 (กรณีที่ 3) Statements Commis = 0.03 Case Else Case Else (กรณีที่ 4) elseStatements Commis = 0 End Select End Select ปฏิบัติ Select … End Select 1 แก้ไขโปรแกรมตัดเกรดจาก If เปลี่ยนมาเป็น Select ดังนี้ Private Sub txtMark_AfterUpdate() Select Case txtMark.Value Case Is >= 80 lblGrade.Caption = "A" Case Is >= 70 lblGrade.Caption = "B" Case Is >= 60 lblGrade.Caption = "C"
  • 24. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 24/47 Case Is >= 50 lblGrade.Caption = "D" Case Else lblGrade.Caption = "F" End Select End Sub ปฏิบัติ Select … End Select 2 1. สร้างฟอร์มใหม่ชื่อ frmOpenForm(SelectCase) 2. วาด ComboBox แล้วกำาหนด Properties ดังนี้ • Name: cboOpenForm • Row Source Type: Value List • Row Source: Customer; Sale; Product; Order 3. กำาหนด Event: After Update แล้วเขียนโปรแกรมดังนี้ Private Sub cboOpenForm_AfterUpdate() Select Case cboOpenForm.ListIndex Case 0 DoCmd.OpenForm "frmCustomer" Case 1 DoCmd.OpenForm "frmSale" Case 2 DoCmd.OpenForm "frmProduct" Case 3 DoCmd.OpenForm "frmOrder" End Select End Sub ปฏิบัติ Select…End Select 3 1. สร้างฟอร์มใหม่ตั้งชื่อ frmFrameVBA(Select) 2. วาด Frame ตั้งชื่อ fraProduct • วาด Option Button 4 ตัว ตั้งชื่อว่า None, Computer, Printer, Calculator ตามลำาดับ 3. วาด Image ตั้งชื่อ imgProduct 4. กำาหนด Event ของ fraProduct เป็น On Click แล้ว เขียนโปรแกรมดังนี้
  • 25. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 25/47 Private Sub fraProduct_Click() Select Case fraProduct.Value Case 1 imgProduct.Picture = "" Case 2 imgProduct.Picture = "C:AdvAccessAdvAccess- originalComputer.WMF" Case 3 imgProduct.Picture = "C:AdvAccessAdvAccess-originalPrinter.WMF" Case 4 imgProduct.Picture = "C:AdvAccessAdvAccess- originalCalculator.WMF" End Select End Sub สรุป 1. เวลาพิมพ์ Case อย่าลืมเคาะ 1 เคาะก่อนพิมพ์ค่า 2. Frame ใช้ . Value (1-n) 3. ComboBox, ListBox ใช้ .List Index (0-n) Do…Loop การทำาซำ้าตามเงื่อนไขที่กำาหนด เขียนได้ 2 แบบคือ 1. Do {While | Until} condition Statements Exit Do Statements Loop 2. Do Statements Exit Do Statements Loop {While | Until} condition
  • 26. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 26/47 Do {While | Until} condition ใช้ While หรือ Until แล้วตามด้วยเงื่อนไข • Do While ตราบใดที่เงื่อนไขเป็นจริงทำาไปเรื่อยๆ จนกว่าจะเป็นเท็จจึงจะออกจากลูป • Do Until ตราบใดที่เงื่อนไขเป็นเท็จทำาไปเรื่อยๆ จนกว่าจะเป็นจริงจึงจะออกจากลูป วิธีคิดสำาหรับการนำาไปใช้งาน • ทำาความเข้าใจโจทย์ เช่น รับชื่อลูกค้า 3 คน (รู้จำานวน) ใช้ Do While • ทำาความเข้าใจโจทย์ เช่น รับชื่อลูกค้าหลายคน พิมพ์ Exit จึงออกใช้ Do Until ตัวอย่างการเลือกใช้ Do While หรือ Do Until Counter = 0 Do While Counter < 20 Counter = Counter + 1 Print Counter Loop Counter = 0 Do Until Counter >= 20 Counter = Counter + 1 Print Counter Loop ปฏิบัติ Do…Loop 1 1. สร้างฟอร์มใหม่ตั้งชื่อ frmLoop 2. วาด Command Button ตั้งชื่อว่า cmdInputName 3. วาด Label ตั้งชื่อว่า lblName
  • 27. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 27/47 4. กำาหนด Event: On Click ที่ cmdInputName แล้วเขียน โปรแกรมดังนี้ Private Sub cmdInputName_Click() Do Until CuName = "Exit" Or CuName = “ออก” CuName = InputBox("Please enter Customer Name", "Input Data") If CuName = "Exit" Or CuName = “ออก” Then Exit Do lblName.Caption = CuName Loop End Sub For…Next เป็นคำาสั่งวนรอบเช่นเดียวกับ Do…Loop ต่างกันตรงที่ หลักการ 1. เป็นการวนลูปที่เป็นตัวแปร และมีจำานวนรอบที่ชัดเจน 2. หลัง for ต้องเป็นชื่อตัวแปร 3. หลัง Next ต้องเป็นชื่อตัวแปรเดียวกันกับ for 4. มี for เท่าไหร่มี Next เท่านั้น 5. Step คือการเพิ่มค่าครั้งละเท่าไหร่ส่วนใหญ่จะเป็น ครั้งละ 1 ใช้แทน Do ไม่ได้ รูปแบบ For Counter = start To end [Step step] Statements Exit For Statements Next Counter ตัวอย่าง For I = 1 To 10 Step 2 Print I For M = 1 To 5 …… Next M Next I
  • 28. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 28/47 ปฏิบัติ For…Next วาดปุ่ม Command Button 1 ปุ่ม ต้องการหาผลรวมของ ตัวเลขจาก 1 ถึง 10 สามารถเขียนโปรแกรมได้ดังนี้ Private Sub Command2_Click() For i = 1 To 10 m = m + i Next i MsgBox "Sum 1 To 10 =" & m End Sub ตัวแปร (Variable) • ตัวแปรทำาหน้าที่เก็บค่า, พักค่า • ตัวแปรจะหายไปเมื่อปิดฟอร์ม การใช้ตัวแปร ให้นึกถึงปัจจัย 3 ข้อนี้ • Name: ชื่อของตัวแปร • Type: ชนิดของตัวแปร • Lifetime: Scope ที่ตัวแปรสามารถใช้งานได้ Name: ชื่อของตัวแปร กฎในการตั้งชื่อตัวแปร Name  ต้องไม่เกิน 255 ตัวอักษร  ต้องขึ้นต้นด้วยตัวอักษร เช่น A-Z, a-z  ขอให้ตัวแรกเป็นตัวหนังสือเช่น A1 ได้ แต่ 1A ไม่ได้  ต้องไม่ซำ้ากับชื่อที่มีอยู่แล้วและไม่ซำ้ากับคำาสงวน Type: ชนิดของตัวแปร ต้องบอกว่าเป็นประเภทไหน ถ้าไม่บอกตัวแปรนั้นจะใหญ่ มาก  ตัวที่เก็บเลขจำานวนเต็ม 1. Byte น้อย เช่น เก็บอายุ 2. Integer ปานกลาง 3. Long มาก  ตัวที่เก็บเลขจำานวนเต็มและทศนิยม 1. Single ทศนิยมไม่เกิน 7 หลัก
  • 29. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 29/47 2. Double ทศนิยม 15 หลัก 3. Currency ทศนิยม 12 หลัก  String เก็บตัวอักษรและเก็บตัวเลขที่ไม่นำา ไปคำานวณ  Boolean เก็บค่า จริง/เท็จ  Date เก็บวันที่  Variant ถ้าไม่กำาหนดว่าเป็นตัวแปรชนิดไหน โปรแกรมจะให้เป็นชนิด Variant อัตโนมัติ ซึ่งจะ ทำาให้เปลืองพื้นที่อย่างตำ่า 16 Byte (เพราะฉะนั้นใน การกำาหนดตัวแปรแต่ละครั้งเราจะต้องบอกด้วยว่า ตัวแปรตัวนั้นเป็นชนิดอะไร) รูปแบบการประกาศตัวแปร Dim VariableName As type เช่น  Dim temp As Integer  Dim temp% (% = Integer)  Dim win (win=variant)  Dim intTemp As Integer  Dim strName As String  เวลาตั้งชื่อตัวแปรแนะนำาให้ตั้งชื่อย่อชนิดของตัวแปรด้วย  พิมพ์ Option Explicit ไว้บนสุด เพื่อบังคับให้ต้อง ประกาศตัวแปรก่อนนำาไปใช้งานเสมอ ปฏิบัติ Variable 1 1. เปิดฟอร์ม frmLoop 2. พิมพ์ Option Explicit บนบรรทัด Private Sub cmdInputName_Click() 3. ทดลอง Run Program โดยคลิกที่ปุ่ม Input Number 4. แก้ Error โดยประกาศตัวแปร Dim CuName As String 5. ทดลอง Run Program โดยคลิกที่ปุ่ม Sum 1 To 10 6. แก้ Error โดยประกาศตัวแปร Dim I As Byte และ Dim m As Integer
  • 30. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 30/47 ปฏิบัติ Variable 2 1. เปิดฟอร์ม frmGrade 2. ประกาศตัวแปร Dim Grade As String 3. แก้ไขโปรแกรมดังนี้ Dim Grade As String Select Case txtMark.Value Case Is >= 80 Grade = "A" Case Is >= 70 Grade = "B" Case Is >= 60 Grade = "C" Case Is >= 50 Grade = "D" Case Else Grade = "F" End Select lblGrade.Caption = Grade ปฏิบัติ Variable 3 1. เปิดฟอร์ม frmOpenForm(SelectCase) 2. แก้ไขโปรแกรมดังนี้ Private Sub cboOpenForm_AfterUpdate() Dim FormName As String Select Case cboOpenForm.ListIndex Case 0 FormName = "frmCustomer" Case 1 FormName = "frmSale" Case 2 FormName = "frmProduct" Case 3 FormName = "frmOrder" End Select DoCmd.OpenForm FormName End Sub
  • 31. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 31/47 Lifetime: Scope ขอบเขตที่ตัวแปรสามารถใช้งานได้ สามารถแบ่ง Scope ออกได้ 3 ระดับด้วยกันคือ 1. Sub Procedure -> Dim VariableName As type 2. Form -> Dim VariableName As type 3. Database -> Public VariableName As type ปฏิบัติ Lifetime 1 Sub Procedure 1. สร้างฟอร์มใหม่ตั้งชื่อฟอร์มว่า frmLifeTimeVariable 2. วาด TextBox และ Command Button อย่างละ 2 ตัว 3. เขียนโปรแกรมดังนี้ Private Sub Command2_Click() Dim Num1 As Integer Num1 = 100 Text0.Value = Num1 End Sub Private Sub Command5_Click() Num1 = Num1 + 100 Text3.Value = Num1 End Sub ปฏิบัติ Lifetime 2 Form 1. ใช้ฟอร์ม frmLifeTimeVariable 2. เขียนโปรแกรมดังนี้ Option Compare Database Option Explicit Dim Num1 As Integer Private Sub Command2_Click() Num1 = 100 Text0.Value = Num1 End Sub Private Sub Command5_Click() Num1 = Num1 + 100
  • 32. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 32/47 Text3.Value = Num1 End Sub ปฏิบัติ Lifetime 3 Database 1. เลือก Module 2. สร้าง Module ใหม่ Option Compare Database Option Explicit Public num1 As Integer 3. ทดลองนำาไปใช้กับ frmLifeTimeVariable ดูนะครับ ทำาความเข้าใจอีกมุมหนึ่งของตัวแปร  Standard Variable เช่น Integer, Byte  Object Variable เป็นตัวแปรประเภทวัตถุ เช่น เก็บ ชื่อตาราง, เก็บชื่อ Database, เก็บชื่ออื่นๆ ที่ไม่ใช่ Standard Procedure  Sub Procedure -> เขียนเพื่อเป็นเหตุการณ์ให้กับ วัตถุ  Function -> เขียนเพื่อคำานวณ หรือเป็นผู้ช่วยในการ ทำางาน (เขียนที่ Module) เกี่ยวกับฟังก์ชัน (Module) Function ใช้สำาหรับรับค่ามาคำานวณ เมื่อคำานวณแล้วคืน ค่าที่ได้จากการคำานวณกลับไป การสร้างฟังก์ชันสามารถทำาได้ 2 วิธีคือ 1. เขียนด้วยตนเอง 2. แทรกเข้ามาใช้งานได้เลย (ไฟล์นามสกุล *.bas) ตัวอย่างการเขียนฟังก์ชัน (Module)1 ต้องการเขียนฟังก์ชันคำานวณอายุโดยตั้งชื่อฟังก์ชันว่า HowOld สามารถทำาได้ดังขั้นตอนต่อไปนี้ 1. เลือก Module แล้วคลิกปุ่ม New ตั้งชื่อว่า mduMyFunction เพื่อสร้าง Function 2. เขียนฟังก์ชันดังนี้
  • 33. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 33/47 Function HowOld(Birthday As Date) As Byte HowOld = Year(Date) - Year(Birthday) End Function ตัวอย่างการเขียนฟังก์ชัน (Module) 2 ต้องการเขียนฟังก์ชันตัดเกรดโดยตั้งชื่อฟังก์ชันว่า Grade สามารถทำาได้ดังขั้นตอนต่อไปนี้ 3. Function Grade (Mark As String) As String 4. คัดลอกโปรแกรมมาจาก frmGrade Function Grade(Mark As String) As String Select Case Mark Case Is >= 80 Grade = "A" Case Is >= 70 Grade = "B" Case Is >= 60 Grade = "C" Case Is >= 50 Grade = "D" Case Else Grade = "F" End Select End Function การนำาฟังก์ชันสำาเร็จรูปเข้ามาใน Access 1. คลิกเลือก Module คลิก New 2. เลือกเมนู Insert, File 3. เลือก File of Type: Basic file (*.bas) 4. เลือกฟังก์ชัน (Module) ตามต้องการ ปฏิบัติการนำาฟังก์ชันสำาเร็จรูปเข้ามาใน Access Insert Module ชื่อ mduBahtText.bas กับ mduDateThai.bas เข้ามา การเรียกใช้ฟังก์ชันสามารถทำาได้ 3 วิธี ด้วยกันคือ 1. เรียกใช้ที่ Query 2. เรียกใช้ที่ Properties: Control Source 3. เรียกใช้ที่ Coding
  • 34. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 34/47 ปฏิบัติการเรียกใช้ฟังก์ชันที่ Query ต้องการคำานวณหาอายุลูกค้า 1. สร้าง Query ใหม่จากตาราง tblSale ตั้งชื่อ QrySale 2. ลาก Field ชื่อ Sale_Number, Sale_Name, Birthday มาวาง 3. เพิ่ม Field เพื่อคำานวณอายุ Age: HowOld([Birthday]) 4. ดูผลลัพธ์ ปฏิบัติการเรียกใช้ฟังก์ชันที่ Control Source1 ต้องการคำานวณด้วยฟังก์ชัน Bahttext 1. เปิดฟอร์มชื่อ mfrmOrder 2. วาด TextBox เปิด Properties เลือก Control Source 3. พิมพ์ =Bahttext([txtTotal]) 4. ดูผลลัพธ์ ปฏิบัติการเรียกใช้ฟังก์ชันที่ Control Source2 ต้องการคำานวณด้วยฟังก์ชัน DateThai 1. เปิดฟอร์มชื่อ mfrmOrder 2. วาด TextBox เปิด Properties เลือก Control Source 3. พิมพ์ =DateThai([Order_Date]) 4. ดูผลลัพธ์ ปฏิบัติการเรียกใช้ฟังก์ชันที่ Coding 1. ต้องการใช้ฟังก์ชัน Grade 2. เปิดฟอร์ม frmGrade 3. Comment โปรแกรมทั้งหมด 4. พิมพ์ lblGrade.Caption = Grade(txtMark.Value) 5. ดูผลลัพธ์ Debug Error Error มี 3 ชนิด 1. Statement Error: ตอนเขียนโปรแกรม (สีแดง) แก้ไข ตอนเขียนเลย 2. Runtime Error: ตอนรันโปรแกรม (สีเหลือง) ตอน เขียนไม่มีปัญหา แต่พอนำาไปใช้มีปัญหา เช่น ลืมประกาศ ตัวแปร 3. Logic Error: ผิดที่คนเขียน (เกี่ยวกับการคำานวณ)
  • 35. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 35/47 การเขียนโปรแกรมดัก Error 1. On Error Resume Next (เขียนไว้บนสุด) 2. On Error Goto Err_Handler (เขียนไว้บนสุด) ....................................................................... Err_Handler: (เขียนไว้ล่างสุด) ปฏิบัติ การเขียนโปรแกรมดัก Error 1. สร้างฟอร์มใหม่ ตั้งชื่อว่า frmError 2. วาด TextBox ตั้งชื่อว่า txtNum 3. วาด Command Button ตั้งชื่อว่า cmdInputNumber 4. ที่ cmdInputNumber กำาหนด Event: On Click แล้ว Coding ดังรูป Private Sub cmdInputNumber_Click() Dim intNum As Integer intNum = InputBox("Please enter number") txtNum.Value = intNum End Sub 5. Run Program • ทดลองป้อนตัวเลขไม่เกิน 5 หลัก • ทดลองป้อนตัวเลขเกิน 5 หลักโปรแกรมจะ Error OverFlow (6) • ทดลองป้อนตัวอักษรโปรแกรมจะ Error Type misMath (13) 6. แก้ Error ด้วย On Error Resume Next (เขียนไว้บนสุด) 7. หรือแก้ Error ด้วย On Error Goto Err_Handler (เขียนไว้บนสุด) ....Err_Handler: (เขียนไว้ล่างสุด) 8. พิมพ์ MsgBox “Error” ต่อจาก Err_Handler (เพื่อให้ผู้ ใช้ทราบว่า Error) 9. ทดลองป้อนข้อความ (จะขึ้นกล่องข้อความแจ้งให้ทราบว่า Error) 10. ทดลองป้อนตัวเลข (จะขึ้นกล่องข้อความแจ้งให้ทราบ ว่า Error เช่นกัน) ต้องพิมพ์คำาสั่ง Exit Sub ไว้บนบรรทัด Err_Handler: 11. แก้ไขกล่องข้อความในข้อที่ 8 เป็น MsgBox “Error is” & Err.Description (เพื่อให้โปรแกรมแจ้งให้ทราบว่า Error อะไร)
  • 36. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 36/47 12. หากต้องการให้แจ้ง Error เป็นภาษาไทย ต้องตรวจ สอบจากตัวเลขโค้ด โดยพิมพ์ไว้ล่างบรรทัด Err_Handler: ดังนี้ If Err.Number = 6 Then MsgBox "ป้อนตัวเลขเกิน" ElseIf Err.Number = 13 Then MsgBox "ป้อนตัวอักษร" End If 13. Run Program 14. Comment ข้อ 12 ทั้งหมด (เพื่อตรวจเช็คการแจ้ง Error ต่อไป) 15. แก้ไขกล่องข้อความในข้อที่ 8 เป็น MsgBox "Error is" & Err.Description & "Do you want to continue" 16. แก้ไขกล่องข้อความในข้อที่ 15 เป็น MsgBox "Error is" & Err.Description & vbCrLf & "Do you want to continue" 17. แก้ไขกล่องข้อความในข้อที่ 16 เป็น MsgBox "Error is" & Err.Description & vbCrLf & "Do you want to continue", vbCritical + vbYesNo 18. เขียนโปรแกรมเมื่อผุ้ใช้ตอบ Yes ให้กลับไปป้อน ข้อมูลใหม่ Dim bytError As Byte bytError = MsgBox("Error is" & Err.Description & vbCrLf & "Do you want to continue", vbCritical + vbYesNo) If bytError = vbYes Then Resume การตรวจสอบช่องว่าง หรือไม่มีการป้อนข้อมูล ต้องเปลี่ยน ชนิดของตัวแปรจาก Integer ไปเป็น String Dim intNum As Integer เป็น Dim intNum Ad String 19. เมื่อเปลี่ยนตัวแปรเป็น String แล้ว ต้องเพิ่มบรรทัดนี้ เข้าไปด้วย เพื่อตรวจสอบเฉพาะค่าที่เป็นตัวเลข (กรองเอา
  • 37. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 37/47 เฉพาะข้อมูลที่เป็นตัวเลข) intNum = Cint (intNum) 20. โปรแกรมที่สมบูรณ์ Private Sub cmdInputNumber_Click() On Error GoTo Err_Handler Dim intNum As String Input_Number: intNum = InputBox("Please enter number") If intNum = "" Then Exit Sub intNum = CInt(intNum) txtNum.Value = intNum Exit Sub Err_Handler: Dim bytError As Byte bytError = MsgBox("Error is" & Err.Description & vbCrLf & "Do you want to continue", vbCritical + vbYesNo) If bytError = vbYes Then Resume Input_Number End Sub
  • 38. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 38/47 Domain Aggregate Function (Dsum, Dcount, Dmax, Dmin, Davg, Dlookup) รูปแบบ: Dfunction (“FieldName”,”TableName”, [“Condition”]) ปฏิบัติ 1 1. สร้างฟอร์มใหม่ตั้งชื่อว่า frmDomain วาด TextBox 2 ตัว 2. ทดลองใช้ฟังก์ชัน Sum กับ Dsum เพื่อคำานวณหาผล รวมของ Amount ใน QryAmount ปฏิบัติ 2 ใช้ฟังก์ชัน Dlookup เพื่อนำาค่า Cust_Number ไปค้นหา Cust_Name ในตาราง tblCustomer 1. วาด TextBox 2 ตัว ตั้งชื่อ txtCust_Number กับ txtCust_Name ตามลำาดับ 2. ที่ txtCust_Number กำาหนด Event เป็น After Update แล้ว Coding Private Sub txtCust_Number_AfterUpdate() txtCust_Name.Value = DLookup("Cust_Name", "tblCustomer", _ "Cust_Number=Forms!frmDomain! txtCust_Number") End Sub ปฏิบัติ 3 1. เปิดฟอร์ม mfrmOrder 2. วาด Label 2 ตัว ตั้งชื่อว่า lblCust_Name กับ lblCust_Address ตามลำาดับ 3. กำาหนด Event ของ Cust_Number เป็น After Update แล้ว Coding Private Sub Cust_number_AfterUpdate() lblCust_Name.Caption = DLookup("Cust_Name", "tblCustomer",
  • 39. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 39/47 "Cust_Number = Forms!mfrmOrder! Cust_Number") lblCust_Address.Caption = DLookup("Cust_Address", "tblCustomer", "Cust_Number = Forms!mfrmOrder! Cust_Number") End Sub
  • 40. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 40/47 4. เขียน Debug ตอนเลือกแล้วไม่มีข้อมูลที่อยู่ (คนที่ชื่อ เสนีย์) มาแสดงผล Private Sub Cust_number_AfterUpdate() On Error GoTo Err_Handler lblCust_Name.Caption = DLookup("Cust_Name", "tblCustomer", "Cust_Number = Forms!mfrmOrder! Cust_Number") lblCust_Address.Caption = DLookup("Cust_Address", "tblCustomer", "Cust_Number = Forms!mfrmOrder! Cust_Number") Exit Sub Err_Handler: lblCust_Address.Caption = "" End Sub 5. กำาหนด Event ของ Form เป็น On Current Private Sub Form_Current() Call Cust_number_AfterUpdate End Sub 6. กำาหนด Event ของ Product_Number เป็น AfterUpdate เพื่อให้ค่า Price แสดงผลตาม Product_Number ที่เลือก Private Sub Product_number_AfterUpdate() Price.Value = DLookup("Unit_Price", "tblProduct", "Product_Number = Forms! mfrmOrder!sfrmOrderDetail.Form! Product_Number") End Sub
  • 41. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 41/47 การสร้างปุ่ม เปิดฟอร์ม frmEmployee 1. สร้างปุ่ม AddRecord ด้วย Wizard เขียนโปรแกรม ควบคุมดังนี้ Private Sub cmdAdd_Click() Dim intEmId As Integer DoCmd.GoToRecord , , acNewRec intEmId = DMax("EmployeeID", "NwindEmployees") EmployeeID.Value = intEmId + 1 LastName.SetFocus End Sub 2. สร้างปุ่ม DeleteRecord ด้วย Wizard เขียนโปรแกรม ควบคุมดังนี้ Private Sub cmdDelete_Click() DoCmd.SetWarnings False Dim bytDelete As Byte bytDelete = MsgBox("Are you sure delete these record?", _ vbCritical + vbYesNo, "Delete record") If bytDelete = vbYes Then DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 End If End Sub
  • 42. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 42/47 3. สร้างปุ่ม cmdFindEmID (โดยไม่ต้องใช้ Wizard) เข้าหน้าต่าง VBE) 1. เลือกเมนู Tools, References เลือก DAO (ยกเลิก ADO) 2. เขียนโปรแกรมควบคุมดังนี้ Private Sub cmdFindEmID_Click() On Error Resume Next Dim rs As Recordset Set rs = Me.RecordsetClone Dim EmID As String EmID = InputBox("Please enter EmployeeID", "Find ID") If EmID = "" Then Exit Sub rs.FindFirst "EmPloyeeID = " & EmID If rs.NoMatch = True Then MsgBox "Find not Found EmployeeID =" & EmID, vbCritical, "Find ID" Else Me.Bookmark = rs.Bookmark End If End Sub Microsoft Database Technology 1. ADO (Microsoft ActiveX Data Objects) for access all type of data. 2. RDO (Remote Data Objects) for ODBC data. 3. DAO (Data Access Objects) for local data (Microsoft Jet Engine Database)
  • 43. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 43/47 การเชื่อมต่อฐานข้อมูล (ADO, DAO) 1. สร้างฐานข้อมูลใหม่ 2 ไฟล์ ตั้งชื่อไฟล์ว่า Db1.mdb กับ Db2.mdb (Db1 = Table, Db2 = Form) 2. เขียนโปรแกรมเชื่อมต่อฐานข้อมูลดังนี้ Option Explicit Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Private Sub Form_Load() Set cnn = New ADODB.Connection cnn.Open " Provider= Microsoft.jet.OLEDB.4.0 ; " & _ "Data Source=C:AdvAccessDb1.mdb" Set rs = New ADODB.Recordset rs.Open "Sales", cnn, adOpenKeyset, adLockOptimistic txtSaID.Value = rs!Said txtSaName.Value = rs!SaName txtSaAddress.Value = rs!SaAddress End Sub 3. โปรแกรมที่สมบูรณ์ Option Compare Database Option Explicit Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Private Sub cmdMvFirst_Click() rs.MoveFirst Call ShowData End Sub
  • 44. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 44/47 Private Sub cmdMvLast_Click() rs.MoveLast Call ShowData End Sub Private Sub cmdMvNext_Click() rs.MoveNext If rs.EOF = True Then rs.MoveLast Call ShowData End Sub Private Sub cmdMvPrevious_Click() rs.MovePrevious If rs.BOF = True Then rs.MoveFirst Call ShowData End Sub Private Sub Form_Load() Set cnn = New ADODB.Connection cnn.Open " Provider= Microsoft.jet.OLEDB.4.0 ; " & _ "Data Source=C:AdvAccessDb1.mdb" Set rs = New ADODB.Recordset rs.Open "Sales", cnn, adOpenKeyset, adLockOptimistic Call ShowData End Sub Sub ShowData() txtSaID.Value = rs!Said txtSaName.Value = rs!SaName txtSaAddress.Value = rs!SaAddress lblPosition.Caption = "Record: " & rs.AbsolutePosition & "/ " & rs.RecordCount End Sub
  • 45. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 45/47 เรื่องการเปิดฟอร์ม adOpenDynamic = SQL, Oracle ขึ้นไป adOpenForwordOnly = ไปข้างหน้าอย่างเดียว adOpenKeyset = ทำาได้ทุกอย่าง (นิยมใช้งาน) adOpenStatic = เดินหน้าถอยหลังได้ แต่ Read Only เรื่องการ Lock Record adLockBathOptomistic = SQL, Oracle adLock ReadOnly = อ่านอย่างเดียว adLockOptimistic = วิธีใหม่ทำาให้ Lock ได้เร็วขึ้น adLock Pessimistic =เป็นการ Lock วิธีเดิม (ทำางาน ช้า)
  • 46. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 46/47 การสร้าง ToolBar, MenuBar การสร้าง ToolBar 1. สร้าง ToolBar ตั้งชื่อว่า My ToolBar โดยเลือกเมนู Tools, Customize เลือกบัตรรายการ Toolbars 2. เลือกบัตรรายการ Commands เพื่อเลือกปุ่มเครื่องมือที่ ต้องการ การสร้าง MenuBar 1. สร้าง Menu Bar ตั้งชื่อว่า My Menu โดยเลือกเมนู Tools, Customize เลือกบัตรรายการ Toolbars 2. คลิกปุ่ม Properties กำาหนด Type: Menu Bar 3. เลือกบัตรรายการ Commands เลือก Category: New Menu แล้วลากไปวางบน MyMenu การนำา ToolBar และ MenuBar ไปกำาหนดให้กับฟอร์ม 1. เปิดฟอร์มที่ต้องการ 2. เลือกฟอร์ม 3. กำาหนด Properties ให้กับฟอร์มดังนี้ • Menu Bar: My Menu • Tool Bar: My ToolBar การสร้าง Start Up Form 1. เลือกเมนู Tools, Startup…
  • 47. แบ่งปัน แนวทางการใช้งาน Macro & VBA บน Access 2003: สม เกียรติ ช่วยมาก หน้าที่ 47/47 การกำาหนด Security 1. เลือกเมนู Tools, Security, User Level Security Wizard 2. เลือก Create a new workgroup information file. 3. เลือก I want to Create a shortcut to Open my secured database 4. เลือก Object ที่ต้องการสร้างระบบความปลอดภัย 5. กำาหนดกลุ่ม ผู้ใช้ที่ต้องการ • Backup Operators (สำารองข้อมูล) • Full Data User (แก้ไขข้อมูลได้ทุกอย่าง แต่ กำาหนดสิทธิ์ไม่ได้) • Full Permission (ทำาได้ทุกอย่าง) • New Data User (เพิ่มผู้ใช้งานได้) • Project Designer (เขียนโปรแกรมได้) • Read Only User (อ่านอย่างเดียว) • Update Data User (แก้ไขข้อมูลผู้ใช้ได้) 6. เลือก No, the Users Group should not have any permissions 7. กำาหนดชื่อผู้ใช้งาน และรหัสผ่าน 8. กำาหนดชื่อผู้ใช้งานในข้อ 7. ให้อยู่ในกลุ่มที่ต้องการ 9. ขั้นตอนสุดท้ายจะมีรายงานแจ้งให้ทราบเกี่ยวกับราย ละเอียดทั้งหมด ตั้งแต่ในข้อที่ 1-8

×