Excel UDF ڪم نه ڪري رهيو آهي: مسئلا ۽ حل

  • هن کي شيئر ڪريو
Michael Brown

هن آرٽيڪل ۾، اسان انهن مسئلن تي هڪ نظر وجهنداسين جيڪي توهان کي منهن ڏئي سگهن ٿا جڏهن توهان جي ڪم بڪ ۾ ڪسٽم فنڪشن استعمال ڪندا. مان توهان کي ڏيکارڻ جي ڪوشش ڪندس ته انهن جو سبب ڇا آهي ۽ انهن کي ڪيئن آسانيءَ سان حل ڪري سگهجي ٿو.

هتي اسان ان بابت ڳالهائينداسين:

    اڳ ۾ اسان ڳالهايو هو ته ڇا ڪسٽم فنڪشن آهي، ڪيئن ٺاهيو ۽ استعمال ڪريو. جيڪڏهن توهان محسوس ڪيو ته توهان کي اڳ ۾ ئي UDFs جي بنيادي ڄاڻ کي تازو ڪرڻ جي ضرورت آهي، هڪ وقفو وٺو ۽ منهنجي پوئين آرٽيڪل کي ڏسو.

    Excel UDF ٻيهر ڳڻپ ڇو نه ٿي رهيو آهي؟

    جڏهن توهان ڪي تبديليون آڻيو توهان جو ڪم بڪ، Excel توهان وٽ موجود هر فارمولا کي ٻيهر ڳڻپ نه ڪندو. اهو انهن فارمولن لاءِ نتيجن کي تازه ڪاري ڪندو جيڪي صرف تبديل ٿيل سيلز سان ڳنڍيل آهن.

    پر اهو انديشو آهي معياري Excel افعال. جيئن ته ڪسٽم وارن لاء، Excel VBA ڪوڊ کي درست نٿو ڪري سگهي ۽ ٻين سيلن کي سڃاڻي سگھي ٿو جيڪي پڻ ڪسٽم فنڪشن جي نتيجي کي متاثر ڪري سگھن ٿا. تنهن ڪري، توهان جو ڪسٽم فارمولا تبديل نه ٿي سگھي ٿو جڏهن توهان ورڪ بڪ ۾ تبديليون ڪندا آهيو.

    مسئلا کي حل ڪرڻ لاء، توهان کي صرف Application.Volatile بيان استعمال ڪرڻ جي ضرورت پوندي. ان کي ڪيئن لاڳو ڪجي، قدم قدم جي هدايتن کي سکڻ لاءِ ايندڙ باب چيڪ ڪريو.

    Volatile vs non-volatile Custom functions

    Default طور، Excel ۾ Custom functions volatile نه آهن. هن جو مطلب آهي ته 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 کي سست ڪري سگھن ٿا. آخرڪار، اتي تمام گھڻا ڪسٽم فنڪشن آھن جيڪي پيچيده حسابن کي انجام ڏين ٿا ۽ مسلسل وڏي ڊيٽا جي حدن تي ڪم ڪن ٿا.

    تنهنڪري، مان سفارش ڪريان ٿو ته رڳو اتي ئي volatility استعمال ڪريو جتي ان جي واقعي ضرورت هجي.

    گراهڪ فنڪشن موجود ڇو نه آهن

    جڏهن توهان ڪسٽم فنڪشن جي نالي جا پهريان اکر داخل ڪريو ٿا، اهو ظاهر ٿئي ٿو. ان پٽ سيل جي اڳيان ڊراپ-ڊائون لسٽ ۾، جيئن معياري Excel افعال.

    بهرحال، اهو هميشه نه ٿيندو آهي. ڪهڙيون غلطيون هن صورتحال جو سبب بڻجي سگهن ٿيون؟

    جيڪڏهن توهان وٽ Excel 2003-2007 آهي، ته پوءِ UDF ڪڏهن به ڊراپ ڊائون لسٽ ۾ ظاهر نه ٿيندو. اتي توھان صرف معياري فنڪشن ڏسي سگھو ٿا.

    پر جيڪڏھن توھان Excel جو نئون ورزن استعمال ڪري رھيا آھيو، اتي ھڪ ٻي غلطي آھي توھان اتفاقي طور ڪري سگھو ٿا.

    توھان ڏسندا، ڪسٽم فنڪشن ضرور ھوندو هڪ معياري VBA ماڊل سڏيو ويندو آهي ماڊلز. جڏهن توهان فنڪشن ڪوڊ لکڻ لاءِ نئون ماڊيول شامل ڪندا آهيو ته هڪ ماڊيول فولڊر پاڻمرادو ٺهي ويندو آهي جنهن ۾ سڀ ماڊيول لکيل هوندا آهن.

    پر ڪڏهن ڪڏهن ائين ٿيندو آهي ته نئون ماڊل نه هوندو آهي. پيدا ٿيڻ. ايندڙ اسڪرين شاٽ تي توهان ڏسي سگهو ٿا ته ڪسٽم فنڪشن ڪوڊ "Microsoft Excel Objects" ماڊل ۾ آهي.هي ڪم بڪ.

    نقطو اهو آهي ته توهان ورڪ شيٽ يا ورڪ بڪ جي ڪوڊ واري علائقي ۾ ڪسٽم فنڪشن نٿا رکي سگهو. انهي حالت ۾، فنڪشن ڪم نه ڪندو. ان کان علاوه، اهو ظاهر نه ٿيندو ڊراپ ڊائون لسٽ ۾ افعال جي. تنهن ڪري، ڪوڊ هميشه فولڊر ۾ هجڻ گهرجي ماڊيولز .

    Excel ڪسٽم فنڪشن هيلپ ٽيڪسٽ ڏيکاريل ناهي

    هڪ ٻيو مسئلو ٿي سگهي ٿو اهو اشارو جيڪو توهان ڏسندا آهيو جڏهن توهان پيسٽ ڪندا آهيو. هڪ ڪسٽم فنڪشن. جيڪڏهن توهان هڪ معياري فنڪشن استعمال ڪندا آهيو، توهان هميشه فنڪشن ۽ ان جي دليلن لاء هڪ ٽول ٽائپ ڏسندا. پر UDFs بابت ڇا؟

    جيڪڏهن توهان وٽ تمام گهڻا ڪسٽم فنڪشن آهن، ته توهان لاءِ اهو ياد رکڻ انتهائي مشڪل هوندو ته انهن مان هر هڪ ڪهڙي حساب سان ڪندو آهي. اهو ياد رکڻ به وڌيڪ ڏکيو هوندو ته ڪهڙن دليلن کي استعمال ڪجي. منهنجو خيال آهي ته اهو هڪ سٺو خيال هوندو ته توهان جي حسب ضرورت ڪمن جي وضاحت هڪ ياد ڏياريندڙ جي طور تي هجي.

    ان لاءِ، مان 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 Macro: = strFuncName، _ وضاحت: = strDescr، _ ArgumentDescriptions: = strArgs: = Category "منهنجا ڪسٽم فنڪشن" ختم ڪريو سب

    يا

    سب رجسٽرڊ UDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "مخصوص حد ۾ وڌ ۾ وڌ نمبر" , _ زمرو: = "منهنجو حسب ضرورت ڪم" , _ ArgumentDescriptions: = Array (_ "عددي قدرن جي حد" , _ "لوئر وقفو بور der" , _ "Upper interval border" ) End Sub

    Variable str FuncName فنڪشن جو نالو آهي. strDescr - فنڪشن وضاحت. strArgs متغير هر دليل لاءِ اشارن تي مشتمل آهي.

    توهان حيران ٿي سگهو ٿا ته چوٿون دليل ڇا آهيApplication.MacroOptions. هن اختياري دليل جو نالو رکيو ويو آهي ڪئٽيگوري ۽ اشارو ڪري ٿو ايڪسل فنڪشن جي ڪلاس کي جنهن ۾ اسان جو ڪسٽم GetMaxBetween () فنڪشن رکيو ويندو. توهان ان کي موجوده ڪيٽيگريز مان ڪنهن به نالي پٺيان رکي سگهو ٿا: Math & ؛ Trig, Statistical, Logical, etc. توھان نئين ڪيٽيگريءَ لاءِ نالو بيان ڪري سگھو ٿا جنھن ۾ توھان انھن ڪمن کي جاءِ ڏيندا جيڪي توھان ٺاھيو ٿا. جيڪڏهن توهان ڪيٽيگري آرگيومينٽ استعمال نه ڪندا ته پوءِ ڪسٽم فنڪشن پاڻمرادو ”يوزر ڊفيائنڊ“ ڪيٽيگري ۾ رکيو ويندو.

    فنڪشن ڪوڊ کي ماڊل ونڊو ۾ پيسٽ ڪريو:

    پوءِ ”رن“ بٽڻ تي ڪلڪ ڪريو. ڪمانڊ توهان جي GetMaxBetween() فنڪشن سان Fx بٽڻ استعمال ڪرڻ لاءِ سموريون سيٽنگون انجام ڏيندو.

    جيڪڏهن توهان استعمال ڪندي سيل ۾ فنڪشن داخل ڪرڻ جي ڪوشش ڪندا آهيو Insert Function Tool، توهان ڏسندا ته اتي آهي توهان جو GetMaxBetween فنڪشن "منهنجا ڪسٽم فنڪشن" جي درجي ۾ آهي:

    توهان صرف سيل ۾ فنڪشن جو نالو ٽائيپ ڪرڻ شروع ڪري سگھو ٿا ۽ توھان پنھنجي ڪسٽم فنڪشن کي منتخب ڪرڻ لاءِ فنڪشن جي ڊراپ ڊائون لسٽ ۾ ڏسندا.

    پوءِ ڪال ڪريو فنڪشن مددگار Fx بٽڻ سان.

    ٽپ. توھان پڻ استعمال ڪري سگھو ٿا ڪني ميلاپ CRTL + A فنڪشن مددگار کولڻ لاءِ.

    Function Wizard ونڊو ۾ توهان پنهنجي فنڪشن جي وضاحت ڏسي سگهو ٿا، انهي سان گڏ پهرين دليل لاءِ اشارو. جيڪڏھن توھان پنھنجي ڪرسر کي مٿان رکوٻيو يا ٽيون دليل، توهان انهن لاءِ اشارا به ڏسندا.

    جيڪڏهن توهان انهن اشارن جي متن کي تبديل ڪرڻ چاهيو ٿا، ته strDescr ۽ strArgs<جي قدرن کي تبديل ڪريو. 7> variables ۾ RegisterUDF () ڪوڊ. پوءِ هلايو RegisterUDF () ڪمانڊ ٻيهر.

    جيڪڏهن توهان چاهيو ٿا ته ٺاهيل سموريون سيٽنگون واپس ڪريو ۽ فنڪشن جي تفصيل کي صاف ڪريو، هي ڪوڊ هلايو:

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

    جڏهن توهان ڪسٽم فنڪشن داخل ڪندا آهيو ته اشارو حاصل ڪرڻ لاءِ هڪ وڌيڪ طريقو آهي. فنڪشن جو نالو داخل ڪريو ۽ پوءِ دٻايو Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    توھان سڀني فنڪشن جي دليلن جي فهرست ڏسندا:

    بدقسمتي سان، هتي توهان فنڪشن جي وضاحت ۽ ان جي دليلن کي نه ڏسندا. پر جيڪڏهن دلائل جا نالا خوبصورت معلوماتي آهن، تنهنڪري اهي پڻ مددگار ثابت ٿي سگهن ٿيون. اڃا به، اهو ڪجهه به نه کان بهتر آهي :)

    اهو UDFs لاءِ انٽيليسينس ٺاهڻ لاءِ ٿورو وڌيڪ ڪم وٺندو جيڪي ڪم ڪن ٿا معياري Excel افعال وانگر. بدقسمتي سان، Microsoft ڪنهن به اختيارن کي مهيا نٿو ڪري. صرف حل موجود آهي في الحال هڪ Excel-DNA IntelliSense واڌارو. توھان ڊولپر جي ويب سائيٽ تي وڌيڪ معلومات حاصل ڪري سگھو ٿا.

    اميد آھي، ھي ھدايتون توھان جي مسئلن کي حل ڪرڻ ۾ مدد ڪنديون جڏھن توھان جو ڪسٽم فنڪشن ڪم نٿو ڪري يا نه ٿو ڪريڪم ڪريو جيئن توهان چاهيو. جيڪڏھن توھان جي UDF اڃا تائين ڪم ڪرڻ ۾ ناڪام ٿي، مھرباني ڪري پنھنجي مسئلي کي صحيح بيان ڪريو تبصرن واري حصي ۾. اسان ان کي ڳولڻ جي ڪوشش ڪنداسين ۽ توهان لاء حل ڳولينداسين؛)

    مائيڪل براون هڪ سرشار ٽيڪنالاجي جوش آهي جيڪو سافٽ ويئر اوزار استعمال ڪندي پيچيده عملن کي آسان ڪرڻ جي جذبي سان. ٽيڪنيڪي صنعت ۾ ڏهاڪن کان وڌيڪ تجربي سان، هن پنهنجي صلاحيتن کي Microsoft Excel ۽ Outlook، گڏوگڏ Google Sheets ۽ Docs ۾ ساراهيو آهي. مائيڪل جو بلاگ وقف ڪيو ويو آهي پنهنجي علم ۽ مهارت کي ٻين سان شيئر ڪرڻ لاءِ، پيداوار ۽ ڪارڪردگي کي بهتر ڪرڻ لاءِ آسان پيروي ڪرڻ واريون صلاحون ۽ سبق مهيا ڪرڻ لاءِ. چاهي توهان هڪ تجربيڪار پيشه ور آهيو يا شروعاتي، مائيڪل جو بلاگ انهن ضروري سافٽ ويئر اوزارن مان وڌ کان وڌ فائدو حاصل ڪرڻ لاءِ قيمتي بصيرتون ۽ عملي صلاحون پيش ڪري ٿو.