ฟังก์ชั่นผู้ใช้กำหนดเองโดยไม่ต้องใช้ VBA


10

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

ตัวอย่างเช่นกรณีที่ง่ายและไม่สำคัญคือการเพิ่มหนึ่งในผลลัพธ์ของ SUM () เช่น SUM (mySeries) +1 และเรียกว่าเป็นฟังก์ชันใหม่ MYSUM ()

ฉันลังเลที่จะแปลสูตรยาว ๆ ให้เป็น VBA เนื่องจากข้อผิดพลาดที่อาจเกิดขึ้นและความซับซ้อนที่เพิ่มขึ้น


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

คำตอบ:


11

ใช่มันเป็นไปได้ถ้าคุณใช้สูตร Excel ชื่อ

ตัวอย่างเช่นสมมติว่าคุณต้องการคำนวณความแตกต่างระหว่างผลรวมของคอลัมน์สองคอลัมน์ที่ต่อเนื่องกัน ( A5: Axe - B5: Bx ) ในสถานที่ต่าง ๆ ในเวิร์กบุ๊กของคุณ ( xคือแถวสุดท้ายของแต่ละคอลัมน์):

ดังนั้นคุณกำหนดในA11ชื่อที่เรียกว่าdiff (สามารถใช้ชื่อใดก็ได้) เป็น= Sum (A $ 5: A10) -Sum (B $ 5: B10)โดยสมมติว่าข้อมูลเริ่มต้นในแถวที่5จนกระทั่งแถวก่อนหน้า อาจเป็นเซลล์ใดก็ได้ไม่ใช่แค่A11แต่ความหมายเปลี่ยนไปในทางเดียวกัน

น่าเสียดายที่Excel 2010แทรกส่วนนำหน้าสัมบูรณ์ ( $ ) และส่วนนำหน้าแผ่นงานดังนั้นคุณต้องลบคำนำหน้า แต่เก็บเครื่องหมายอัศเจรีย์และลบ$อักขระส่วนใหญ่

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

ดังนั้นถ้าคุณมีข้อมูลระหว่างC5และD100คุณใส่เพียง= DiffในC101และคำนวณผลรวม (C5: C100) - ซำ (D5: D100)

เห็นได้ชัดว่าคุณสามารถใช้ชื่อท้องถิ่นหรือส่วนกลางในสูตรที่ตั้งชื่อเช่นที่คุณพูดถึงในคำถามของคุณ

คุณสามารถอ่านรายละเอียดเพิ่มเติมในสูตรที่มีชื่อ


2

ฉันรู้ว่าคุณบอกว่าไม่มี VBA แต่การทำดังต่อไปนี้ไม่ต้องการให้คุณเขียนสูตรของคุณใหม่รู้เรื่อง VBA หรือรักษาสูตรของคุณใน VBA คุณสามารถเขียนได้ครั้งเดียวและลืมมัน

สร้างฟังก์ชั่นที่ผู้ใช้กำหนดเองเพื่อแยกสูตรจากเซลล์เป็นสตริง:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

สร้างอีกอันเพื่อประเมินสตริงเหมือนสูตร:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

หากคุณมีสูตรต้นแบบในชีต 1! a1 คุณจะต้องใส่มันลงในทุกเซลล์ที่ต้องใช้:

=eval(getformula(sheet1!a1))

ข้อดีของการใช้วิธีนี้กับ Excel Named Formulas คืออะไร
DakotaD

นี่เป็นการกำหนดฟังก์ชันในขณะที่ "Named Formulas" จะกำหนดการอ้างอิงไปยังผลลัพธ์ =IF(BlankOrWhitespace(A5),true,false)ตัวอย่างเช่นถ้าผมต้องการสร้างฟังก์ชั่นที่จะตรวจสอบว่ามือถือเป็นอย่างใดอย่างหนึ่งหรือเปล่าเพียงช่องว่างให้ฉันต้องการที่จะเรียกมันเหมือน สำหรับ Named Formulas ที่เป็นไปไม่ได้เพราะคุณกำลังอ้างถึงเนื้อหาสูตรของเซลล์และไม่ได้กำหนดฟังก์ชั่นใหม่
mtalexan

1
มีปัญหาอื่นที่เกิดขึ้นจากการใช้ VBA ความปลอดภัย สมุดงานของคุณจะถูกพิจารณาว่าไม่ปลอดภัยเนื่องจาก VBA สามารถถูกทำร้ายได้ สมุดงานของคุณอาจเข้าใจผิดว่ามีไวรัส
Akangka

@Akangkathe เหตุผลที่ฉันหลีกเลี่ยง VBA ช่างเศร้าเหลือเกิน
Pedro77

0

เธรดนี้ค่อนข้างเก่า แต่ฉันเจอสิ่งอื่นและคิดว่าฉันแบ่งปันเวิร์กบุ๊กที่ฉันสร้างขึ้นมาและพยายามที่จะทำสิ่งนี้ให้สำเร็จ: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? ดล = 1

ในระยะสั้นคุณสามารถสร้าง UDF โดยไม่ต้อง VBA (เรียงลำดับ) โดยการจี้หนึ่งในสูตรในตัวของ Excel ด้วยเอาต์พุตสตริง 0 ความยาวและมาพร้อมกับวิธีการตีความข้อมูลที่แทรกผ่านการจัดการสตริงของ Named Range แต่เป็น เกินกว่าจะไม่มีประสิทธิภาพที่จะทำ คุณได้รับการเตือนแล้ว! :)

วิธี:

  1. ในตัวอย่างฉันใช้ทั้ง= REPT ([การอ้างอิงเซลล์หรือข้อความระหว่างเครื่องหมายคำพูดที่นี่], 0)และ= TEXT ([การอ้างอิงเซลล์หรือข้อความระหว่างเครื่องหมายคำพูดที่นี่], ";;;")เป็นจุดเริ่มต้น สามารถมีรูปแบบการป้อนข้อมูลของผู้ใช้ในสูตรในตัวที่จะไม่สร้างผลลัพธ์ข้อความใด ๆ ที่มองเห็นได้ในเซลล์

  2. จากนั้นฉันสร้างNamed Rangeที่จะเทียบเท่ากับชื่อ UDF ของคุณ ( TCaseเป็นตัวอย่างหลักในชีต แต่ยังมีรูปแบบอื่น ๆ อีกมากมาย) ช่วงการตั้งชื่อนี้จริง ๆ แล้วอ้างอิงโฮสต์ทั้งหมดของชื่อที่ซ่อนอยู่อื่น ๆ ในสมุดงานเพื่อแยกFormulaTextจากเซลล์ที่ใช้ภายในแล้วใช้ตรรกะบางอย่างเพื่อสร้างผลลัพธ์สุดท้ายเป็นสตริง เป็นที่น่าสังเกตว่าวิธีการนี้สามารถส่งคืนผลลัพธ์ข้อความได้และไม่ใช่ตัวเลข (แม้ว่าจะสามารถส่งกลับตัวเลขเป็นข้อความเพื่อแปลงในเซลล์อื่น)

  3. ด้วยตัวเอง= TCaseก่อให้เกิดข้อผิดพลาดเนื่องจากไม่มีการอ้างอิงเซลล์ / สตริงเพื่อให้ตีความ (ในแผ่นตัวอย่างข้อความแสดงข้อผิดพลาดเป็นเพียงตัวเตือนความจำของรูปแบบที่จำเป็นต้องปฏิบัติตาม) แต่การรวมTCase เข้ากับสูตร Excel สตริงความยาว 0 ที่คาดว่าจะช่วยให้สามารถอ่านอินพุตจากสูตรเป็นสตริงและใช้ตรรกะของคุณกับมัน ในท้ายที่สุดสูตร / ผลลัพธ์จะมีลักษณะดังนี้ โปรดทราบว่าฉันใส่สตริงข้อความลงในสูตรด้านล่างโดยตรง แต่คุณจะเห็นในแผ่นตัวอย่างที่มันสามารถตีความการอ้างอิงเซลล์เดียว

    สูตร:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    เอาท์พุท:

    I Want to Convert This Mixed String Into a Title Case String!!!

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

หมายเหตุ:หากคุณต้องการดูว่ามันทำงานอย่างไรในไฟล์ตัวอย่างง่ายขึ้นเล็กน้อยให้ใช้ Evaluate Formulaจาก Ribbon ของ Formulas และขั้นตอนการเข้า / ออกของสูตรในหนึ่งในเซลล์ที่ฉันแทรกตัวอย่าง ฉันซ่อนช่วงชื่อพื้นฐานทั้งหมดเพื่อล้างข้อมูลทั้งหมดหลังจากเสร็จสิ้นดังนั้นพวกเขาจึงไม่ปรากฏใน Names Managerเว้นแต่คุณจะซ่อนพวกเขาทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.