การหลีกเลี่ยงใช้คำสั่งวนรอบ
by , 23 May 2010 at 23:33 (2683 Views)
ก่อนจะเขียนเทคนิกการใช้คำสั่งวนรอบตอนที่ 3 (ยังคิดไม่ออกเลยว่าจะเขียนอะไรเลยค่ะ)
คิดขึ้นได้ว่าน่าจะเขียนถึงเรื่องตรงข้าม คือ การหลีกเลี่ยงการใช้คำสั่งวนรอบ
การเขียน VBA ใช้คำสั่งวนรอบใน Excel ส่วนใหญ่ที่อรวีร์เห็นจะเป็นเรื่องการเขียนลักษณะนี้
For R = FirstRow To LastRow
. . . . . . .
Next
เพื่อวนทำงานทุกๆบรรทัดที่มีข้อมูล เช่น . . .
โจทย์ : สมมุติมีข้อมูลลักษณะฐานข้อมูลเก็บเป็นบรรทัดๆ โดยเริ่มจากบรรทัดที่ 2 Column A, B, C ไล่บรรทัดลงเรื่อยๆถึงบรรทัดสุดท้าย(ไม่แน่นอน)
ให้ตรวจสอบทุกบรรทัดว่าบรรทัดใดค่าใน Column C น้อยกว่า 0 ให้ลบค่าใน Column B ทิ้ง
การเขียน Code สำหรับงานนี้แบบนี้ปกติจะเขียนได้แบบนี้ค่ะการทำงานของโปรแกรมก็จะวนทำทีละบรรทัด ซึ่งถ้าจำนวนข้อมูลมากเป็นหมื่นบรรทัด โปรแกรมจะทำงานช้าCode:LastRow = [A65535].End(xlUp).Row For R = 2 To LastRow If Cells(R, 3).Value < 0 Then Cells(R, 2).ClearContents End If Next
------------------------------------------------------
การเขียนโปรแกรมใน Excel เราคงเคยได้ยินว่าไม่ควรเขียน Function ใช้งานเองถ้ามันมีอยู่แล้วใน Excel (หรือสามารถประยุกค์หลายๆ Function ใน Excel) เพราะ Function ที่เราเขียนด้วย VBA จะทำงานช้ากว่า
เช่นเดียวกับการวนรอบทีละบรรทัด จะไม่ควรใช้ For . . . Next ถ้าสามารถใช้ให้ Excel ทำทีเดียวทุกบรรทัด
เรามาลองทำขั้นตอนทำงานดังนี้
1. ใส่สูตรที่ D2 = If( C2<0 , NA() ) จะพบว่าบรรทัดใดที่ค่าใน Column C น้อยกว่า 0 จะได้ผลลัพธ์เป็น #N/A
2. Copy จาก D2 ลงไปจน D บรรทัดสุดท้าย
3. เลือกบริเวณ D2 ถึง D บรรทัดสุดท้าย
4. จากเมนู Edit -> Goto -> Special -> เลือก Formula -> ให้เครื่องหมายถูกเฉพาะ Errors -> กด OK
จะพบว่า Excel จะเลือกเฉพาะ Column D ที่ค่าใน C น้อยกว่า 0
ถ้าเราบันทึก Macro ตามขั้นตอนข้างบนและปรับปรุง Code ให้กระชับขึ้นบ้างแล้วจะได้ดังนี้
LastRow = [A65535].End(xlUp).Row
Range("D2:D" & LastRow).FormulaR1C1 = "=IF(RC[-1]<0,NA())"
Range("D2:D" & LastRow).SpecialCells(xlCellTypeFormulas, 16).Select
ถ้าแก้ Code บรรทัดสุดท้ายเป็น
Range("D2:D" & LastRow).SpecialCells(xlCellTypeFormulas, 16).Offset(0, -2).Select
แล้ว Run จะพบว่าเป็นการเลือกเฉพาะ Column B ที่ค่าใน C น้อยกว่า 0
ถ้าแก้ Code บรรทัดสุดท้ายเป็น
Range("D2:D" & LastRow).SpecialCells(xlCellTypeFormulas, 16).Offset(0, -2).ClearContents
แล้ว Run จะพบว่า Excel จะลบค่าใน Column B ที่ค่าใน C น้อยกว่า 0



)





