สารบัญ
ในบทความนี้ เราจะพิจารณาปัญหาที่คุณอาจพบเมื่อใช้ฟังก์ชันแบบกำหนดเองในสมุดงานของคุณ ฉันจะพยายามแสดงให้คุณเห็นว่าอะไรเป็นสาเหตุของอาการเหล่านี้และสามารถแก้ไขได้ง่ายเพียงใด
ต่อไปนี้คือสิ่งที่เราจะพูดถึง:
ก่อนหน้านี้เราได้พูดถึงสิ่งที่ 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 SubVariable 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 ของคุณยังคงใช้งานไม่ได้ โปรดอธิบายปัญหาของคุณอย่างถูกต้องในส่วนความคิดเห็น เราจะพยายามคิดและหาทางออกให้คุณ ;)