ฉันได้รับการแก้ไขแล้วอื่น ๆ อีกหลายที่ใช้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 นั้นไม่ใช่วิธีที่จะทำให้ได้ประสิทธิภาพที่ดีที่สุด