Excel UDF ไม่ทำงาน: ปัญหาและวิธีแก้ไข

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

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

ต่อไปนี้คือสิ่งที่เราจะพูดถึง:

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

    เหตุใด Excel UDF จึงไม่คำนวณใหม่

    เมื่อคุณทำการเปลี่ยนแปลงใดๆ ใน สมุดงานของคุณ Excel จะไม่คำนวณสูตรทุกสูตรที่คุณมีใหม่ โดยจะอัปเดตผลลัพธ์สำหรับสูตรที่เชื่อมโยงกับเซลล์ที่เปลี่ยนแปลงเท่านั้น

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

    ในการแก้ไขปัญหา คุณจะต้องใช้คำสั่ง Application.Volatile ดูบทถัดไปเพื่อเรียนรู้คำแนะนำทีละขั้นตอนเกี่ยวกับวิธีการใช้

    ฟังก์ชันแบบกำหนดเองแบบลบเลือนและไม่ลบเลือน

    ตามค่าเริ่มต้น ฟังก์ชันแบบกำหนดเองใน Excel จะไม่ลบเลือน ซึ่งหมายความว่า UDF จะถูกคำนวณใหม่ก็ต่อเมื่อค่าของเซลล์ใดๆ ที่อ้างถึงมีการเปลี่ยนแปลงเท่านั้น แต่ถ้าเป็นรูปแบบของเซลล์ ชื่อของเซลล์เวิร์กชีต ชื่อของไฟล์จะเปลี่ยนแปลง จากนั้นจะไม่มีการเปลี่ยนแปลงใดๆ ใน UDF

    มาเปลี่ยนจากคำเป็นตัวอย่างกัน ตัวอย่างเช่น คุณต้องจดชื่อสมุดงานของคุณลงในเซลล์ ในการทำเช่นนี้ คุณต้องสร้างฟังก์ชันแบบกำหนดเอง:

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    ลองนึกภาพกรณีต่อไปนี้ คุณเขียนสูตรที่กำหนดเอง =WorkbookName() ลงในเซลล์และได้ชื่อไฟล์ที่นั่น คุณตัดสินใจที่จะเปลี่ยนชื่อไฟล์และบันทึกด้วยชื่ออื่น แต่คุณดูที่ค่าในเซลล์และเห็นว่าไม่มีการเปลี่ยนแปลง ยังมีชื่อไฟล์เก่าซึ่งไม่ถูกต้องอีกต่อไป

    เนื่องจากไม่มีอาร์กิวเมนต์ในฟังก์ชันนี้ ฟังก์ชันจะไม่ถูกคำนวณใหม่ (แม้ว่าคุณจะเปลี่ยนชื่อสมุดงาน ปิดแล้วเปิดใหม่ มัน).

    หมายเหตุ. หากต้องการคำนวณฟังก์ชันทั้งหมดในไฟล์ของคุณใหม่ คุณสามารถใช้ปุ่มลัด Ctrl + Alt + F9

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

    Application.Volatile

    ดังนั้น โค้ดของคุณจะมีลักษณะดังนี้:

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

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

    หมายเหตุ โปรดทราบว่าฟังก์ชันที่ผันผวนมากเกินไปอาจทำให้ Excel ของคุณช้าลงได้ ท้ายที่สุด มีฟังก์ชันแบบกำหนดเองจำนวนมากเกินไปที่ทำการคำนวณที่ซับซ้อนและดำเนินการกับช่วงข้อมูลขนาดใหญ่อย่างต่อเนื่อง

    ดังนั้น ฉันขอแนะนำให้ใช้ความผันผวนเมื่อจำเป็นจริงๆ เท่านั้น

    เหตุใดจึงไม่สามารถใช้ฟังก์ชันแบบกำหนดเองได้

    เมื่อคุณป้อนตัวอักษรตัวแรกของชื่อฟังก์ชันแบบกำหนดเอง ดูเหมือนว่า ในรายการแบบเลื่อนลงถัดจากเซลล์อินพุต เช่นเดียวกับฟังก์ชันมาตรฐานของ Excel

    อย่างไรก็ตาม สิ่งนี้ไม่ได้เกิดขึ้นเสมอไป ข้อผิดพลาดใดที่ทำให้เกิดสถานการณ์นี้ได้บ้าง

    หากคุณมี Excel 2003-2007 UDF จะไม่ปรากฏในรายการแบบเลื่อนลง คุณจะเห็นเฉพาะฟังก์ชันมาตรฐานเท่านั้น

    แต่แม้ว่าคุณจะใช้ Excel เวอร์ชันใหม่กว่า ก็ยังมีข้อผิดพลาดอีกอย่างที่คุณอาจทำโดยไม่ได้ตั้งใจ

    คุณจะเห็นว่าฟังก์ชันที่กำหนดเองจะต้องอยู่ใน โมดูล VBA มาตรฐานที่เรียกว่าโมดูล เมื่อคุณเพิ่มโมดูลใหม่เพื่อเขียนโค้ดฟังก์ชัน โฟลเดอร์โมดูลจะถูกสร้างขึ้นโดยอัตโนมัติซึ่งมีการเขียนโมดูลทั้งหมด

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

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

    ข้อความช่วยเหลือของฟังก์ชันแบบกำหนดเองของ Excel ไม่แสดงขึ้น

    ปัญหาอื่นที่อาจเกิดขึ้นคือคำแนะนำที่คุณเห็นเมื่อคุณวาง ฟังก์ชันแบบกำหนดเอง หากคุณใช้ฟังก์ชันมาตรฐาน คุณจะเห็นคำแนะนำเครื่องมือสำหรับฟังก์ชันและอาร์กิวเมนต์ของมันเสมอ แล้ว UDF ล่ะ?

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

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

    มาดูวิธีเพิ่มคำแนะนำดังกล่าวใน UDF ของคุณ ในบทความก่อนหน้านี้ เราดูที่ฟังก์ชันกำหนดเอง GetMaxBetween ค้นหาจำนวนสูงสุดในช่วงที่ระบุและรับอาร์กิวเมนต์สามตัว: ช่วงของค่าตัวเลข และค่าสูงสุดและต่ำสุดเป็นค้นหา

    ตอนนี้เราจะเพิ่มคำอธิบายสำหรับฟังก์ชันที่กำหนดเองนี้ ในการทำเช่นนี้ ให้สร้างและเรียกใช้คำสั่ง Application.MacroOptions สำหรับฟังก์ชัน GetMaxBetween คุณสามารถเรียกใช้คำสั่งต่อไปนี้:

    Sub RegisterUDF () Dim strFuncName As String ' ชื่อของฟังก์ชันที่คุณต้องการลงทะเบียน Dim strDescr As String ' คำอธิบายของฟังก์ชัน ตัวเอง Dim strArgs () As String ' คำอธิบายของฟังก์ชันอาร์กิวเมนต์ ' ลงทะเบียนฟังก์ชัน GetMaxBetween ReDim strArgs (1 ถึง 3) ' จำนวนอาร์กิวเมนต์ในฟังก์ชันของคุณ strFuncName = "GetMaxBetween" strDescr = "จำนวนสูงสุดในช่วงที่ระบุ" strArgs (1) = "ช่วงของค่าตัวเลข" strArgs (2) = "เส้นขอบช่วงล่าง" strArgs (3) = " ขอบช่วงบน" Application.MacroOptions มาโคร: = strFuncName, _ คำอธิบาย: = strDescr, _ ArgumentDescriptions: = strArgs, _ หมวดหมู่: = " My Custom Functions " End Sub

    or

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "จำนวนสูงสุดในช่วงที่ระบุ" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "ช่วงของค่าตัวเลข" , _ "Bor ช่วงเวลาที่ต่ำกว่า der" , _ "Upper interval border" ) End Sub

    Variable str FuncName คือชื่อของฟังก์ชัน strDescr - คำอธิบายฟังก์ชัน ตัวแปร strArgs มีคำใบ้สำหรับแต่ละอาร์กิวเมนต์

    คุณอาจสงสัยว่าอาร์กิวเมนต์ที่สี่ของApplication.MacroOptions. อาร์กิวเมนต์ทางเลือกนี้มีชื่อว่า หมวดหมู่ และระบุคลาสของฟังก์ชัน Excel ที่ฟังก์ชัน GetMaxBetween () แบบกำหนดเองของเราจะใส่เข้าไป คุณสามารถตั้งชื่อตามหมวดหมู่ที่มีอยู่: คณิตศาสตร์ & ; Trig, Statistical, Logical ฯลฯ คุณสามารถระบุชื่อสำหรับหมวดหมู่ใหม่ที่คุณจะวางฟังก์ชันที่คุณสร้างขึ้น หากคุณไม่ได้ใช้อาร์กิวเมนต์ Category ฟังก์ชันที่กำหนดเองจะถูกจัดอยู่ในหมวดหมู่ "กำหนดโดยผู้ใช้" โดยอัตโนมัติ

    วางโค้ดฟังก์ชันลงในหน้าต่างโมดูล:

    จากนั้นคลิกที่ปุ่ม “เรียกใช้” คำสั่งจะทำการตั้งค่าทั้งหมดสำหรับการใช้ปุ่ม Fx กับฟังก์ชัน GetMaxBetween() ของคุณ

    หากคุณพยายามแทรกฟังก์ชันลงในเซลล์โดยใช้ปุ่ม เครื่องมือแทรกฟังก์ชัน คุณจะเห็นว่ามีฟังก์ชัน GetMaxBetween ของคุณอยู่ในหมวดหมู่ "ฟังก์ชันที่กำหนดเองของฉัน":

    คุณ เพียงเริ่มพิมพ์ชื่อฟังก์ชันลงในเซลล์ แล้วคุณจะเห็นฟังก์ชันที่กำหนดเองของคุณในรายการแบบเลื่อนลงของฟังก์ชันให้เลือก

    จากนั้นเรียก ตัวช่วยสร้างฟังก์ชัน ด้วยปุ่ม Fx

    เคล็ดลับ คุณยังสามารถใช้คีย์ผสม CRTL + A เพื่อเปิด Function Wizard

    ในหน้าต่าง ตัวช่วยสร้างฟังก์ชัน คุณจะเห็นคำอธิบายเกี่ยวกับฟังก์ชันของคุณ รวมทั้งคำใบ้สำหรับอาร์กิวเมนต์แรก หากคุณวางเคอร์เซอร์ไว้บนอาร์กิวเมนต์ที่สองหรือสาม คุณจะเห็นคำแนะนำสำหรับพวกเขาด้วย

    ถ้าคุณต้องการเปลี่ยนข้อความของคำแนะนำเหล่านี้ ให้เปลี่ยนค่าของ strDescr และ strArgs ตัวแปรในโค้ด RegisterUDF () จากนั้นรันคำสั่ง RegisterUDF () อีกครั้ง

    หากคุณต้องการเลิกทำการตั้งค่าทั้งหมดและล้างคำอธิบายฟังก์ชัน ให้รันโค้ดนี้:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    มีอีกหนึ่งวิธีในการรับคำใบ้เมื่อคุณป้อนฟังก์ชันแบบกำหนดเอง ป้อนชื่อฟังก์ชันแล้วกด Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    คุณจะเห็นรายการอาร์กิวเมนต์ของฟังก์ชันทั้งหมด:

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

    การสร้างระบบอัจฉริยะสำหรับ UDF ที่ทำงานเหมือนฟังก์ชันมาตรฐานของ Excel จะใช้เวลาเพิ่มขึ้นเล็กน้อย น่าเสียดายที่ Microsoft ไม่มีตัวเลือกใดๆ โซลูชันเดียวที่มีอยู่ในขณะนี้คือส่วนขยาย Excel-DNA IntelliSense คุณสามารถค้นหาข้อมูลเพิ่มเติมได้จากเว็บไซต์ของผู้พัฒนา

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

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