แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 1/41
แนวทางการพฒนาระบบงานบน Access
การพฒนาระบบงานใน Access 1. Macro 2. Coding (VBA) 3. ActiveX Control (Control) เคร�องมอสาหรบตดตอกบผใช
Macro คอ? เปนคาส�งท� Access เตรยมไวใหเลอกใชตามเหตการณท�ตองการ สรางแลว Save เลยไม
ตองดบเบลคลกเหมอน Form, Report (ดหนา 25 เปนตนไปจะเปน Action ของ Macro ทKงหมด) Action แบงเปน 2 ประเภท คอ
1. Action ท�ไมตองการสวนขยาย เชน Show AllRecord 2. Action ท�ตองการสวนขยาย เชน Close
แนวคดการสราง Macro สรางได 2 วธ
1. Macro ท�ไมม Macro ยอย (เอาขอความท�ปมไปตKงช�อใน Macro Name) 2. Macro ท�ม Macro ยอย (การตKงช�อ Macro หลกใหตKงช�อตามช�อฟอรมนKนๆ)
หลกการสรางและใชงาน Macro
1. ตองทราบวา Macro ตวไหนใชกบวตถตวไหน 2. ตองทราบ Event
Event ตางๆ ท3ควรทราบ
• On Click = Command Button, ListBox
• On Dbl Click = ListBox
• On GotFocus, LostFocus = ใชคยบอรดเล�อนโดยกดปม Tab
• On Mouse Down = กดเมาสคางไว
• On Mouse Up = ปลอยเมาส
• On Mouse Move = เมาสเล�อนผาน (Control Tip Text)
• On Key Down = กดแช
• On Key up = ปลอย
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 2/41
• On Key Press = ใชใน VB6 มตวตรวจสอบไดวากดปมอะไร (Ascie Code)
• After Update = TextBox, ComboBox
• On Current = Form
• On Load = Form ปฏบต Macro1 Macro ท�ไมม Macro ยอย (Close)
1. นาตาราง tblSale มาสรางฟอรมตKงช�อวา 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 ใหมตKงช�อวา macClose
• Action = Close
• Save = Promt 7. ท�ปม Close กาหนด Event: On Click = macClose 8. วาดฟอรมจากตารางท�เหลอทKงหมด (ทาตามขKนตอนท� 1 – 7)
ปฏบต สราง MainForm/SubForm (การสรางจะตองมฟลดท�ลงกกน)
1. สราง Mainform จากตาราง tblOrder ตKงช�อวา mfrmOrder 2. สราง Subform (Wizard) จากตาราง tblOrder ตKงช�อวา sfrmOrderDetail
• เปล�ยน DefaultView: Continuous Form
• เปล�ยนมมมอง นา Label ไปวางไวบน Form Header
• เพ�ม Label ตKงช�อ Amount เพ�อนา Item มาคณ Price
• เพ�ม TextBox กาหนด Property: Control Source = Item * Price
• ท� Form Footer เพ�ม TextBox ตKงช�อวา Total กาหนด Property: Control Source = Sum(Item * Price)
*** #Name (อางองช�อผด), #Error (ใสสตรผด)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 3/41
ปฏบต สรางฟอรมเมนตKงช�อวา 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 ดงนK
OnTimer macWelcome Time Interval 5000
ปฏบต สราง Macro เพ�อกาหนดใหฟอรมเปดขKนเองอตโนมต
1. สราง Macro ใหมตKงช�อวา Autoexec Action FormName OpenForm frmWelcome
2. นา Macro ไปกาหนดท�ฟอรม frmWelcome
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 4/41
ปฏบต Macro3 ท�ม Macro แบบม Condition 1. สราง Macro ใหมช�อ macOrder
MacroName Action Where Condition OpenCustomer OpenForm frmCustomer Cust_Number = Forms!mfrmOrder!Cust_Number PrintOrder OpenReport rptOrder Order_Number=Forms!mfrmOrder!Order_Number
2. นา Macro ไปกาหนดใหกบฟอรม frmOrder
การสราง Macro คนหา 1. การคนหาขอมลครK งละ 1 Record 2. การคนหาขอมลครK งละหลาย Record (Apply Filter)
ปฏบตการคนหาขอมลครK งละ 1 Record
1. สรางฟอรมจากตาราง NwindEmployees ตKงช�อฟอรมวา frmEmployee 2. ท� Form Header วาด TextBox ตKงช�อ Label: FindID, TextBox:txtFindID 3. สราง Macro ช�อ macEmployee แลวสราง Macro ยอยดงนK
MacroName Action Action Argument FindEmId GotoControl ControlName: EmployeeID FindRecord Find What: =txtFindID
4. นา macEmployee ไปกาหนดเหตการณ After Update ท� txtFindID (สงเกตผล) 5. เพ�มเตม MacroName: FindEmid ดงรป
MacroName Condition Action Action Argument FindEmId GotoControl ControlName: EmployeeID FindRecord Find What: =txtFindID GoToControl ControlName: txtFindID [txtFindID]<>[EmployeeId] MsgBox Find not Found, Critical, Find ID ... SetValue Item: [txtFindID], Expression: “” ... GoToControl ControlName: txtFindID
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 5/41
6. สราง Macro ตอเพ�อไป SetFocus ตอนเปดฟอรมให Cursor อยท� txtFindID (ใชเหตการณ OnLoad)
MacroName Condition Action Argument SetFocus GotoControl ControlName: txtFindID
7. สราง Macro ตอเพ�อกาหนดให txtFindID กบ EmployeeID ตรงกนตอนเล�อน Record (กาหนดเหตการณ Form เปน On Current)
MacroName Condition Action Argument SetPointer SetValue Item: txtFindID, Expression: EmployeeID ขอจากดของการคนขอมลครK งละ 1 Record
1. Find Next ไมทราบวาจะจบเม�อไหร 2. Find Record เหนทละ Record 3. *** ถาตองการคนหาขอมลครK งละหลายๆ Record ตองใช Action ท�ช�อ Apply Filter
ข5นตอนการคนหาขอมลคร5งละหลายๆ Record
1. สราง Query กอน 2. นา Query ท�ไดไปสรางฟอรม 3. วาด Combobox เพ�อเลอกดขอมล 4. สราง Macro 5. กาหนด Event: After Update ท� ComboBox
ปฏบตการคนหาขอมลครK งละหลายๆ Record (Apply Filter) 1. สราง Query โดยเลอกตารางทKงหมดยกเวน Nwind 2. ตKงช�อ Query วา qryAmount โดยเลอกฟลดตางๆ ดงนK 3. Cust_Number, Cust_Name, Order_Date, Product_Number, Product_Name, Item, Price 4. นา qryAmount ไปสรางฟอรมดงขKนตอนตอไปนK 5. สรางฟอรมใหมกาหนดรปแบบเปน AutoForm: Tabbular ตKงช�อฟอรมวา frmAmount 6. ท� FormFooter วาด TextBox เพ�อสรางเปนตวนบจานวณ Record วามก�รายการ โดยพมพ
สตรท� ControlSource ดงนK =” จานวนขอมลทKงสKน” & Count (Cust_Number) & “รายการ”
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 6/41
7. ท� FormFooter วาด ComboBox มาวาดเพ�อเลอกด Customer กาหนด Property ดงนK
• 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 ดงนK (เสรจแลวนาไป
กาหนดเหตการณ After Update ท� cboCustomer) Macro Name Action Argument Find Amount Applyfilter Where condition:Cust_Number=Forms!frmAmount!cboCustomer
9. สรางปม All เพ�อแสดง Record ทKงหมด จากนKนสราง Macro ยอยช�อ AllRecord กาหนด Action: ShowAllrecord
10. สรางปม SortAmount กบปม SortOrderDate และปม Calculator โดยกาหนด Macro ดงนK Macro Name Action Argument SortAmount GotoControl Amount RunCommand SortAscending SortOrderDate GotoControl Order_Date RunCommand SortDescending Calculator RunApp c:\winnt\system32\calc.exe สรปหวขอน5
• Event TextBox = After Update
• Event ComboBox = After Update, Click
• RunCommand = Run Menu หรอ ToolBar
• RunApp = Run โปรแกรมอ�น (มขอแมวาตองไป Run file.exe เทานKน)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 7/41
การสรางฟอรมแบบ ListBox (แนวคดตารางทKง 2 ตารางตองมฟลดท�เหมอนกน) ปฏบตการสรางฟอรม ListBox
ตองการสรางรายการ Sale และ Customer โดยมเง�อนไขวาเวลาเลอก Sale ตองใหปรากฏ Customer ของ Sale นKนๆ
1. สรางฟอรมใหมตKงช�อ frmListBox 2. วาด ListBox ตวแรกตKงช�อ Label: Sale แลวกาหนด Property ดงนK (เสรจแลวสงเกตผล)
• Name:lstSasle
• RowSource: tblSale
• Column Count: 2
• Column Width: 1cm; 1.5cm
• Bound Column: 1 3. วาด ListBox ตวท� 2 ตKงช�อ Label: Customer แลวกาหนด Property ดงนK (เสรจแลวสงเกต
ผล)
• Name:lstCustomer
• RowSource: tblCustomer
• คลกท� ... แลวกาหนดคาดงรป (เสรจแลว Run ดสครบวาเกดปญหาอะไรขKนบาง)
• Column Count: 3
• Column Width: 1cm; 1cm; 1.5cm
• Bound Column: 2 4. ทดลอง Run Form สงเกตผล (จะตองเปด/ปดฟอรม รหสจงจะตรงกน จะตองแกไขดวย
Macro) 5. สราง Macro หลกตKงช�อวา macListBox เม�อสรางเสรจแลวนาไปกาหนดเหตการณ On
Click ใหกบ lstSale MacroName Action Argument UpdateCustomer Requery ControlName: lstCustomer
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 8/41
6. วาด ListBox ตวท� 3 ตKงช�อ Label: Order แลวกาหนด Property ดงนK (เสรจแลวสงเกตผล)
• 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
MacroName Action Argument OpenProduct OpenForm FormName: frmProduct
View: Form Where Condition: Product_Number=Forms!frmListBox!lstOrder
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 9/41
การสรางฟอรมแบบ Option Group ตองการสรางฟอรมจากตาราง NwindCustomer โดยตองการดกลมลกคาเปนกลมดงนK คอ
A-E, F-J, K-O, P-T, U-Z, All สามารถทาไดดงนK ครบ 1. สรางฟอรมจากตาราง NwindCustomer ตKงช�อวา 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: เลอกใหโปรแกรมบนทกคานK ไว
• Step5: เลอกรปแบบปม
• Step6: ตKงช�อวา 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 ไปตKงช�อ Macro
ยอย) MacroName Action Argument {F10} Quit ^m OpenForm frmMenu ^+P OpenReport rptOrder
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 10/41
Macro Vs Coding (VBA)
ขอแตกตางของ Macro / Coding
1. Coding ทางานไดเรวกวา Macro 2. Coding ทา Debug ได แต Macro ทาไมได 3. Coding สรางตวแปรได Macro สรางไมได 4. ใช Macro เปน AutoKeys ไดเพยงอยางเดยว 5. ดงนKนระบบงานจรงๆ เราควรใช Coding หรอแปลง Macro เปน Coding โดย Coding จะ
เกบท� Module (เวลาใชงานกบฟอรมตอง Copy หรอ Move ไปท�ฟอรมนKนๆ และตองทราบดวยวาจะนาไปใชกบ Object ตวไหน และจะใชใน Event ไหน)
6. Module ไวเขยนฟงกชนการใชงาน
Macro 3 ชนดท3 Coding ทาไมได
1. Autoexec 2. Autokeys 3. Menubar
ข5นตอนการแปลง Macro เปน Coding (Module)
1. คลกขวาท� Macro เลอก Save As
• As: Module
• Add error Handler…ใหโปรแกรมเขยนแก Error ใหอตโนมต
• Include macro Comment … ใหโปรแกรมเขยน Comment ใหอตโนมต 2. ปรากฏ Coding ในหนาตาง VBA
สตางๆ ใน Coding
• สเขยว = Comment (โปรแกรมไมอาน)
• สนK าเงน = Keyword Text (โปรแกรม)
• สดา = ไมใชคาสงวน (โปรแกรมอาน)
• สแดง = Syntax Error Text (โปรแกรมอาน)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 11/41
ความหมายในการเขยนโปรแกรม 1. Procedure คอ โปรแกรมยอย ม 2 ชนด
• Sub Procedure เขยนเพ�อเปนเหตการณของวตถ
• Function Procedure เขยนเพ�อชวยในการคานวณ / ทางาน 2. Private Sub เขยนเพ�อเปนเหตการณของวตถ แยกแตละเหตการณ
ตระกลของ VB
1. VBA -> MS Office สวนมากใชพฒนาระบบงานใน Access & Excel แปลงเปน MDE ไดลกษณะเดยวกบ EXE แต MDE สามารถเปดดตารางได เพราะฉะนKนเราตองสรางความปลอดภยในลกษณะไฟล 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)
• กนพKนท� 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 ครK งท�1 7. ลบ Module macClose 8. ทดลอง Run Programe ครK งท�2
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 12/41
9. คดลอกคาส�งจาก macMenu ไปยงฟอรม frmMenu (ทาลกษณะเดยวกบขอ 2 – 8 เพ�มเตมใหตKงช�อปมดวยครบ)
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 โดยมหลกการดงนK 1. Object.Property = Value 2. Object.Method ใหตามดวยเคาะวรรค อาจจะม Argument หรอ ไมม Argument กได
หลกการต5งช3อ Object 1. ตKงใหส�อความหมาย 2. ใชภาษาองกฤษ 3. หามเกน 255 ตวอกษร 4. หามขKนตนดวยตวเลข 5. หามซKากน 6. ควรใส Prefix นาหนาช�อ Object ดวยเพ�อบอกใหทราบถงชนดของ Object
เปรยบเทยบความหมายของคาใน Access กบ VBA
1. Action ใน Access = Method ใน VBA 2. ac คอคาคงท�ใน Access = vb คาคงท�ใน VBA 3. Cm คอหนวยวดใน Access = TWIP คอหนวยวดใน VBA
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 13/41
4. Yes, No ใชใน Access = True, False ใชใน VBA 5. ลาดบท� 1 ใน Access = ลาดบท� 0 ใน VBA (ComboBox, ListBox)
ปฏบตทดสอบการเขยนโปรแกรม 1 1. สรางฟอรมใหมตKงช�อวา frmTestVBA1 2. วาด TextBox ตKงช�อวา txtTest 3. วาด Command Button ตKงช�อวา cmdTest และตKงช�อ Caption วา Text กาหนด Event:
Onclick แลวเขยน Coding ดงนK (เปรยบเทยบกบ 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 ตKงช�อวา Text1 2. วาด Command Button ตKงช�อวา cmdFocusText1 และตKงช�อ Caption วา Focus Text1
กาหนด Event: Onclick แลวเขยน Coding ดงนK Private Sub cmdFocusText1_Click()
Text1.SetFocus
End Sub ปฏบตทดสอบการเขยนโปรแกรม 3
1. วาด Command Button ตKงช�อวา cmdClose และตKงช�อ Caption วา Close กาหนด Event: Onclick แลวเขยน Coding ดงนK
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 14/41
Private Sub cmdClose_Click() DoCmd.Close , , acSaveYes
End Sub
ปฏบตทดสอบการเขยนโปรแกรม 4 1. วาด Command Button ตKงช�อวา cmdExitProgram และตKงช�อ Caption วา Exit Program
กาหนด Event: Onclick แลวเขยน Coding ดงนK Private Sub cmdExitProgram_Click() DoCmd.Quit acQuitSaveAll End Sub
ปฏบตทดสอบการเขยนโปรแกรม 5 1. วาด Command Button ตKงช�อวา cmdOpenEmployee และตKงช�อ Caption วา Open
Employee กาหนด Event: Onclick แลวเขยน Coding ดงนK Private Sub cmdOpenEmployee_Click()
DoCmd.OpenForm "frmEmployee"
End Sub ปฏบตทดสอบการเขยนโปรแกรม 6
1. เปดฟอรม mfrmOrder 2. กาหนด Event: OnClick ท� cmdOpenCustomer (…) แบบมเง�อนไขดงนK
Private Sub cmdOpenCustomer_Click() DoCmd.OpenForm "frmCustomer", , , _
"Cust_number= !mfemOrder!Cust_number", , acDialog
End Sub
*** การขKนบรรทดใหมใหเคาะ 1 เคาะแลวตามดวยเคร�องหมาย_ แลว Enter *** ไมสามารถแยกหรอขKนบรรทดระหวางภายในเคร�องหมายคาพดได
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 15/41
Statement in VBA
(คาส3งท3เสรมความสามารถใหกบ 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. ชวยใหไมตองพมพช�อวตถซK า 2. ทาใหโปรแกรมทางานไดเรวขKน
ปฏบต With … End With 1. เปดฟอรม frmTestVBA1 2. เปล�ยนแปลง Coding ดงนK
With txtTest
.BackColor = 255 'Red
.ForeColor = vbYellow '
.ControlTipText = "My Test"
.TextAlign = 2 ' Center
.Width = 2880 '5cm
.Value = "Access"
End With
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 16/41
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 ตKงช�อฟอรมวา
frmPageBreak(IF) โดยใช Control PagePreak มาเปนตวแบงหนาเปน 2 หนา 1. กาหนด Form Header/Footer 2. สรางปมท� Form Footer ตKงช�อปมวา cmdGotoPage ตKงช�อ Caption วา Goto Page2 3. เขยนโปรแกรม Event: On Click ท� cmdGotoPage ดงนK
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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 17/41
ปฏบต 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(นอกนKนใหเปน...) Else elseStatements Commis = 0 End If End If
ปฏบต
1. สรางฟอรมใหมตKงช�อ frmGrade 2. ตองการตดเกรดโดยสราง TextBox ช�อ txtMark และสราง Label ช�อ lblGrade 3. กาหนด Event: After Update ใหกบ txtMark และเขยนโปรแกรมดงนK 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 18/41
Select…End Select
• คลายกบ IF
• ชวยใหพมพโปรแกรมไดสKนลง
• จดตางกบ 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 ดงนK
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" Case Is >= 50
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 19/41
lblGrade.Caption = "D" Case Else lblGrade.Caption = "F" End Select End Sub
ปฏบต Select … End Select 2
1. สรางฟอรมใหมช�อ frmOpenForm(SelectCase) 2. วาด ComboBox แลวกาหนด Properties ดงนK
• Name: cboOpenForm
• Row Source Type: Value List
• Row Source: Customer; Sale; Product; Order 3. กาหนด Event: After Update แลวเขยนโปรแกรมดงนK
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. สรางฟอรมใหมตKงช�อ frmFrameVBA(Select) 2. วาด Frame ตKงช�อ fraProduct
• วาด Option Button 4 ตว ตKงช�อวา None, Computer, Printer, Calculator ตามลาดบ 3. วาด Image ตKงช�อ imgProduct
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 20/41
4. กาหนด Event ของ fraProduct เปน On Click แลวเขยนโปรแกรมดงนK Private Sub fraProduct_Click() Select Case fraProduct.Value Case 1 imgProduct.Picture = "" Case 2 imgProduct.Picture = "C:\AdvAccess\AdvAccess-original\Computer.WMF" Case 3 imgProduct.Picture = "C:\AdvAccess\AdvAccess-original\Printer.WMF" Case 4 imgProduct.Picture = "C:\AdvAccess\AdvAccess-original\Calculator.WMF" End Select End Sub สรป
1. เวลาพมพ Case อยาลมเคาะ 1 เคาะกอนพมพคา 2. Frame ใช . Value (1-n) 3. ComboBox, ListBox ใช .List Index (0-n)
Do…Loop
การทาซKาตามเง�อนไขท�กาหนด เขยนได 2 แบบคอ
1. Do {While | Until} condition
Statements
Exit Do
Statements
Loop
2. Do Statements Exit Do Statements
Loop {While | Until} condition
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 21/41
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. สรางฟอรมใหมตKงช�อ frmLoop 2. วาด Command Button ตKงช�อวา cmdInputName 3. วาด Label ตKงช�อวา lblName
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 22/41
4. กาหนด Event: On Click ท� cmdInputName แลวเขยนโปรแกรมดงนK
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 เทานKน 5. Step คอการเพ�มคาครK งละเทาไหรสวนใหญจะเปนครK งละ 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 23/41
ปฏบต For…Next วาดปม Command Button 1 ปม ตองการหาผลรวมของตวเลขจาก 1 ถง 10 สามารถเขยน
โปรแกรมไดดงนK Private Sub Command2_Click()
For i = 1 To 10
m = m + i
Next i
MsgBox "Sum 1 To 10 =" & m
End Sub
ตวแปร (Variable)
• ตวแปรทาหนาท�เกบคา, พกคา
• ตวแปรจะหายไปเม�อปดฟอรม การใชตวแปร ใหนกถงปจจย 3 ขอน5
• Name: ช�อของตวแปร
• Type: ชนดของตวแปร
• Lifetime: Scope ท�ตวแปรสามารถใชงานได
Name: ช3อของตวแปร
กฎในการตKงช�อตวแปร Name � ตองไมเกน 255 ตวอกษร � ตองขKนตนดวยตวอกษร เชน A-Z, a-z
� ขอใหตวแรกเปนตวหนงสอเชน A1 ได แต 1A ไมได � ตองไมซK ากบช�อท�มอยแลวและไมซKากบคาสงวน
Type: ชนดของตวแปร
ตองบอกวาเปนประเภทไหน ถาไมบอกตวแปรนKนจะใหญมาก � ตวท�เกบเลขจานวนเตม
1. Byte นอย เชน เกบอาย 2. Integer ปานกลาง
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 24/41
3. Long มาก
� ตวท�เกบเลขจานวนเตมและทศนยม 1. Single ทศนยมไมเกน 7 หลก 2. Double ทศนยม 15 หลก 3. Currency ทศนยม 12 หลก
� String เกบตวอกษรและเกบตวเลขท�ไมนาไปคานวณ � Boolean เกบคา จรง/เทจ � Date เกบวนท� � Variant ถาไมกาหนดวาเปนตวแปรชนดไหนโปรแกรมจะใหเปนชนด
Variant อตโนมต ซ� งจะทาใหเปลองพKนท�อยางต�า 16 Byte (เพราะฉะนKนในการกาหนดตวแปรแตละครK งเราจะตองบอกดวยวาตวแปรตวนKนเปนชนดอะไร)
รปแบบการประกาศตวแปร
Dim VariableName As type เชน
� Dim temp As Integer � Dim temp% (% = Integer) � Dim win (win=variant) � Dim intTemp As Integer � Dim strName As String � เวลาตKงช�อตวแปรแนะนาใหตKงช�อยอชนดของตวแปรดวย � พมพ Option Explicit ไวบนสด เพ�อบงคบใหตองประกาศตวแปรกอนนาไปใชงาน
เสมอ
ปฏบต Variable 1
1. เปดฟอรม frmLoop 2. พมพ Option Explicit บนบรรทด Private Sub cmdInputName_Click() 3. ทดลอง Run Program โดยคลกท�ปม Input Number 4. แก Error โดยประกาศตวแปร Dim CuName As String
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 25/41
5. ทดลอง Run Program โดยคลกท�ปม Sum 1 To 10 6. แก Error โดยประกาศตวแปร Dim I As Byte และ Dim m As Integer
ปฏบต Variable 2 1. เปดฟอรม frmGrade 2. ประกาศตวแปร Dim Grade As String 3. แกไขโปรแกรมดงนt
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. แกไขโปรแกรมดงนK
Private Sub cboOpenForm_AfterUpdate() Dim FormName As String
Select Case cboOpenForm.ListIndex Case 0
FormName = "frmCustomer" Case 1
FormName = "frmSale"
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 26/41
Case 2 FormName = "frmProduct"
Case 3 FormName = "frmOrder" End Select DoCmd.OpenForm FormName
End Sub
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. สรางฟอรมใหมตKงช�อฟอรมวา frmLifeTimeVariable 2. วาด TextBox และ Command Button อยางละ 2 ตว 3. เขยนโปรแกรมดงนK
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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 27/41
ปฏบต Lifetime 2 Form 1. ใชฟอรม frmLifeTimeVariable 2. เขยนโปรแกรมดงนK
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 Text3.Value = Num1
End Sub ปฏบต Lifetime 3 Database
1. เลอก Module 2. สราง Module ใหม
Option Compare Database Option Explicit Public num1 As Integer
3. ทดลองนาไปใชกบ frmLifeTimeVariable ดนะครบ
ทาความเขาใจอกมมหน3งของตวแปร
� Standard Variable เชน Integer, Byte � Object Variable เปนตวแปรประเภทวตถ เชน เกบช�อตาราง, เกบช�อ Database,
เกบช�ออ�นๆ ท�ไมใช Standard Procedure
� Sub Procedure -> เขยนเพ�อเปนเหตการณใหกบวตถ � Function -> เขยนเพ�อคานวณ หรอเปนผชวยในการทางาน (เขยนท� Module)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 28/41
เก3ยวกบฟงกชน (Module)
Function ใชสาหรบรบคามาคานวณ เม�อคานวณแลวคนคาท�ไดจากการคานวณกลบไป การสรางฟงกชนสามารถทาได 2 วธคอ
1. เขยนดวยตนเอง 2. แทรกเขามาใชงานไดเลย (ไฟลนามสกล *.bas)
ตวอยางการเขยนฟงกชน (Module)1
ตองการเขยนฟงกชนคานวณอายโดยตKงช�อฟงกชนวา HowOld สามารถทาไดดงขKนตอนตอไปนK
1. เลอก Module แลวคลกปม New ตKงช�อวา mduMyFunction เพ�อสราง Function 2. เขยนฟงกชนดงนK
Function HowOld(Birthday As Date) As Byte HowOld = Year(Date) - Year(Birthday) End Function
ตวอยางการเขยนฟงกชน (Module) 2
ตองการเขยนฟงกชนตดเกรดโดยตKงช�อฟงกชนวา Grade สามารถทาไดดงขKนตอนตอไปนK 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 29/41
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
ปฏบตการเรยกใชฟงกชนท� Query
ตองการคานวณหาอายลกคา 1. สราง Query ใหมจากตาราง tblSale ตKงช�อ 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 30/41
3. พมพ =DateThai([Order_Date]) 4. ดผลลพธ
ปฏบตการเรยกใชฟงกชนท� Coding
1. ตองการใชฟงกชน Grade 2. เปดฟอรม frmGrade 3. Comment โปรแกรมทKงหมด 4. พมพ lblGrade.Caption = Grade(txtMark.Value) 5. ดผลลพธ
Debug Error
Error ม 3 ชนด 1. Statement Error: ตอนเขยนโปรแกรม (สแดง) แกไขตอนเขยนเลย 2. Runtime Error: ตอนรนโปรแกรม (สเหลอง) ตอนเขยนไมมปญหา แตพอนาไปใชมปญหา เชน ลมประกาศตวแปร 3. Logic Error: ผดท�คนเขยน (เก�ยวกบการคานวณ)
การเขยนโปรแกรมดก Error
1. On Error Resume Next (เขยนไวบนสด) 2. On Error Goto Err_Handler (เขยนไวบนสด)
....................................................................... Err_Handler: (เขยนไวลางสด)
ปฏบต การเขยนโปรแกรมดก Error
1. สรางฟอรมใหม ตKงช�อวา frmError 2. วาด TextBox ตKงช�อวา txtNum 3. วาด Command Button ตKงช�อวา cmdInputNumber 4. ท� cmdInputNumber กาหนด Event: On Click แลว Coding ดงรป
Private Sub cmdInputNumber_Click()
Dim intNum As Integer
intNum = InputBox("Please enter number")
txtNum.Value = intNum
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 31/41
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. ทดลองปอนขอความ (จะขKนกลองขอความแจงใหทราบวา Error) 10. ทดลองปอนตวเลข (จะขKนกลองขอความแจงใหทราบวา Error เชนกน) ตองพมพคาส�ง
Exit Sub ไวบนบรรทด Err_Handler: 11. แกไขกลองขอความในขอท� 8 เปน MsgBox “Error is” & Err.Description (เพ�อให
โปรแกรมแจงใหทราบวา Error อะไร) 12. หากตองการใหแจง Error เปนภาษาไทย ตองตรวจสอบจากตวเลขโคด โดยพมพไวลาง
บรรทด Err_Handler: ดงนK If Err.Number = 6 Then
MsgBox "ปอนตวเลขเกน"
ElseIf Err.Number = 13 Then
MsgBox "ปอนตวอกษร"
End If
13. Run Program 14. Comment ขอ 12 ทKงหมด (เพ�อตรวจเชคการแจง 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 ใหกลบไปปอนขอมลใหม
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 32/41
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 แลว ตองเพ�มบรรทดนK เขาไปดวย เพ�อตรวจสอบเฉพาะคาท�เปนตวเลข (กรองเอาเฉพาะขอมลท�เปนตวเลข) 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 33/41
Domain Aggregate Function (Dsum, Dcount, Dmax, Dmin, Davg, Dlookup)
รปแบบ: Dfunction (“FieldName”,”TableName”,[“Condition”])
ปฏบต 1 1. สรางฟอรมใหมตKงช�อวา frmDomain วาด TextBox 2 ตว 2. ทดลองใชฟงกชน Sum กบ Dsum เพ�อคานวณหาผลรวมของ Amount ใน QryAmount
ปฏบต 2 ใชฟงกชน Dlookup เพ�อนาคา Cust_Number ไปคนหา Cust_Name ในตาราง tblCustomer
1. วาด TextBox 2 ตว ตKงช�อ 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 ตว ตKงช�อวา lblCust_Name กบ lblCust_Address ตามลาดบ 3. กาหนด Event ของ Cust_Number เปน After Update แลว Coding
Private Sub Cust_number_AfterUpdate() 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")
End Sub
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 34/41
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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 35/41
การสรางปม เปดฟอรม frmEmployee
1. สรางปม AddRecord ดวย Wizard เขยนโปรแกรมควบคมดงนK 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 เขยนโปรแกรมควบคมดงนK 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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 36/41
3. สรางปม cmdFindEmID (โดยไมตองใช Wizard) เขาหนาตาง VBE) 1. เลอกเมน Tools, References เลอก DAO (ยกเลก ADO) 2. เขยนโปรแกรมควบคมดงนK 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)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 37/41
การเช3อมตอฐานขอมล (ADO, DAO)
1. สรางฐานขอมลใหม 2 ไฟล ตKงช�อไฟลวา Db1.mdb กบ Db2.mdb (Db1 = Table, Db2 = Form)
2. เขยนโปรแกรมเช�อมตอฐานขอมลดงนK 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:\AdvAccess\Db1.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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 38/41
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:\AdvAccess\Db1.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
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 39/41
เร�องการเปดฟอรม adOpenDynamic = SQL, Oracle ขKนไป adOpenForwordOnly = ไปขางหนาอยางเดยว adOpenKeyset = ทาไดทกอยาง (นยมใชงาน) adOpenStatic = เดนหนาถอยหลงได แต Read Only เร�องการ Lock Record adLockBathOptomistic = SQL, Oracle adLock ReadOnly = อานอยางเดยว adLockOptimistic = วธใหมทาให Lock ไดเรวขKน adLock Pessimistic =เปนการ Lock วธเดม (ทางานชา)
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 40/41
การสราง ToolBar, MenuBar
การสราง ToolBar 1. สราง ToolBar ตKงช�อวา My ToolBar โดยเลอกเมน Tools, Customize เลอก
บตรรายการ Toolbars 2. เลอกบตรรายการ Commands เพ�อเลอกปมเคร�องมอท�ตองการ การสราง MenuBar 1. สราง Menu Bar ตKงช�อวา My Menu โดยเลอกเมน Tools, Customize เลอกบตรรายการ
Toolbars 2. คลกปม Properties กาหนด Type: Menu Bar 3. เลอกบตรรายการ Commands เลอก Category: New Menu แลวลากไปวางบน
MyMenu การนา ToolBar และ MenuBar ไปกาหนดใหกบฟอรม 1. เปดฟอรมท�ตองการ 2. เลอกฟอรม 3. กาหนด Properties ใหกบฟอรมดงนK
• Menu Bar: My Menu
• Tool Bar: My ToolBar การสราง Start Up Form 1. เลอกเมน Tools, Startup…
แบงปน แนวทางการใชงาน Macro & VBA บน Access 2003: สมเกยรต ชวยมาก หนาท( 41/41
การกาหนด 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. ขKนตอนสดทายจะมรายงานแจงใหทราบเก�ยวกบรายละเอยดทKงหมด ตKงแตในขอท� 1-8