Excel UDF-ը չի աշխատում. խնդիրներ և լուծումներ

  • Կիսվել Սա
Michael Brown

Այս հոդվածում մենք կանդրադառնանք այն խնդիրներին, որոնց կարող եք հանդիպել ձեր աշխատանքային գրքերում հատուկ գործառույթներ օգտագործելիս: Ես կփորձեմ ձեզ ցույց տալ, թե ինչն է դրանք առաջացնում և որքան հեշտ է դրանք լուծել:

Ահա թե ինչի մասին կխոսենք. մաքսային ֆունկցիան այն է, թե ինչպես ստեղծել և օգտագործել այն: Եթե ​​կարծում եք, որ նախապես պետք է թարմացնեք 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 մոդուլ, որը կոչվում է Modules: Երբ դուք նոր մոդուլ եք ավելացնում ֆունկցիայի կոդը գրելու համար, ավտոմատ կերպով ստեղծվում է Modules թղթապանակ, որտեղ գրված են բոլոր մոդուլները:

Բայց երբեմն պատահում է, որ նոր մոդուլը չի ստեղծվելը. Հաջորդ սքրինշոթում կարող եք տեսնել, որ հատուկ գործառույթի կոդը գտնվում է «Microsoft Excel Objects» մոդուլում, ինչպես նաևThis Workbook:

Բանն այն է, որ դուք չեք կարող հատուկ գործառույթ տեղադրել աշխատանքային թերթիկի կամ աշխատանքային գրքի կոդային տարածքում: Այս դեպքում գործառույթը չի աշխատի: Ավելին, այն չի հայտնվի գործառույթների բացվող ցանկում: Հետևաբար, կոդը միշտ պետք է լինի Modules թղթապանակում:

Excel-ի հատուկ գործառույթի օգնության տեքստը չի ցուցադրվում

Մեկ այլ խնդիր կարող է առաջանալ այն հուշումն է, որը դուք տեսնում եք տեղադրելիս: հատուկ գործառույթ: Եթե ​​դուք օգտագործում եք ստանդարտ գործառույթ, դուք միշտ կտեսնեք գործիքի հուշում գործառույթի և դրա արգումենտների համար: Բայց ինչ վերաբերում է UDF-ներին:

Եթե դուք ունեք շատ հատուկ գործառույթներ, ձեզ համար չափազանց դժվար կլինի հիշել, թե դրանցից յուրաքանչյուրը ինչ հաշվարկներ է կատարում: Էլ ավելի դժվար կլինի հիշել, թե որ փաստարկներն օգտագործել։ Կարծում եմ, լավ գաղափար կլինի որպես հիշեցում ունենալ ձեր հատուկ գործառույթների նկարագրությունը:

Դրա համար ես կառաջարկեի օգտագործել Application.MacroOptions մեթոդը: Այն կօգնի ձեզ ցույց տալ ոչ միայն ֆունկցիայի, այլև դրա յուրաքանչյուր արգումենտի նկարագրությունը Function Wizard պատուհանում: Դուք տեսնում եք այս պատուհանը, երբ սեղմում եք Fx կոճակը բանաձևերի տողում:

Եկեք տեսնենք, թե ինչպես կարելի է նման հուշում ավելացնել ձեր UDF-ներին: Նախորդ հոդվածում մենք դիտեցինք GetMaxBetween մաքսային գործառույթը: Այն գտնում է առավելագույն թիվը նշված տիրույթում և վերցնում է երեք արգումենտ՝ թվային արժեքների մի շարք և առավելագույն և նվազագույն արժեքներորոնել:

Այժմ մենք կավելացնենք այս հատուկ գործառույթի նկարագրությունը: Դա անելու համար ստեղծեք և գործարկեք Application.MacroOptions հրամանը: GetMaxBetween ֆունկցիայի համար կարող եք գործարկել հետևյալ հրամանը.

Sub RegisterUDF () Dim strFuncName As String «այն ֆունկցիայի անունը, որը ցանկանում եք գրանցել Dim strDescr As String» ֆունկցիայի նկարագրությունը ինքն իրեն Dim strArgs () Որպես տող «գործառույթի արգումենտների նկարագրություն» Գրանցվել GetMaxBetween ֆունկցիա ReDim strArgs (1-ից 3) «Արգումենտների թիվը ձեր ֆունկցիայի մեջ strFuncName = «GetMaxBetween» strDescr = «Առավելագույն թիվը նշված տիրույթում» strArgs (1) "Թվային արժեքների միջակայք" strArgs (2) = "Ստորին միջակայքի եզրագիծ" strArgs (3) = "Վերին միջակայքի եզրագիծ" Application.MacroOptions Մակրո՝ = strFuncName, _ Նկարագրություն՝ = strDescr, _ Փաստարկների նկարագրություններ՝ = strArgs, _ Կատեգորիա՝ = " My Custom Functions " End Sub

կամ

Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Նկարագրություն. = "Առավելագույն թիվը նշված տիրույթում" , _ Կատեգորիա. = "Իմ Հատուկ գործառույթներ" , _ Փաստարկների նկարագրություններ. der" , _ "Upper interval border" ) End Sub

Variable str FuncName ֆունկցիայի անվանումն է։ strDescr - ֆունկցիայի նկարագրություն: strArgs փոփոխականները պարունակում են հուշումներ յուրաքանչյուր արգումենտի համար:

Դուք կարող եք մտածել, թե որն է չորրորդ արգումենտը:Application.MacroOptions. Այս կամընտիր արգումենտը կոչվում է Կատեգորիա և ցույց է տալիս Excel ֆունկցիաների դասը, որում կտեղադրվի մեր հատուկ GetMaxBetween () ֆունկցիան: Դուք կարող եք այն անվանել գոյություն ունեցող կատեգորիաներից որևէ մեկի անունով. Math &: ; Trig, Statistical, Logical և այլն: Դուք կարող եք նշել անուն նոր կատեգորիայի համար, որտեղ կտեղադրեք ձեր ստեղծած գործառույթները: Եթե ​​դուք չեք օգտագործում «Կատեգորիա» արգումենտը, ապա հատուկ գործառույթն ավտոմատ կերպով կտեղադրվի «Օգտվողի կողմից սահմանված» կատեգորիայում:

Կպցրեք գործառույթի կոդը մոդուլի պատուհանում.

Այնուհետև կտտացրեք «Գործարկել» կոճակը: Հրահանգը կկատարի Fx կոճակը ձեր GetMaxBetween() ֆունկցիայի հետ օգտագործելու բոլոր կարգավորումները:

Եթե դուք փորձում եք ֆունկցիա ներդնել բջիջի մեջ՝ օգտագործելով Insert Function գործիքը, կտեսնեք, որ ձեր GetMaxBetween ֆունկցիան գտնվում է «Իմ հատուկ գործառույթները» կատեգորիայում.

Դուք կարող եք պարզապես սկսել մուտքագրել ֆունկցիայի անունը բջիջում, և դուք կտեսնեք ձեր հատուկ գործառույթը գործառույթների բացվող ցանկում, որոնցից պետք է ընտրեք:

Այնուհետև զանգահարեք Function Wizard-ին: Fx կոճակով:

Խորհուրդ. Կարող եք նաև օգտագործել CRTL + A ստեղնաշարի համակցությունը՝ Function Wizard-ը բացելու համար:

Function Wizard պատուհանում դուք կտեսնեք ձեր ֆունկցիայի նկարագրությունը, ինչպես նաև առաջին արգումենտի հուշում: Եթե ​​ձեր կուրսորը տեղադրեք վրաերկրորդ կամ երրորդ արգումենտը, դուք նույնպես կտեսնեք ակնարկներ նրանց համար:

Եթե ցանկանում եք փոխել այս հուշումների տեքստը, փոխեք strDescr և strArgs<արժեքները: 7> փոփոխականներ RegisterUDF () կոդի մեջ: Այնուհետև նորից գործարկեք RegisterUDF () հրամանը:

Եթե ցանկանում եք հետարկել կատարված բոլոր կարգավորումները և մաքրել գործառույթի նկարագրությունը, գործարկեք այս կոդը՝

Sub UnregisterUDF () Application.MacroOptions Մակրո՝ = «GetMaxBetween», _ Նկարագրություն՝ = Դատարկ, Փաստարկների նկարագրություններ՝ = Դատարկ, Կատեգորիա՝ = Դատարկ վերջ ենթահանձնաժողով

Կա ևս մեկ եղանակ՝ հուշում ստանալու համար, երբ մուտքագրում եք հատուկ գործառույթ: Մուտքագրեք ֆունկցիայի անունը և սեղմեք Ctrl + Shift + A :

=GetMaxBetween( + Ctrl + Shift + A

Դուք կտեսնեք ֆունկցիայի բոլոր արգումենտների ցանկը.

Ցավոք, այստեղ դուք չեք տեսնի ֆունկցիայի նկարագրությունը և դրա արգումենտները: Բայց եթե փաստարկների անունները բավականին տեղեկատվական են, ապա դրանք նույնպես կարող են օգտակար լինել: Այնուամենայնիվ, դա ավելի լավ է, քան ոչինչ :)

Մի փոքր ավելի շատ աշխատանք կպահանջվի UDF-ների համար ինտելիզենս ստեղծելու համար, որոնք աշխատում են ստանդարտ Excel գործառույթների նման: Ցավոք, Microsoft-ը ոչ մի տարբերակ չի տրամադրում: Միակ հասանելի լուծումը ներկայումս Excel-DNA IntelliSense ընդլայնումն է: Լրացուցիչ տեղեկություններ կարող եք գտնել մշակողի կայքում:

Հուսով ենք, որ այս ուղեցույցները կօգնեն ձեզ լուծել խնդիրները, երբ ձեր հատուկ գործառույթը չի աշխատում կամ չի գործում:աշխատիր այնպես, ինչպես կցանկանաս: Եթե, այնուամենայնիվ, ձեր UDF-ն դեռ չի աշխատում, խնդրում ենք ճշգրիտ նկարագրել ձեր խնդիրը Մեկնաբանություններ բաժնում: Մենք կփորձենք պարզել այն և գտնել լուծումը ձեզ համար ;)

Մայքլ Բրաունը նվիրված տեխնոլոգիայի էնտուզիաստ է, որը ձգտում է պարզեցնել բարդ գործընթացները՝ օգտագործելով ծրագրային գործիքները: Տեխնոլոգիական ոլորտում ավելի քան մեկ տասնամյակ փորձ ունենալով՝ նա կատարելագործել է իր հմտությունները Microsoft Excel-ում և Outlook-ում, ինչպես նաև Google Sheets-ում և Docs-ում: Մայքլի բլոգը նվիրված է իր գիտելիքներն ու փորձառությունը ուրիշների հետ կիսելուն՝ տրամադրելով հեշտ օգտագործվող խորհուրդներ և ձեռնարկներ՝ արտադրողականությունն ու արդյունավետությունը բարձրացնելու համար: Անկախ նրանից, թե դուք փորձառու մասնագետ եք, թե սկսնակ, Մայքլի բլոգը առաջարկում է արժեքավոր պատկերացումներ և գործնական խորհուրդներ՝ առավելագույն օգուտ քաղելու այս կարևոր ծրագրային գործիքներից: