VBA แก้ไขโค้ดการบวกหลายๆ เงื่อนไขให้ทำงานเร็วขึ้นครับ
Posted: Tue Sep 01, 2015 12:51 pm
สวัสดีอาจารย์และเพื่อนๆ ครับ
ผมเจอปัญหาว่า หากเรียกช่วงข้อมูลหลายปี จะต้องใช้เวลานานมากครับ กว่าคำสั่งจะทำงานเสร็จทั้งๆ ที่ข้อมูลจริงๆ ก็ไม่มากเท่าไรนัก
คำสั่งดังกล่าวอยู่ในโมดูล
การทำงานคร่าวๆ คือ:
1. พอกดปุ่มในชีท Anlz ก็จะรับค่าปีในเซลล์ B2, B3
2. สร้างชีทชั่วคราว แล้วใช้ Advanced filter กรองข้อมูลในชีท database ที่อยู่ในช่วงปีที่กำหนดมาไว้ในชีทชั่วคราว
3. สร้างรายการลูกค้า, สินค้า, ขนาดบรรจุ (เลือกแบบไม่ซ้ำ) ในชีท Anlz คอลัมน์ B-E แล้วก็รันเลขปี/เดือนบนหัวตารางในแถวที่ 5, 6
4. จากนั้นจะไล่ดูในชีทชั่วคราวตามเงื่อนไขคือ จังหวัด, ชื่อลูกค้า, ชื่อสินค้า, ขนาดบรรจุ, ปี และเดือน แล้วจำค่าเอาไว้ก่อนในอาร์เรย์ (ตามโค้ดที่มีปัญหาเรื่องช้าด้านบน) แล้วค่อยเอามาใส่ในตารางชีท Anlz ครับ แต่หากเลือกช่วงหลายๆ ปี มันจะใช้เวลานานมากเลยเมื่อรันในเครื่องผม ตอนแรกช้ากว่านี้มากก็เลยลองลดจำนวนช่วงข้อมูลโดยกำหนด rTgSmall เรนจ์โดยดูจากชื่อจังหวัด ก็เร็วขึ้นมานิดหน่อยครับแต่เครื่องผมมันก็ยังรันได้ช้าอยู่ดี
รบกวนสอบถามว่า ผมควรปรับโค้ดอย่างไรดีเพื่อให้มันทำงานเร็วขึ้นครับ (ลองเขียนสูตร sumifs เองดู คำนวณเร็วกว่ามากๆ เลย แต่ผมเขียนใส่จาก VBA ไม่เป็นครับ)
ขอบคุณครับ
ผมเจอปัญหาว่า หากเรียกช่วงข้อมูลหลายปี จะต้องใช้เวลานานมากครับ กว่าคำสั่งจะทำงานเสร็จทั้งๆ ที่ข้อมูลจริงๆ ก็ไม่มากเท่าไรนัก
คำสั่งดังกล่าวอยู่ในโมดูล
Analyze เท่าที่ไล่ดูพบว่าช้าที่คำสั่งหาผลรวมโดยดูเงื่อนไขหลายๆ เงื่อนไขครับ
Code: Select all
Private Sub FindTargetData()
'----Other----
For m = 1 To k
i = Application.Match(.Cells(m + 6, "a"), rTarget, 0)
o = Application.CountIf(rTarget, .Cells(m + 6, "a"))
Set rTgSmall = wsTemp.Range("a1").Offset(i, 0).Resize(o, 1)
For n = 1 To j * 12
p = 0
For Each r In rTgSmall
If r.Offset(0, 1) = .Cells(m + 6, "b") Then
If r.Offset(0, 2) = .Cells(m + 6, "c") Then
If r.Offset(0, 4) = .Cells(m + 6, "d") Then
If r.Offset(0, 7) = .Cells(5, n + 5) Then
If r.Offset(0, 8) = .Cells(6, n + 5) Then
p = p + r.Offset(0, 3)
End If
End If
End If
End If
End If
Next r
If p = 0 Then a(m, n) = ""
If p > 0 Then a(m, n) = p
Next n
Next m
.Range("f7").Resize(k, j * 12).Value = a
'----Other----
End Sub1. พอกดปุ่มในชีท Anlz ก็จะรับค่าปีในเซลล์ B2, B3
2. สร้างชีทชั่วคราว แล้วใช้ Advanced filter กรองข้อมูลในชีท database ที่อยู่ในช่วงปีที่กำหนดมาไว้ในชีทชั่วคราว
3. สร้างรายการลูกค้า, สินค้า, ขนาดบรรจุ (เลือกแบบไม่ซ้ำ) ในชีท Anlz คอลัมน์ B-E แล้วก็รันเลขปี/เดือนบนหัวตารางในแถวที่ 5, 6
4. จากนั้นจะไล่ดูในชีทชั่วคราวตามเงื่อนไขคือ จังหวัด, ชื่อลูกค้า, ชื่อสินค้า, ขนาดบรรจุ, ปี และเดือน แล้วจำค่าเอาไว้ก่อนในอาร์เรย์ (ตามโค้ดที่มีปัญหาเรื่องช้าด้านบน) แล้วค่อยเอามาใส่ในตารางชีท Anlz ครับ แต่หากเลือกช่วงหลายๆ ปี มันจะใช้เวลานานมากเลยเมื่อรันในเครื่องผม ตอนแรกช้ากว่านี้มากก็เลยลองลดจำนวนช่วงข้อมูลโดยกำหนด rTgSmall เรนจ์โดยดูจากชื่อจังหวัด ก็เร็วขึ้นมานิดหน่อยครับแต่เครื่องผมมันก็ยังรันได้ช้าอยู่ดี
รบกวนสอบถามว่า ผมควรปรับโค้ดอย่างไรดีเพื่อให้มันทำงานเร็วขึ้นครับ (ลองเขียนสูตร sumifs เองดู คำนวณเร็วกว่ามากๆ เลย แต่ผมเขียนใส่จาก VBA ไม่เป็นครับ)
ขอบคุณครับ