ฉันได้รับการแก้ไขแล้วอื่น ๆ อีกหลายที่ใช้Application.Index
กับApplication.WorksheetFunction.Match
ที่และเวลาในการดำเนินการประมาณ 7-8 วินาทีเพื่อมิลลิวินาทีลดลง แต่ฉันรู้สึกว่ายังมีห้องพักสำหรับการปรับปรุง
ฉันควรใช้อาร์เรย์ด้วยIndex
และMatch
?
ฉันได้รับคำสั่งให้ใช้Scripting.Dictionary
เช่นกัน แต่ฉันกำลังมองหาคนที่สามารถสาธิตวิธีการใช้งานได้ทันทีในสถานการณ์นี้ เพราะในหัวของฉันฉันต้องใส่พจนานุกรมด้วยการวนซ้ำก่อนที่ฉันจะสามารถใช้มันได้ดังนั้นมันจะไม่เหมือนกันในแง่ของความเร็ว?
'Production Quantity for Dashboard
For i = 2 To Total_rows_Prod
For j = 2 To Total_rows_Dash
If ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5) = ThisWorkbook.Worksheets("Dashboard").Cells(j, 1) Then
ThisWorkbook.Worksheets("Dashboard").Cells(j, 4) = ThisWorkbook.Worksheets("Dashboard").Cells(j, 4) + ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 31) / ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 4)
End If
Next j
Next i
หลังจากทำการทดสอบคอขวดตามที่แสดงด้านล่าง (เวลารันโค้ดแสดงในแถวที่ 10):
อย่างไรก็ตามเมื่อใช้Index
และMatch
ในขณะที่ใช้เพียง 1 for-next
วงดังที่แสดงในรหัสด้านล่าง:
'Production Quantity for Dashboard
For i = 2 To Total_rows_Prod
m = Application.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0)
If Not IsError(m) Then
ThisWorkbook.Worksheets("Dashboard").Cells(Application.WorksheetFunction.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0), 4) = ThisWorkbook.Worksheets("Dashboard").Cells(Application.WorksheetFunction.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0), 4) + ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 31) / ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 4)
End If
Next i
เวลาทำงานจะเล็กน้อยตามที่แสดงด้านล่าง (ยังอยู่ที่แถว 10):
ครั้งสุดท้ายที่ฉันสามารถทำให้ทุกอย่างทำงานด้วยIndex
และการMatch
ทดแทนคือ 2 วินาที:
แต่ในเน็ตบุ๊กที่ช้ากว่าที่ใช้โปรเซสเซอร์ Pentium Atom จะใช้เวลา 26 วินาทีในการดำเนินการกับรหัสเดียวกัน ดังนั้นฉันสงสัยว่ามีวิธีที่จะลดความเร็วลง 26 วินาทีนั้นหรือไม่
การปรับปรุงใด ๆ ที่จะทำให้เวลาในการดำเนินการลดลงอย่างเหมาะสมนั้นเหมาะสมที่สุด พิจารณาพจนานุกรม แต่ฉันไม่รู้ว่าจะใช้อย่างไรเนื่องจากมีKey
และValue
พารามิเตอร์สำหรับ.Add
และในหัวของฉันมันต้องใช้ 2 for-next
ลูปในการทำสิ่งเดียวกันหรือไม่
Scripting.Dictionary
ด้วยkeys
ไม่ต้องวิ่งfor-next
วนไปทำเช่นนั้น? งั้นฉันจะต้องเรียกใช้for-next
ลูปอื่นเพื่อตรวจสอบพจนานุกรม.Exists
เหรอ? ในขณะที่Index
และMatch
ควรจะต้องมีfor-next
วงเดียวที่จะทำสิ่งทั้งหมด ในแง่ของความเร็วไหนเร็วกว่ากัน?
Dictionary
ค้นหาแบบแฮชแทนที่จะทำการสำรวจทั้งชุด ดูคำตอบนี้บน CRเพื่อให้ได้แนวคิดที่ดีขึ้นเกี่ยวกับสิ่งที่ฉันกำลังพูดถึง
Index
และMatch
เป็นวิธีที่ดีที่สุดในการเข้าถึงสิ่งนี้ จัดเก็บคีย์ที่เกี่ยวข้องจากแผ่นงานที่คุณต้องการจับคู่ใน aScripting.Dictionary
จากนั้นใช้.Exists
เมื่อคุณวนซ้ำอีกปุ่มหนึ่ง การพยายามเขียน VBA เหมือนกับฟังก์ชั่นของ Excel นั้นไม่ใช่วิธีที่จะทำให้ได้ประสิทธิภาพที่ดีที่สุด