สารบัญ
เมื่อคุณทราบวิธีการสร้าง UDF แล้ว (และฉันหวังว่าคุณจะได้ลองนำไปใช้ใน Excel ของคุณด้วย) เรามาเจาะลึกกันสักหน่อยและดูว่าสามารถทำอะไรได้บ้างในกรณีที่ฟังก์ชันที่กำหนดโดยผู้ใช้ของคุณไม่ทำงาน
เพื่อแก้ปัญหาบางอย่างเมื่อสร้างฟังก์ชันแบบกำหนดเอง คุณมักจะต้องเรียกใช้การแก้ไขจุดบกพร่อง จากนั้นคุณจะมั่นใจได้ว่าฟังก์ชันทำงานอย่างถูกต้อง
เราจะสำรวจเทคนิคการดีบักต่อไปนี้:
เมื่อคุณสร้างฟังก์ชันที่กำหนดเอง มีความเป็นไปได้เสมอ ว่าคุณจะทำผิดพลาด ฟังก์ชันแบบกำหนดเองมักจะค่อนข้างซับซ้อน และไม่ได้เริ่มทำงานอย่างถูกต้องในทันทีเสมอไป สูตรอาจส่งคืนผลลัพธ์ที่ไม่ถูกต้องหรือ #VALUE! ข้อผิดพลาด. ซึ่งแตกต่างจากฟังก์ชันมาตรฐานของ Excel คุณจะไม่เห็นข้อความอื่นๆ เลย
มีวิธีดำเนินการตามฟังก์ชันที่กำหนดเองทีละขั้นตอนเพื่อตรวจสอบว่าแต่ละคำสั่งทำงานอย่างไร แน่นอน! การดีบักใช้สำหรับสิ่งนี้
ฉันจะเสนอวิธีแก้ไขข้อบกพร่องของฟังก์ชันที่กำหนดเองให้คุณหลายวิธี เพื่อให้คุณสามารถเลือกวิธีที่เหมาะกับคุณ
ตัวอย่างเช่น เราใช้ฟังก์ชันที่กำหนดเอง GetMaxBetween จากหนึ่งในบทความก่อนหน้านี้ซึ่งคำนวณจำนวนสูงสุดในช่วงค่าที่ระบุ:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim ฉันเป็นจำนวนเต็ม ReDim arrNums (rngCells.Count) สำหรับแต่ละ NumRange ใน rngCells vMax =NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Functionอาร์กิวเมนต์ของฟังก์ชันคือ ช่วงของเซลล์ที่มีการเขียนตัวเลข ตลอดจนขีดจำกัดบนและล่างของค่า
วางฟังก์ชัน MsgBox ในตำแหน่งที่สำคัญ
เพื่อตรวจสอบการดำเนินการคำนวณ คุณสามารถแสดง ค่าของตัวแปรที่สำคัญที่สุดบนหน้าจอในตำแหน่งที่ถูกต้อง ซึ่งสามารถทำได้โดยใช้กล่องโต้ตอบป๊อปอัป
MsgBox เป็นกล่องโต้ตอบที่คุณสามารถใช้เพื่อแสดงข้อความบางประเภทแก่ผู้ใช้
ไวยากรณ์ของ MsgBox คล้ายกับฟังก์ชัน VBA อื่นๆ:
MsgBox(พรอมต์ [, ปุ่ม] [, ชื่อเรื่อง] [, helpfile, บริบท])พรอมต์ เป็นอาร์กิวเมนต์ที่จำเป็น ประกอบด้วยข้อความที่คุณเห็นในกล่องโต้ตอบ นอกจากนี้ยังสามารถใช้เพื่อแสดงค่าของตัวแปรแต่ละตัว
อาร์กิวเมนต์อื่น ๆ ทั้งหมดเป็นตัวเลือก
[ ปุ่ม ] - กำหนดว่าปุ่มและไอคอนใดบ้าง แสดงใน MsgBox ตัวอย่างเช่น ถ้าเราใช้ตัวเลือก vbOkOnly จะแสดงเฉพาะปุ่ม ตกลง แม้ว่าคุณจะพลาดอาร์กิวเมนต์นี้ ปุ่มนี้จะถูกใช้เป็นค่าเริ่มต้น
[ ชื่อเรื่อง ] - คุณสามารถระบุชื่อเรื่องของกล่องข้อความได้ที่นี่
มาเปลี่ยนจาก คำที่จะฝึกฝนและเริ่มแก้ไขข้อบกพร่อง เพื่อแสดงเพิ่มบรรทัดต่อไปนี้ในโค้ดของฟังก์ชันที่ผู้ใช้กำหนด GetMaxBetween ก่อนตัวดำเนินการ Case Else :
MsgBox vMax,, "Count -" & ฉันนี่คือสิ่งที่เราจะได้รับในผลลัพธ์:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) สำหรับแต่ละ NumRange ใน rngCells vMax = NumRange เลือก Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Functionการใช้ตัวแปร vMax ในกล่องโต้ตอบ เราจะดูว่าตัวเลขใดตรงกับเกณฑ์การเลือก ดังนั้น ที่เราสามารถเลือกขนาดใหญ่ที่สุดได้ ด้วยนิพจน์ "นับ -" & ฉัน ในแถบชื่อเรื่อง เราระบุจำนวนที่เราเลือกไว้แล้วเพื่อกำหนดค่าสูงสุด ตัวนับจะเพิ่มขึ้นตามค่าใหม่แต่ละค่า
เมื่อเรามีชุด UDF แล้ว เราจะใช้สูตรด้านล่างกับช่วงวันที่:
= GetMaxBetween (A1:A6,10,50)
หลังจากปุ่ม Enter กดแล้วคุณจะเห็นข้อความตามภาพหน้าจอด้านล่าง:
นี่คือตัวเลขแรกในช่วง A1: A6 ที่ตรงตามเกณฑ์: มากกว่า 10 แต่น้อยกว่า มากกว่า 50
หลังจากที่คุณคลิกตกลง ข้อความที่สองจะปรากฏขึ้นพร้อมหมายเลข 14 ตัวเลขที่เหลือไม่ตรงกับส่วนที่เลือกเกณฑ์. ดังนั้น ฟังก์ชันจึงออกและส่งกลับค่าที่ใหญ่ที่สุดในสองค่า 17.
ฟังก์ชัน MsgBox สามารถใช้ในตำแหน่งที่สำคัญที่สุดในฟังก์ชันแบบกำหนดเองของคุณเพื่อควบคุมวิธีค่าต่างๆ ของตัวแปรแต่ละตัวเปลี่ยนไป กล่องข้อความจะมีประโยชน์มากเมื่อคุณมีฟังก์ชันขนาดใหญ่และมีการคำนวณจำนวนมาก ในกรณีนี้ คุณจะระบุได้ง่ายว่าส่วนใดของโค้ดที่เกิดข้อผิดพลาด
กำหนดจุดหยุดและดำเนินการทีละขั้นตอน
คุณสามารถเพิ่มจุดหยุดให้กับโค้ดของ ฟังก์ชันของคุณที่การเรียกใช้โค้ดจะหยุดลง เพื่อให้คุณสามารถทำตามขั้นตอนการคำนวณทีละขั้นตอน ในการทำเช่นนั้น คุณสามารถดูได้ว่าค่าของตัวแปรเปลี่ยนแปลงอย่างไร
หากต้องการเพิ่มเบรกพอยต์ ให้วางเคอร์เซอร์บนบรรทัดที่มีคำสั่งที่คุณเลือกที่จะหยุดชั่วคราว จากนั้นคลิกขวาและเลือก Debug -> สลับเบรกพอยต์ หรือเพียงแค่กด F9 คุณยังสามารถคลิกในตำแหน่งที่ต้องการในพื้นที่สีเทาแนวตั้งทางด้านซ้ายของโค้ดฟังก์ชัน
วงกลมสีแดงจะปรากฏขึ้น ดังที่คุณเห็นในภาพหน้าจอด้านล่าง บรรทัดของโค้ดที่จะหยุดการคำนวณจะถูกเน้นด้วยสีแดง
ตอนนี้ หน้าต่างตัวแก้ไข VBA จะเปิดขึ้นเมื่อฟังก์ชันกำลังทำงาน เคอร์เซอร์จะอยู่ที่ตำแหน่งที่คุณหยุด
ถ้าคุณเลื่อนเคอร์เซอร์ไปเหนือตัวแปรใดๆ ในโค้ดฟังก์ชัน คุณจะเห็นตัวแปรปัจจุบันค่า:
กด F5 เพื่อดำเนินการคำนวณต่อไป
หมายเหตุ หลังจากเบรกพอยต์ คุณสามารถเริ่มติดตามความคืบหน้าของการคำนวณทีละขั้นตอน หากคุณกดปุ่ม F8 ระบบจะดำเนินการโค้ด VBA บรรทัดถัดไปเพียงบรรทัดเดียว เส้นสีเหลืองที่มีลูกศรจะย้ายไปยังตำแหน่งรหัสที่ดำเนินการล่าสุด
เนื่องจากการเรียกใช้ฟังก์ชันหยุดชั่วคราวอีกครั้ง คุณสามารถดูค่าปัจจุบันของตัวแปรทั้งหมดของฟังก์ชันได้โดยใช้เคอร์เซอร์ของเมาส์
การกด F8 ครั้งต่อไปจะทำให้เราก้าวไปข้างหน้าหนึ่งก้าว . ดังนั้นคุณสามารถกด F8 จนจบการคำนวณ หรือกด F5 เพื่อดำเนินการคำนวณต่อจนถึงเบรกพอยต์ถัดไป
หากเกิดข้อผิดพลาด เคอร์เซอร์จะหยุดที่จุดในโค้ดที่เกิดข้อผิดพลาด และคุณจะเห็นข้อความแสดงข้อผิดพลาดป๊อปอัป ทำให้ง่ายต่อการระบุสาเหตุของปัญหา
เบรกพอยต์ที่คุณระบุจะถูกนำไปใช้จนกว่าคุณจะปิดไฟล์ เมื่อคุณเปิดใหม่ คุณจะต้องตั้งค่าใหม่อีกครั้ง ไม่ใช่วิธีที่สะดวกที่สุดใช่ไหม
อย่างไรก็ตาม ปัญหานี้สามารถแก้ไขได้ ใส่คำสั่ง หยุด ลงในโค้ดฟังก์ชันที่จุดที่จำเป็น และคุณสามารถหยุดการทำงานของโปรแกรมในลักษณะเดียวกับเมื่อใช้จุดพัก
เมื่อ VBA พบคำสั่ง Stop ก็จะหยุดการทำงานของโปรแกรมและรอการดำเนินการของคุณ ตรวจสอบค่าของตัวแปรแล้วกด F5 เพื่อดำเนินการต่อ
หรือกด F8 เพื่อปฏิบัติตามฟังก์ชันทีละขั้นตอนตามที่อธิบายไว้ข้างต้น
คำสั่ง หยุด เป็นส่วนหนึ่งของโปรแกรม ดังนั้นจึงเป็น ไม่ถูกลบเช่นเดียวกับเบรกพอยต์ เมื่อคุณแก้ไขจุดบกพร่องเสร็จแล้ว ให้นำออกด้วยตัวคุณเอง หรือเปลี่ยนเป็นความคิดเห็นโดยนำหน้าด้วยเครื่องหมายคำพูดเดี่ยว (')
การดีบักโดยใช้ตัวดำเนินการ Debug.Print
คุณสามารถวาง Debug.Print ใน รหัสฟังก์ชันในตำแหน่งที่ถูกต้อง สิ่งนี้มีประโยชน์สำหรับการตรวจสอบค่าของตัวแปรที่มีการเปลี่ยนแปลงตามวัฏจักร
คุณสามารถดูตัวอย่างประสิทธิภาพของ Debug.Print ได้ในภาพหน้าจอด้านล่าง
Statement Debug.Print i, vMax พิมพ์ค่าและเลขลำดับของมัน
ในหน้าต่าง Immediate คุณจะเห็นตัวเลขสองตัว (17 และ 14) จากช่วงที่เลือก ซึ่งสอดคล้องกับ กำหนดขีด จำกัด และสูงสุดที่จะถูกเลือก ตัวเลข 1 และ 2 หมายความว่าฟังก์ชันได้เลือกตัวเลขครบ 2 รอบแล้ว เราเห็นค่าของตัวแปรที่สำคัญที่สุด เช่นเดียวกับที่เราทำก่อนหน้านี้ด้วย MsgBox แต่สิ่งนี้ไม่ได้หยุดฟังก์ชันนี้
เรียกใช้ฟังก์ชันจากโพรซีเดอร์
คุณสามารถเรียกฟังก์ชันที่ผู้ใช้กำหนดได้ ไม่ใช่จากเซลล์ในแผ่นงาน แต่เรียกจากโพรซีเดอร์ ในกรณีนี้ ข้อผิดพลาดทั้งหมดจะแสดงในหน้าต่าง Visual Basic Editor
นี่คือวิธีที่คุณสามารถเรียกใช้ฟังก์ชัน GetMaxBerween ที่ผู้ใช้กำหนดจากขั้นตอน:
Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6" ), 10, 50) MsgBox(x) End Subวางเคอร์เซอร์ไว้ที่ใดก็ได้ในโค้ดแล้วกด F5 หากไม่มีข้อผิดพลาดในฟังก์ชัน คุณจะเห็นหน้าต่างป๊อปอัปพร้อมผลการคำนวณ
ในกรณีที่เกิดข้อผิดพลาด คุณจะเห็นข้อความที่เกี่ยวข้องในโปรแกรมแก้ไข VBA การคำนวณจะหยุดลงและบรรทัดของรหัสที่เกิดข้อผิดพลาดจะถูกเน้นด้วยสีเหลือง คุณสามารถระบุตำแหน่งและสาเหตุที่เกิดข้อผิดพลาดได้อย่างง่ายดาย
นั่นคือทั้งหมด ตอนนี้คุณได้สร้าง Add-in ของคุณเอง เพิ่มลงใน Excel และคุณสามารถใช้ UDF ในนั้นได้ หากคุณต้องการใช้ UDF มากขึ้น เพียงเขียนโค้ดในโมดูล Add-in ในตัวแก้ไข VBA แล้วบันทึก
เพียงเท่านี้สำหรับวันนี้ เราได้กล่าวถึงวิธีต่างๆ ในการแก้ไขจุดบกพร่องของฟังก์ชันแบบกำหนดเอง และเรียนรู้วิธีใช้งานในสมุดงานของคุณ เราหวังว่าคุณจะพบว่าหลักเกณฑ์เหล่านี้เป็นประโยชน์ หากคุณมีคำถามใดๆ เขียนความคิดเห็นในบทความนี้