สวัสดีครับ
ต่อเนื่องจากเรื่องที่แล้วครับ (ทำให้ Excel ฉลาดด้วย Macro) มาตอนนี้ว่าด้วยการดึงข้อมูลจาก Database เข้ามาใน Excel โดยใช้คำสั่ง
SQL เลือกดึง ข้อมูลตามต้องการ ขั้นตอนของการทำโปรแกรมนี้ก็เริ่มจาก เตรียม Database ที่ต้องการติดต่อด้วย จากนั้นตรวจดูว่าที่ตัว
Excel ว่ามี module ของ Microsoft Query หรือไม่ ถ้าไม่มีให้ Add จากแผ่นที่ใช้ Install Program เพิ่มโดยใช้ Add and Remove Program
เริ่มด้วยไปที่ การสั่งบันทึก Macro จากนั้นไปที่ Menu DATA > Get External Data > Create new Query
ภาพ แสดงการเข้า Menu query ภาพแสดง การอ้าง ตำแหน่ง Database
ภาพแสดง Query ODBC
เมื่อทำตามคำสั่ง Wizard จบก็จะได้ข้อมูลมาอยู่ใน Cell ของตาราง Excel จากนั้นให้ กดปุ่มหยุดการบันทึก คำสั่งแมคโคร และมาทำการแก้
ไขบางส่วนของ Source Code โปรแกรม VB เช่น การเพิ่มเงื่อนใน Where cause เป็นต้น
จาก Code ตัวอย่างจะเป็นการทำงานโดยรวม จากอ่านข้อมูลที่ file database ชื่อ
ictran.dbf ซึ่งเป็น Foxbase (กรณีถ้าเป็น
database
ชนิดอื่นเช่น
Access
ก็ให้เลือกตอนทำ
Wizard ซึ่งจุดนี้
ถ้าเป็น Oracle
ก็สามารถเลือกได้แต่ต้องมี
driver ด้วย) จากนั้นทำคำสั่ง VB ต่อเนื่อง
ไปในส่วนที่เป็น SQL เพื่อดึงข้อมูลด้าน วัตถุดิบ ตามชื่อ Field ที่ระบุ และ ตามด้วย Where cause ที่กำหนดว่าให้เลือกเฉพาะข้อมุล ของ
วัถตุดิบที่มีรายการตามระบุใน Table ที่ 2 เท่านั้น ซึ่งการทำงาน จะเป็น คำสั่ง SQL แบบซ้อนคำสั่ง เพื่อทำงานในลักษณะ ดึงข้อมูลตาม
เงื่อนไขที่เลือกข้อมูลจาก SQL ในส่วนที่ 2 โดยข้อมูลนั้นจะอยู่คนละ Table ในที่นี้คือ file ชื่อ bom3.dbf นั่นเอง
Sub BOM()
'
' Keyboard Shortcut: Ctrl+b
'
ตัวแปร
sqlstring
กำหนดเพื่อเป็น
SQL command
ที่จะเลือก get
ข้อมูล filed
ต่างๆ
พร้อมทั้งบอกว่าดึงจากที่ใดด้วย
sqlstring = "SELECT ITEMNO, DESP, LOCATION, SIGN, QTY, TYPE, DATE, REFNO, VOID, PRICE_BIL,NAME,BREM1,BREM2" & " FROM `c:`\ictran.dbf " _
& "WHERE ITEMNO " _
& " IN (SELECT ITEMNO from `c:'\bom3.dbf)"
กำหนดคำสั่ง
SQL
ซ้อนเพื่อดึงข้อมูลจาก
Table อีก Table หนึ่ง
ที่ค่าตัวแปร
DBQ และ Default
จะเป็นการบอกตำแหน่ง
Directory ที่เก็บ file
ข้อมูลไว้
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;CollatingSequence=ASCII;DBQ=c:;DefaultDir=c:;Deleted=1;Driver={Microsoft FoxPro Driver (*.dbf)};DriverId=536;FIL=Fo" _
), Array( _
"xPro 2.0;ImplicitCommitSync=Yes;MaxBufferSize=1024;MaxScanRows=8;PageTimeout=600;SafeTransactions=0;Statistics=0;Threads=3;UserC" _
), Array("ommitSync=Yes;")), Destination:=Range("A1"))
กำหนดตำแหน่งที่จะนำข้อมูลมาวางใน
Sheet ณ.ช่อง A1ซึ่งจุดนี้สามารถเปลี่ยนได้ตามความต้องการ
.Sql = Array(sqlstring)
ตัวโปรแกรมจะนำ
sqlstring มา run ตรงนี้
.FieldNames = True
.RefreshStyle = xlInsertDeleteCells
.Refresh BackgroundQuery:=False
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = True
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.SavePassword = True
.SaveData = True
End With
End Sub
เมื่อได้ข้อมูลจากการดึงจาก SQL แล้ว Source code ต่อไปนี้เป็นการ จัดกลุ่มข้อมูล เริ่มจากการ Sort ข้อมูล และ การวน Loop เพื่อ SUM
ค่าต่างๆ พร้อมทั้งนำค่าที่อยู่ใน Cells มาตรวจสอบเงื่อนไข หลังจากนั้นมีการแทรก ROW เพิ่ม พร้อมทั้งทำสีพื้นให้เป็นสี แดง แล้วนำค่าที่
SUM ได้มาใส่ในตำแหน่งช่อง Cell ที่ต้องการ
Sub Sum()
'
' Keyboard Shortcut: Ctrl+s
'
'Sheets("sheet2").Select เลือก
sheet ที่จะทำงาน
Columns("A:K").Select เลือกบริเวณข้อมูลที่ต้องการทำการ
Sort
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("K2") _
กำหนด
Sort key ณ.ช่อง cells
ต่างๆคือ A2,K2
และ C2
, Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
Cells(1, 1).Select
i = 2
กำหนดตัวแปร
i
QTYSUM = 0 กำหนดตัวแปร
Do Until ((Cells(i, 1).Value) = "") เริ่มต้น
วน Loop
จนกว่าเงื่อนไขเป็นจริง
Cells(i, 1).Select
If Trim(Cells(i, 9).Value) = "Y" Then ตรวจสอบว่า
collum I row
หมายเลขตามตัวแปร
i
ว่ามีค่าเป็นตัวอักษร
Y หรือไม่
ซึ่งทั้งหมดต้อง
trim
อักษรว่าทิ้งด้วย
Cells(i, 4).Value = 0
End If
QTYSUM = QTYSUM + (Cells(i, 4).Value * Cells(i, 5).Value)
If (Cells(i, 1).Value <> Cells(i + 1, 1).Value) Or (Cells(i, 3).Value <> Cells(i + 1, 3).Value) Then
Rows(i + 1).Select
เลือกข้อมูลที่แถว
หมายเลขตามตัวแปร
i+1 แล้ว select
เป็นแถบถึบ
Selection.Insert Shift:=xlDown
Insert
เพิ่มแถวของ
sheet
i = i + 1
Rows(i).Select
With Selection.Interior
.ColorIndex = 3
เปลี่ยนสีพื้นเป็นสีแดง
(แทนด้วยเลข 3)
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Cells(i, 1).Value = Cells(i - 1, 1).Value
Cells(i, 3).Value = Cells(i - 1, 3).Value
copy
ค่าไปไว้อีก
ช่องหนึ่ง
Cells(i, 5).Value = QTYSUM
QTYSUM = 0
End If
i = i + 1
Loop
End Sub
แถมท้ายด้วยการทำหน้าจอที่มีปุ่มที่สวยงาม และเมื่อ User กด ก็จะเกิดการทำงานตาม Macro ที่ระบุไว้ ขั้นตอนการทำเริ่มโดย ไปที่ Menu
View > Toolbars > Form จากนั้นใช้ Mouse Drag ปุ่มมาวางไว้ที่ Sheet จากนั้น แก้ข้อความชื่อปุ่ม หรือเปลี่ยนสี ของตัวอักษรตามต้องการ นอกจากนั้นยัง
สามารถนำรูปต่างๆ มา
เป็น Background เพื่อเพิ่มความสวยงามได้อีกด้วยครับ
สุดท้ายนี้ผู้เขียนหวังเป็นอย่างยิ่งว่าคงเป็นประโยชน์ตามสมควร แก่ผู้ที่ต้องการ ทำให้เกิดประโยชน์สูงสุดจาก ตัว Software Excel
เขียนเสร็จเมื่อ
วันที่ 10 ส.ค. 44