หน้าเว็บ

แสดงบทความที่มีป้ายกำกับ List แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ List แสดงบทความทั้งหมด

วันอาทิตย์ที่ 26 มิถุนายน พ.ศ. 2554

การแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย VBA

ตัวอย่างการดึงข้อมูลจากฐานข้อมูลที่จะนำเสนอต่อไปนี้เป็นการใช้ VBA ในการจัดการ ซึ่งเป็นหนึ่งในหลาย ๆ วิธีครับ โดยมีฐานข้อมูลพนักงานอยู่ที่ชีท Database ส่วนชีท Report จะเป็นการดึงรายชื่อของพนักงานมาแสดงตามแผนกที่เลือกในเซลล์ E2 ของชีท Report

หลังจากนำข้อมูลมาวางแล้วก็กำหนดให้จัดรูปแบบให้ด้วยเพื่อให้มีความสวยงามน่าใช้งาน โดยทำการจัดรูปแบบเฉพาะช่วงที่มีข้อมูลเท่านั้น ดูภาพ Database และ Report ตามด้านล่างครับ

ภาพตัวอย่างฐานข้อมูลพนักงาน

EmpNameByDept

ภาพตัวอย่าง Report ที่ต้องการ

EmpNameByDept1

ภาพแสดงตัวอย่างการทำงาน

ShowDataByCondWithVBA

โดยใช้ Code VBA ดังต่อไปนี้

Smile Code ด้านล่างวางไว้ที่ชีท Report

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" And Target <> "" Then
ShowEmp
ElseIf Target.Address = "$E$2" And Target = "" Then
MsgBox "Please select data."
End If
End Sub


Smile Code ด้านล่างวางที่ Module ปกติ



Option Explicit
Option Base 1

Sub ShowEmp()
Dim a() As Variant, lng As Long
Dim r As Range, rAll As Range
Dim rt As Range, rl As Long
Application.EnableEvents = False
Application.ScreenUpdating = False
rl = Rows.Count
With Worksheets("Database")
Set rAll = .Range("F2", .Range("F" & rl).End(xlUp))
End With
For Each r In rAll
If r = Worksheets("Report").Range("E2") Then
lng = lng + 1
ReDim Preserve a(5, lng)
a(1, lng) = lng
a(2, lng) = r.Offset(0, -5)
a(3, lng) = r.Offset(0, -4)
a(4, lng) = r.Offset(0, -3)
a(5, lng) = r.Offset(0, -2)
End If
Next r
If lng > 0 Then
With Worksheets("Report")
Set rt = .Range("A5", .Range("E" & lng - 1 + 5))
.Range("A5", .Range("A" & rl).End(xlUp).Offset(0, 4)).ClearContents
.Range("A5:E5").Copy
rt.PasteSpecial xlPasteFormats
rt = Application.Transpose(a)
.Range("B5", .Range("B" & rl).End(xlUp)).NumberFormat = "000000"
.Range(.Range("A4").End(xlDown).Offset(1, 0), .Range("E" & rl)).Clear
.Range("E2").Activate
End With
Else
MsgBox "Data not found."
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub



ซึ่งมีหลักการทำงานสำคัญ ๆ ดังนี้



  1. นำเซลล์ E2 ในชีท Report ไปเปรียบเทียบกับค่าในคอลัมน์ F ของชีท Database
  2. ค่าที่ตรงกันจะเก็บไว้ใน Array
  3. นำ Array มาวางที่ชีท Report
  4. จัดรูปแบบให้กับรายงานที่ได้

นอกจากการใช้ Array เข้ามาช่วยแล้ว ทางเลือกอื่นในการเขียน Code เช่น สามารถเลือกเขียน Code ให้ทำ Advanced Filter แล้วเลือกเฉพาะข้อมูลที่ต้องการมาแสดงเช่นนี้เป็นต้นครับ Winking smile

วันอาทิตย์ที่ 9 พฤศจิกายน พ.ศ. 2551

การ List รายชื่อ Sheet

เนื่อง จากมีคำถามเกี่ยวกับวิธีการ List รายชื่อ Sheet ค่อนข้างบ่อย และ Pantip เองก็มีการลบกระทู้ค่อนข้างบ่อย ผมก็เลยต้องตอบคำถามเดิม ๆ ค่อนข้างบ่อยเป็นลูกโซ่ เลยนำมาเขียนไว้ที่นี่เพื่อจะได้ใช้อ้างอิง ไม่ต้องเขียนใหม่ หรือ Copy มาแปะทุกครั้งที่เจอคำถาม

สำหรับ วิธีการนี้ใช้ Excel 4 Macro Function มาช่วย ซึ่งต้องกำหนด Security ในเมนู Tools > Macro > Security เป็นระดับ Medium หรือ Low ถึงจะใช้ได้

วิธีการทำดังนี้ครับ

  1. เปิดไฟล์ที่ต้องการ List รายชื่อ Sheet โดยทำการเพิ่ม 1 Sheet คือ Sheet ที่ต้องการให้แสดงรายชื่อ Sheet ทั้งหมด
  2. เข้าเมนู Insert > Name > Define >
    1. ช่อง Names in workbook: คีย์ CountSheet > ช่อง Refers to: คีย์ =Get.Workbook(4) > Add
    2. ช่อง Names in workbook: คีย์ ListSheet > ช่อง Refers to: คีย์
      =RIGHT(GET.WORKBOOK(1),LEN(GET.WORKBOOK(1))-FIND("]",GET.WORKBOOK(1))) > OK
  3. ใน Sheet ที่เพิ่มเข้ามาใหม
    1. เซล A1 คีย์
      =CountSheet
      Enter
    2. เซล A2 คีย์
      =IF(ROWS($A$2:A2)<=$A$1,INDEX(ListSheet,ROWS($A$2:A2)),"")
      Enter แล้ว Copy ลงด้านล่าง

การแสดงรายการโดยไม่รวมค่าที่ซ้ำ

กรณี ที่เรามีข้อมูลซึ่งประกอบด้วยค่าที่ซ้ำกันจำนวนมาก หากต้องการที่จะให้โปรแกรมแสดงรายการทั้งหมดโดยไม่รวมค่าที่ซ้ำ สามารถใช้ Advanced Filter ทำได้ดังนี้

  1. สมมุติข้อมูล A1:A10 มีดังต่อไปนี้
    A1: Fruits
    A2: Apple
    A3: Cherry
    A4: Pear
    A5: Cherry
    A6: Plum
    A7: Apple
    A8: Apple
    A9: Pear
    A10: Apple
  2. คลิกเมนู Data > Filter > Advanced Filter
  3. ตรง Action เลือก Copy to another location
  4. คลิกในช่อง List Range ลากคลุม $A$1:$A$10
  5. คลิก Unique records only
  6. คลิกในช่อง Copy to และคลิกเซลล์ B1
  7. OK

โปรแกรมจะแสดงข้อมูลที่คอลัมน์ B ดังข้างล่างนี้

B1: Fruits
B2: Apple
B3: Cherry
B4: Pear
B5: Plum

การ ใช้ Advanced Filter เพื่อเลือกค่าที่ไม่ซ้ำสามารถใช้ได้กับหลาย ๆ คอลัมน์ และหากต้องการให้กรองและแล้วแสดงในฐานข้อมูลเดิม สามารถเว้นข้อ 6 ด้านบนไว้ได้