หน้าเว็บ

วันพุธที่ 9 ธันวาคม พ.ศ. 2552

การจัดเรียงข้อมูลที่กระจัดกระจายไว้ในคอลัมน์เดียว (VBA)

การจัดเรียงข้อมูลที่กระจัดกระจายอยู่หลายคอลัมน์ให้มาเรียงในคอลัมน์เดียว นั้น ดูเหมือนว่าหากใช้ VBA ค่อนข้างจะสะดวกกว่าการใช้สูตรครับ

ตัวอย่างตามด้านล่างจะเป็นการจัดเรียงข้อมูลที่อยู่ตั้งแต่คอลัมน์ B เป็นต้นไปมาเรียงใหม่ในคอลัมน์ A โดยเรียงเป็นชุดข้อมูลตามลำดับคอลัมน์ หลักการที่จะทำให้คำนวณได้รวดเร็วนั้น ประการหนึ่งที่สำคัญคือจะต้องหาว่าพื้นที่ใช้งานนั้นมีกี่บรรทัดและมีกี่แถวเพื่อใช้กำหนดขอบเขตในการ Loop ซึ่งจะช่วยเพิ่มความยืดหยุ่นทั้งให้คำนวณรวดเร็วขึ้นกว่าการกำหนดขอบเขตเผื่อเอาไว้ครับ

Sub ListData()
Dim r As Range, r1 As Range, r2 As Range
Dim r3 As Range, i As Integer
Set r1 = ActiveSheet.UsedRange
For i = 2 To r1.Columns.Count
Set r2 = Range(r1.Columns(i).Address)
For Each r3 In r2
Set r = Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0)
If r3 <> "" Then
r = r3
End If
Next r3
Next i
End Sub


แต่หากต้องการให้เรียงตามลำดับแถว Code จะสั้นลงเนื่องจากสามารถใช้ For Each...Next มาเรียงลำดับได้ ตามตัวอย่างด้านล่างครับ



Sub NewArrange()
Dim r As Range, c As Range
Dim iCount As Integer
Dim wsh As Worksheet
Set wsh = ActiveSheet
wsh.Range("A:A").ClearContents
Set r = wsh.UsedRange
For Each c In r
If c <> "" Then
iCount = iCount + 1
Cells(iCount, 1) = c
End If
Next c
End Sub

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


Sub NewArrange()
Dim r As Range, c As Range
Dim iCount As Integer
Dim wsh As Worksheet
Set wsh = ActiveSheet
wsh.Range("A:A").ClearContents
Set r = wsh.UsedRange
For Each c In r
If c <> "" Then
iCount = iCount + 1
Cells(iCount, 1) = c
End If
Next c
wsh.Range("A:A").Sort Key1:=Range("A1"), _
Order1:=xlAscending, Orientation:=xlTopToBottom
End Sub



--------------------------------------------

ไม่มีความคิดเห็น: