เรียนรู้วิธีดีบักฟังก์ชันแบบกำหนดเองใน Excel

  • แบ่งปันสิ่งนี้
Michael Brown

เมื่อคุณทราบวิธีการสร้าง 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 แล้วบันทึก

    เพียงเท่านี้สำหรับวันนี้ เราได้กล่าวถึงวิธีต่างๆ ในการแก้ไขจุดบกพร่องของฟังก์ชันแบบกำหนดเอง และเรียนรู้วิธีใช้งานในสมุดงานของคุณ เราหวังว่าคุณจะพบว่าหลักเกณฑ์เหล่านี้เป็นประโยชน์ หากคุณมีคำถามใดๆ เขียนความคิดเห็นในบทความนี้

    Michael Brown เป็นผู้ที่ชื่นชอบเทคโนโลยีโดยเฉพาะและมีความหลงใหลในการทำให้กระบวนการที่ซับซ้อนง่ายขึ้นโดยใช้เครื่องมือซอฟต์แวร์ ด้วยประสบการณ์กว่าทศวรรษในอุตสาหกรรมเทคโนโลยี เขาได้ฝึกฝนทักษะของเขาใน Microsoft Excel และ Outlook รวมถึง Google ชีตและเอกสาร บล็อกของ Michael ทุ่มเทให้กับการแบ่งปันความรู้และความเชี่ยวชาญของเขากับผู้อื่น โดยให้คำแนะนำและแบบฝึกหัดที่ทำตามได้ง่ายเพื่อปรับปรุงผลิตภาพและประสิทธิภาพ ไม่ว่าคุณจะเป็นมืออาชีพที่ช่ำชองหรือมือใหม่ บล็อกของ Michael นำเสนอข้อมูลเชิงลึกอันมีค่าและคำแนะนำที่เป็นประโยชน์สำหรับการใช้ประโยชน์สูงสุดจากเครื่องมือซอฟต์แวร์ที่จำเป็นเหล่านี้