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

หรือติดต่อเข้ามาทาง 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 1 2 8 5 2 1

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

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

การนำข้อมูลจาก MS Access เข้าสู่ MS Excel (ตอนที่ 1)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 4/9/2550 4:04:00
(อ่าน : 26700) 
อันที่จริงแล้วผมตั้งใจอยากจะเขียนบทความในเรื่องของการแลกเปลี่ยนข้อมูลในรูปแบบของ XML ให้มันจบไปซ่ะมากกว่า เพราะว่า XML มันไม่ใช่แค่การแลกเปลี่ยนข้อมูลข้าม Application ได้เท่านั้น แต่มันยังสามารถสื่อสาร หรือ ทำงานข้ามแพลตฟอร์มไปมา เช่น ระหว่างผู้ใช้งาน MS Windows หรือ Linux ได้ ก็ไม่เป็นไรครับ ... มันอาจเป็นเรื่องที่ไกลตัวหลายๆคนไปมั้งเนี่ย ก็มาว่ากันต่อกับอีกเรื่องหนึ่งซึ่งมีความสำคัญไม่ได้น้อยเลย ซึ่งจากตอนที่ผ่านๆมา จะเป็นการดึงข้อมูลจากไฟล์ MS Excel เข้าสู่ MS Access ส่วนใหญ่ก็เนื่องมาจากความต้องการในการจัดเก็บรูปแบบของข้อมูลไว้ใน DataBase เพื่อใช้ในการจัดการ และ การประมวลผลที่ดีกว่า แต่ตอนนี้จะทำกลับกัน บางคนอาจสงสัยว่าทำไมต้องแปลงไปให้อยู่ในรูปของ Excel ด้วยล่ะ ????? ตอบได้ไม่ยากเลยครับ ก็เอาไว้ให้ User เขาเอาไปทำเป็นรายงาน (Report) ในรูปแบบที่เขา หรือ เธอเหล่านั้นต้องการไงล่ะครับ ... พี่น้อง และส่วนใหญ่ที่ผมพบมา ก็จะมีกระบวนการนำไปใช้งานดังนี้ คือ
  • ส่งข้อมูลให้ตามที่ User ต้องการ ไปที่ MS Excel เลย จากนั้นเขา (หรือเธอ) ก็จะนำข้อมูลไปดำเนินการต่อเอง
  • ส่งข้อมูลไปยังฟอร์มใน Excel ให้ลงตามแบบ (Cells) ที่ได้ออกแบบไว้ล่วงหน้า เช่น การทำใบเสนอราคา หรือ ใบเสร็จรับเงิน เป็นต้น
ที่ว่ามานี่ ... ต้องเขียนโค้ดขึ้นมาด้วยน่ะครับ ไม่ใช่เล่นแบบระบบอัตโนมือ (Manual) โดยการเปิด DataBase ขึ้นมา แล้วจับลากฟิลด์โน่น ฟิลด์นี่มาใส่ จากนั้นก็ค่อยส่งข้อมูลไปให้กับ User เป็นครั้งๆไป ... อย่างนี้วัยรุ่นเซ็งล่ะครับ ... 55555 ... ตัวอย่างที่นำมาแสดงให้ดูสำหรับตอนนี้ ก็คงเอาเป็นแบบง่ายๆ เพื่อให้พี่น้องได้มองเห็นภาพรวมๆของกระบวนการทำงานก่อน
   ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6

Design

เลือกการอ้างอิงถึง Object จาก Project --> References
Excel ที่ผมใช้งานอยู่เป็น MS Office 2003 หรือ Office 11.0 น่ะครับ

เลือกวัตถุจาก Project --> Components --> MS Hierarchical FlexGrid Control

เมื่อสั่งให้โปรแกรมทำงาน

ผลจากการส่งข้อมูลจากตารางกริดไปยัง Sheet ใน MS Excel

ทีนี้มาลองดูโค้ดตัวอย่างง่ายๆกันครับ ... พี่น้อง


Option Explicit

' เริ่มต้นทำงานที่นี่
Private Sub Form_Load()
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    
    ' เชื่อมต่อฐานข้อมูล
    Call OpenDataBase
    
    Set RS = New Recordset
    Statement = "SELECT tblCustomer.CustomerID,  Right$('0000000' & [tblCustomer].[CustomerID], 7) AS CusID, " & _
                            " tblTitle.TitleName, tblCustomer.FirstName, tblCustomer.LastName, " & _
                            " tblCustomer.Address, tblCustomer.Amphur, tblProvince.ProvinceName, " & _
                            " tblCustomer.PostCode, tblCustomer.Telephone, tblCustomer.Facsimile " & _
                            " FROM (tblCustomer INNER JOIN tblProvince ON " & _
                            " tblCustomer.ProvinceID = tblProvince.ProvinceID) " & _
                            " INNER JOIN tblTitle ON tblCustomer.TitleID = tblTitle.TitleID " & _
                            " ORDER BY CustomerID "
    
    RS.CursorLocation = adUseClient
    RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText
    
    ' ผูกข้อมูล (Bound) ให้กับ FlexGrid
    Set fgData.DataSource = RS
    
    RS.Close:   Set RS = Nothing
End Sub

ความสัมพันธ์ของฟิลด์ต่างๆในฐานข้อมูล MS Access

Private Sub cmdExport2Excel_Click()
' อ้างอิงถึง Microsoft Excel 11.0 Object Library (MS Office 2003)
Dim ExcelApp As New Excel.Application
' อ้างถึง WorkBook
Dim ExcelBook As New Excel.Workbook

Dim iRow As Long    ' นับจำนวนแถวใน FlexGrid
Dim iCol As Integer   ' นับจำนวนหลักใน FlexGrid

    ' สร้าง Object ในการเชื่อมต่อกับ Application
    Set ExcelApp = CreateObject("Excel.Application")
    ' Method ในการเพิ่ม WorkBooks เข้าไปใหม่
    Set ExcelBook = ExcelApp.Workbooks.Add
    
    ' กำหนดรูปแบบให้กับเซลล์ในหลักที่ 2 หรือ B จากฟิลด์ข้อมูลตัวอย่างที่เราเจตนาตั้งไว้คือ 0000001
    ' หากไม่กำหนดแล้ว Excel จะมองค่า 0000001 เป็นตัวเลข คือ 1 แทน
    ExcelApp.Range("B:B").NumberFormat = "0000000"
    
    
    ' เซลล์ใน Excel จะเริ่มต้นนับแถวที่ 1 หลักที่ 1
    ' เซลล์ใน FlexGird จะเริ่มนับจากแถวที่ 0 หลักที่ 0
    For iRow = 1 To fgData.Rows ' เริ่มนับจำนวนแถวทั้งหมดของ FlexGrid รวมทั้ง Header ด้วย
        
        For iCol = 1 To fgData.Cols     ' นับจำนวนหลักของ FlexGrid
            
            ' เมื่อเริ่มต้นการทำงาน iRow กับ iCol จะมีค่าเท่ากับ 1
            ' ใน Excel จะเริ่มต้นนับแถวที่ 1 หลักที่ 1 -- ส่วน FlexGrid จะเริ่มต้นแถว (1-1), หลักที่ (1-1) หรือ 0, 0 นั่นเอง
            ExcelApp.Cells(iRow, iCol) = fgData.TextMatrix(iRow - 1, iCol - 1)
            
        Next ' นับหลักถัดไป
    Next ' นับแถวถัดไป
    
    ' แสดงผลที่ได้ใน MS Excel
    ExcelApp.Visible = True
    
    ' ปิดการใช้งานวัตถุ
    Set ExcelApp = Nothing:    Set ExcelBook = Nothing
End Sub

Private Sub cmdExit_Click()
    Call Form_QueryUnload(True, 0)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call CloseDataBase
    End
End Sub

อีกวิธีหนึ่งในการกำหนดรูปแบบตามที่เราต้องการ


ให้สังเกตผลที่ได้ในเซลล์ของหลัก B ในไฟล์ MS Excel ทั้งสองครั้งด้วยน่ะครับ

Private Sub cmdExport2Excel_Click()
' อ้างอิงถึง Microsoft Excel 11.0 Object Library (MS Office 2003)
Dim ExcelApp As New Excel.Application
' อ้างถึง WorkBook
Dim ExcelBook As New Excel.Workbook

Dim iRow As Long    ' นับจำนวนแถวใน FlexGrid
Dim iCol As Integer   ' นับจำนวนหลักใน FlexGrid

    ' สร้าง Object ในการเชื่อมต่อกับ Application
    Set ExcelApp = CreateObject("Excel.Application")
    ' Method ในการเพิ่ม WorkBooks เข้าไปใหม่
    Set ExcelBook = ExcelApp.Workbooks.Add
    
    ' เซลล์ใน Excel จะเริ่มต้นนับแถวที่ 1 หลักที่ 1
    ' เซลล์ใน FlexGird จะเริ่มนับจากแถวที่ 0 หลักที่ 0
    For iRow = 1 To fgData.Rows ' เริ่มนับจำนวนแถวทั้งหมดของ FlexGrid รวมทั้ง Header ด้วย
        
        For iCol = 1 To fgData.Cols     ' นับจำนวนหลักของ FlexGrid
            
            ' ทดสอบว่าเป็นหลักที่ 1 (CusID) ใน FlexGrid หรือไม่
            ' เมื่อ iCol = 2 ดังนั้นแล้ว fgData.TextMatrix(iRow - 1, 2 - 1) แท้จริงก็คือหลักที่ 1 ใน FlexGrid
            If iCol = 2 Then
                ' นั่นคือต้องใช้เครื่องหมาย ' นำหน้าข้อมูลในหลักนี้ ไม่เช่นนั้นเวลาส่งไป Excel
                ' Excel จะมอง 0000001 เป็น ตัวเลข หรือ 1 แทนน่ะครับ ... พี่น้อง
                ExcelApp.Cells(iRow, iCol) = "'" & fgData.TextMatrix(iRow - 1, iCol - 1)
            Else
                ExcelApp.Cells(iRow, iCol) = fgData.TextMatrix(iRow - 1, iCol - 1)
            End If
            
        Next ' นับหลักถัดไป
    Next ' นับแถวถัดไป
    
    ' แสดงผลที่ได้ใน MS Excel
    ExcelApp.Visible = True
    
    ' ปิดการใช้งานวัตถุ
    Set ExcelApp = Nothing:    Set ExcelBook = Nothing
End Sub

เพิ่มเติมอีกเรื่องหนึ่งสักกะหน่อยครับ กับการที่ผมเลือกใช้คำสั่ง FOR มาใช้งาน ก็เนื่องมาจาก คำสั่ง FOR มันจะมีค่าเริ่มต้น (Initial Value) ค่าสุดท้าย (Condition/Last Value) ซึ่งค่านี้จะเป็นตรรกะ (หรือเงื่อนไข - Condition) ที่ใช้ทดสอบในการสิ้นสุดการทำงานของลูป (Loop) และ การนับเพิ่ม (Increment) (หรือ นับลง - Decrement) ที่แน่นอนตายตัว จากตัวอย่างก็คือ เริ่มต้นจาก 1 ไปสิ้นสุดที่จำนวนแถวทั้งหมดของตารางกริด และมีการเพิ่มค่าการนับของแถวทีละ 1 ครับ ... พี่น้อง ... แต่โปรดสังเกตคำสั่งนี้ไว้อย่างคือ เมื่อมันนับไปจนถึงตัวสุดท้าย เช่น FOR i = 1 TO 10 เมื่อนับมาถึง 10 นั่นคือ Logic นี้มันยังคงเป็น "จริง" มันก็เลยยังทำงานในลูปต่อไปได้อีก

สำหรับในตอนนี้ก็คงเป็นแค่พื้นฐาน เพื่อทำให้พี่น้องได้มองเห็นภาพรวมของการนำข้อมูลที่อยู่ในตารางกริด (หรือฐานข้อมูลก็ได้) ส่งออกไปยังไฟล์ MS Excel เพื่อที่จะนำไปใช้งานอย่างอื่นต่อไปได้อีก ...


อยากได้แบบนี้น่ะครับพี่น้อง ... จะทำยังไงดี ???

ก่อนจบ ... มีโจทย์ให้คือ หากผู้ใช้งานต้องการให้เพิ่มหลัก (Columns) ซ้ายมือสุด (Column A) ที่ปรากฏใน Excel ให้มีลำดับที่ด้วย เช่น 1, 2, 3 ... แบบอัตโนมัติสั่งผ่านโปรแกรมด้วยล่ะครับ ไม่ใช่ไป Insert เอาใน MS Excel ... 55555 คิดว่าจะทำยังไงดีล่ะครับ ... พี่น้อง .....

เฉลยคำถาม: (16 ธ.ค. 2550)

    ' สำหรับคนไม่ถนัดเริ่มการนับจาก 0
    ' For ... Next ลูปนอกนี้เป็นการนับแถวน่ะครับ ... คือเราจะไล่เรียงไปทีละแถว
    For iRow = 1 To fgData.Rows
        ' หากเป็นแถวที่ 1 (Excel) เราก็ใส่ Header ให้มันก่อน
        If iRow = 1 Then
            ExcelApp.Cells(iRow, 1) = "ลำดับที่" ' อันที่จริงเราเอามันไปไว้นอกลูปก็ได้น่ะครับ ... ลองแก้ดูล่ะกัน
        ' เมื่อ For ... Next ลูปบอกที่นับแถว (iRow) วนมาถึงรอบที่สองนั่นคือ iRow = 2 ...
        ' เราก็ลดค่า iRow - 1 มันก็จะได้คำตอบเป็น 1, 2, 3, ... 13
        ' แต่แถว (iRow) ที่จะใส่ข้อมูลลงไปใน Cell ของ Excel มันจะเป็นค่าเดิม (และเป็นหลักที่ 1 คงที่เสมอ)
        Else
            ExcelApp.Cells(iRow, 1) = iRow - 1
        End If
        
        ' For ... Next ลูปในเป็นการนับหลัก
        For iCol = 1 To fgData.Cols  ' นับจำนวนหลักของ FlexGrid
            ' ให้เพิ่มค่า iCol ขึ้นอีก 1 (ใน Excel) ... เพราะเราไปแทรก Column แรกไว้ก่อนหน้าแล้ว ... ดังคำสั่งด้านบน
            ExcelApp.Cells(iRow, iCol + 1) = fgData.TextMatrix(iRow - 1, iCol - 1)
        Next
    Next
' หรือ
    For iRow = 0 To fgData.Rows - 1
        If iRow = 0 Then
            ExcelApp.Cells(iRow + 1, 1) = "ลำดับที่"
        Else
            ExcelApp.Cells(iRow + 1, 1) = iRow
        End If
        
        For iCol = 1 To fgData.Cols
            ExcelApp.Cells(iRow + 1, iCol + 1) = fgData.TextMatrix(iRow, iCol - 1)
        Next
    Next
' โอ้ย !!!!! ... คิดออกมาได้หลายแบบล่ะครับ ... พี่น้อง


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