หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 2 6 1 1 3 9

7 ธันวาคม พ.ศ.2549
1247 Users On-Line.
Visitors - Page views
 8 5 8 7 8 0 1
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การใช้งาน ADO (ActiveX Data Object) กับ MS Excel

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 16/5/2550 18:10:00
(อ่าน : 21183) 

ADO ModelADO หรือ ActiveX Data Object เป็นเทคโนโลยีที่ช่วยให้แอพพลิเคชั่นต่างๆ สามารถเข้าถึงข้อมูลใดๆก็ได้ โดยอาศัยการเชื่อมต่อผ่าน OLE DB ซึ่งเป็นการอินเตอร์เฟสระดับล่าง (เราปล่อยให้ระบบมันไปคุยกันเอาเอง) ที่สามารถเข้าถึงแหล่งข้อมูลได้หลายประเภท ไม่ว่าจะเป็นไฟล์ฐานข้อมูล (DBMS), File System, Text หรือ Graphics รวมไปถึงแหล่งข้อมูลอื่นๆ คุณสมบัติที่ดีเลิศ ประเสริฐศรีของ ADO ก็คือใช้งานง่าย มีกระบวนการติดต่อของแอพพลิเคชั่นน้อย ใช้ทรัพยากรระบบไม่มากมาย หรือ ฟุ่มเฟือยนัก ...


หลายต่อหลายครั้งที่รับงานเขียนโปรแกรมขนาดเล็กๆเข้ามา ก็ต้องเจอกับการดึงข้อมูลเดิมออกมาใช้งาน โดยส่วนใหญ่ก็มักจะเป็น Access หรือไม่งั้นก็ Excel เป็นหลัก ซึ่งในบทความนี้ ผมขอกล่าวถึงโปรแกรมยอดนิยมอย่าง Excel ล่ะกัน เพราะผู้ใช้งาน (User) ส่วนใหญ่ ชอบเก็บข้อมูลต่างๆที่ต้องการเอาไว้เป็นประจำแหละครับ ... พี่น้อง เหตุผลก็ง่ายๆ เพราะใช้ Access ไม่รู้เรื่องนั่นเอง 55555 ... งานเล็กๆแบบนี้ไงครับ ที่ผมชื่นชอบมากเป็นพิเศษ เพราะมันใช้เวลาน้อย ไม่ค่อยเปลืองสมองซีกขวามากนัก ที่สำคัญที่สุด คือ รับตังค์ได้เร็ว

Design Time
ข้อมูลใน MS Excel ช่างเหมือนกับใน MS Access ซ่ะเหลือเกินนี่

Design Time
ผลจากการทำงานของโปรแกรม

ดังนั้นในตัวอย่างงานชิ้นนี้ ผมจะแสดงการเปิดไฟล์ Excel ขึ้นมา เพื่อดูข้อมูลต่างๆใน Work Sheet แต่ละตัว ที่มีอยู่ในไฟล์ MS Excel โดยเลือกนำ ADO มาใช้งาน ... แนะนำ ... ขอให้ท่านนึก "จินตนาการ" ไปน่ะครับว่า ตอนนี้เรากำลังติดต่อผ่านระบบฐานข้อมูลแบบธรรมด๊าธรรมดาอยู่ ... ยังไงยังงั้นเลย เหอๆๆๆๆๆ

Design Time
อ้างอิง References --> Microsoft ActiveX Data Objects 2.8 Library

Design Time
เพิ่ม Component เข้ามาอีก 2 ตัว คือ Common Dialog และ Hierarchical Flex Grid Control

ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6

ในตัวอย่างนี้ บางส่วนผมก็ได้ทำการแทรกแนวทางของการทดสอบหาข้อผิดพลาด หรือ ที่เราเรียกว่า 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) ว่ามาจากตัวไหนกันแน่
    ' เวลาที่มีโปรแกรมย่อยเหล่านี้อยู่มากๆ ...  ไม่งั้น งง ตาลาย 55555
    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 ลำบากเหมือนกัน
    ' ซึ่งนี่แหละ ... ทำไมในงานนี้จึงต้องคอยดัก Error ซ่ะเหลือเกิน
    If Connect Then
        cmbWorkSheet.Clear
        Call GetExcelTables
    End If

ExitProc:
    Exit Sub

ErrHandler:
    ' ในส่วนนี้ ผมจะใช้ในเวลาทดสอบการทำงานโปรแกรมของผมครับ ...
    ' นั่นคือต้องกระแดะ มาทำตัวเป็น "ผู้ใช้งาน - User" ด้วย
    ' Use อ่านว่า ยูส แปลว่า "ใช้" นั่นคือ User ก็คือ "ผู้ใช้เซ่อร์ๆ" ... 55555555
    ' อย่าซีเรียสครับ ... แบบขำๆ คลายเครียด
    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

หวังว่าท่านผู้อ่านคงจะได้อะไรไปจากบทความนี้บ้างไม่มากก็น้อยน่ะครับ ...


จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560