การใช้งาน ADO (ActiveX Data Object) กับ MS Excel
ADO หรือ ActiveX Data Object เป็นเทคโนโลยีที่ช่วยให้แอพพลิเคชั่นต่างๆ สามารถเข้าถึงข้อมูลใดๆก็ได้ โดยอาศัยการเชื่อมต่อผ่าน OLE DB ซึ่งเป็นการอินเตอร์เฟสระดับล่าง (เราปล่อยให้ระบบมันไปคุยกันเอาเอง) ที่สามารถเข้าถึงแหล่งข้อมูลได้หลายประเภท ไม่ว่าจะเป็นไฟล์ฐานข้อมูล (DBMS), File System, Text หรือ Graphics รวมไปถึงแหล่งข้อมูลอื่นๆ คุณสมบัติที่ดีเลิศ ประเสริฐศรีของ ADO ก็คือใช้งานง่าย มีกระบวนการติดต่อของแอพพลิเคชั่นน้อย ใช้ทรัพยากรระบบไม่มากมาย หรือ ฟุ่มเฟือยนัก
หลายต่อหลายครั้งที่รับงานเขียนโปรแกรมขนาดเล็กๆเข้ามา ก็ต้องเจอกับการดึงข้อมูลเดิมออกมาใช้งาน โดยส่วนใหญ่ก็มักจะเป็น Access หรือไม่งั้นก็ Excel เป็นหลัก ซึ่งในบทความนี้ ขอกล่าวถึงโปรแกรมยอดนิยมอย่าง Excel ล่ะกัน เพราะผู้ใช้งาน (User) ส่วนใหญ่ ชอบเก็บข้อมูลต่างๆที่ต้องการเอาไว้เป็นประจำ
ข้อมูลใน MS Excel ช่างเหมือนกับใน MS Access
ผลจากการทำงานของโปรแกรม
ดังนั้นในตัวอย่างงานชิ้นนี้ จะแสดงการเปิดไฟล์ Excel ขึ้นมา เพื่อดูข้อมูลต่างๆใน Work Sheet แต่ละตัว ที่มีอยู่ในไฟล์ MS Excel โดยเลือกนำ ADO มาใช้งาน
อ้างอิง References --> Microsoft ActiveX Data Objects 2.8 Library
เพิ่ม Component เข้ามาอีก 2 ตัว คือ Common Dialog และ Hierarchical Flex Grid Control
ในตัวอย่างนี้ บางส่วนผมก็ได้ทำการแทรกแนวทางของการทดสอบหาข้อผิดพลาด หรือ ที่เราเรียกว่า Trap Error
Option Explicit
Dim Conn As ADODB.Connection
' ฟังค์ชั่นที่ใช้ในการเปิดไฟล์ MS Excel
' และคืนค่ากลับ "จริง" หรือ "เท็จ" เพื่อแจ้งสถานะของการติดต่อไฟล์ด้วย
Private Function Connect() As Boolean
On Error GoTo ErrorHandler
Set Conn = New ADODB.Connection
With Conn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & txtPathNameXLS.Text & ";Extended Properties=Excel 8.0;"
.Open
End With
' แสดงว่าสามารถเปิดไฟล์ MS Excel ได้ (หรือ Connect - เชื่อมต่อได้) ก็แจ้งกลับด้วยสถานะที่เป็นจริง
Connect = True
ExitProc:
Exit Function
ErrorHandler:
' แจ้งสถานะของความผิดพลาด (Trap Error)
' เทคนิคการเขียนโปรแกรมของผมครับ ตรง Title MsgBox --> "Error: ฟังค์ชั่น Connect" ก็คือ
' ให้มันแจ้งการเกิด Error ในโปรแกรมย่อย (Sub program หรือ Function) ว่ามาจากตัวไหนกันแน่
' เวลาที่มีโปรแกรมย่อยเหล่านี้อยู่
MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbCritical, "Error: ฟังค์ชั่น Connect"
' การติดต่อล้มเหลวผิดพลาด ต้องส่งค่ากลับเป็น False
Connect = False
' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย
Resume ExitProc
End Function
' ทำการอ่าน WorkSheet หรือเสมือนกับว่ามันคือตารางข้อมูล (Table) นั่นแหละ
Private Sub GetExcelTables()
' ประกาศตัวแปร RecordSet หรือ ตารางเสมือน
Dim RS As ADODB.Recordset
'Set RS = New ADODB.Recordset
With Conn
' อ่านค่า Sheet ที่คุณเลือกเข้าสู่ RecordSet (มองเหมือนรูปแบบของตาราง - SchemaTables)
Set RS = .OpenSchema(adSchemaTables)
End With
' ' Loop ไปเรื่อยๆ จนกว่าจะหมดจำนวนของ WorkSheet
Do While Not RS.EOF
' นำชื่อ WorkSheet (หรือ ชื่อตาราง) มาใส่ไว้ใน ComboBox
cmbWorkSheet.AddItem (RS.Fields("TABLE_NAME").Value)
RS.MoveNext
Loop
End Sub
' อ่านข้อมูลที่อยู่ในเซลล์ต่างๆเข้าสู่ Flexgrid
' เหมือนอ่านข้อมูลออกจากตาราง (Table) ใน MS Access ที่เราคุ้นเคย
Private Sub GetExcelData()
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset
With RS
.ActiveConnection = Conn
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
' ไม่บรรยายแล้วกัน SQL Statement
.Source = "SELECT * FROM [" & cmbWorkSheet.Text & "]"
.Open
' กำหนด DataSource ให้กับ FlexGrid
Set fgSheet.DataSource = RS
End With
RS.Close
Set RS = Nothing
End Sub
' เริ่มต้นการเปิดไฟล์ Excel
Private Sub cmdOpenXLS_Click()
'On Error Resume Next
On Error GoTo ErrHandler
With dlgOpenFile
.DialogTitle = "เลือกไฟล์ Microsoft Excel"
.InitDir = App.Path
' เลือกเฉพาะไฟล์ Excel
.Filter = "All Microsoft Excel Files (*.xls)|*.xls"
.ShowOpen
การกดปุ่ม Cancel ตอนเลือกไฟล์ซึ่งใช้ร่วมกับ On Error GoTo ErrHandler
' และต้องสั่งให้ dlgOpenFile.CancelError = True
' เพื่อให้เกิดการแจ้ง Error โดย Err.Number = 32755 หมายความว่าเกิดการกดปุ่ม Cancel
.CancelError = True
If .FileName <> "" Then txtPathNameXLS.Text = .FileName
End With
' ไม่มีชื่อไฟล์กลับมา ดังนั้นจะให้มันไปฟังค์ชั่น Connect ทำไมให้เกิด Error
If txtPathNameXLS.Text = "" Then Exit Sub
การเรียกใช้โปรแกรมย่อย (Sub หรือ Fucntion) เรียงต่อๆกันไปนี่
' บางทีก็หาจุดของการเกิด Error ลำบากเหมือนกัน
If Connect Then
cmbWorkSheet.Clear
Call GetExcelTables
End If
ExitProc:
Exit Sub
ErrHandler:
Select Case Err.Number
Case 32755
Err.Clear
Exit Sub
' หรือคอย Trap Error ตัวอื่นๆ
' Case xxxx
' แจ้งความผิดพลาดเกี่ยวกับอะไร ...
Case Else
MsgBox Err.Number & vbCrLf & Err.Description
End Select
' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย
Resume ExitProc
End Sub
Private Sub cmbWorkSheet_Click()
If cmbWorkSheet.ListIndex < 0 Then Exit Sub
' เรียกการแสดงผลเข้าสู่ FlexGrid
Call GetExcelData
End Sub
Private Sub Form_Load()
txtPathNameXLS.Text = ""
cmbWorkSheet.Clear
lblDescription.Caption = "โปรแกรมตัวอย่างการใช้งาน ADO และ MS Excel - www.g2gnet.com"
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
End Sub
Private Sub cmdExit_Click()
End
End Sub
ไม่มีความคิดเห็น:
แสดงความคิดเห็น