Excel UDF មិនដំណើរការ៖ បញ្ហានិងដំណោះស្រាយ

  • ចែករំលែកនេះ។
Michael Brown

នៅក្នុងអត្ថបទនេះ យើងនឹងពិនិត្យមើលបញ្ហាដែលអ្នកអាចប្រឈមនៅពេលប្រើមុខងារផ្ទាល់ខ្លួននៅក្នុងសៀវភៅការងាររបស់អ្នក។ ខ្ញុំនឹងព្យាយាមបង្ហាញអ្នកពីអ្វីដែលបណ្តាលឱ្យពួកគេ និងរបៀបដែលពួកគេអាចដោះស្រាយបានយ៉ាងងាយស្រួល។

នេះគឺជាអ្វីដែលយើងនឹងនិយាយអំពី៖

    មុននេះ យើងបាននិយាយអំពីអ្វីដែលជា មុខងារផ្ទាល់ខ្លួនគឺ របៀបបង្កើត និងប្រើប្រាស់វា។ ប្រសិនបើអ្នកមានអារម្មណ៍ថាអ្នកចាំបាច់ត្រូវធ្វើឱ្យចំណេះដឹងជាមូលដ្ឋាននៃ UDFs ឡើងវិញជាមុន សូមផ្អាកមួយរយៈ ហើយមើលអត្ថបទមុនរបស់ខ្ញុំ។

    ហេតុអ្វីបានជា Excel UDF មិនគណនាឡើងវិញ?

    នៅពេលអ្នកធ្វើការផ្លាស់ប្តូរណាមួយនៅក្នុង សៀវភៅការងាររបស់អ្នក Excel នឹងមិនគណនាឡើងវិញនូវរូបមន្តនីមួយៗដែលអ្នកមាននៅទីនោះទេ។ វានឹងធ្វើបច្ចុប្បន្នភាពលទ្ធផលសម្រាប់រូបមន្តទាំងនោះដែលត្រូវបានភ្ជាប់ទៅក្រឡាដែលបានផ្លាស់ប្តូរតែប៉ុណ្ណោះ។

    ប៉ុន្តែនេះទាក់ទងនឹងមុខងារ Excel ស្តង់ដារ។ សម្រាប់កម្មវិធីផ្ទាល់ខ្លួន Excel មិនអាចផ្ទៀងផ្ទាត់លេខកូដ VBA និងកំណត់អត្តសញ្ញាណក្រឡាផ្សេងទៀតដែលអាចប៉ះពាល់ដល់លទ្ធផលនៃមុខងារផ្ទាល់ខ្លួនផងដែរ។ ដូច្នេះ រូបមន្តផ្ទាល់ខ្លួនរបស់អ្នកប្រហែលជាមិនផ្លាស់ប្តូរទេ នៅពេលអ្នកធ្វើការផ្លាស់ប្តូរលើសៀវភៅការងារ។

    ដើម្បីដោះស្រាយបញ្ហា អ្នកគ្រាន់តែត្រូវប្រើសេចក្តីថ្លែងការណ៍ Application.Volatile ប៉ុណ្ណោះ។ សូមពិនិត្យមើលជំពូកបន្ទាប់ ដើម្បីស្វែងយល់ពីការណែនាំជាជំហាន ៗ អំពីរបៀបអនុវត្តវា។

    មុខងារផ្ទាល់ខ្លួនមិនប្រែប្រួល

    តាមលំនាំដើម មុខងារផ្ទាល់ខ្លួននៅក្នុង Excel មិនប្រែប្រួលទេ។ នេះមានន័យថា UDF ត្រូវបានគណនាឡើងវិញលុះត្រាតែតម្លៃនៃក្រឡាណាមួយដែលវាសំដៅលើការផ្លាស់ប្តូរ។ ប៉ុន្តែ​ប្រសិន​បើ​ទ្រង់ទ្រាយ​នៃ​ក្រឡា នោះ​ឈ្មោះ​នៃសន្លឹកកិច្ចការ ឈ្មោះនៃការផ្លាស់ប្តូរឯកសារ បន្ទាប់មកនឹងមិនមានការផ្លាស់ប្តូរណាមួយកើតឡើងនៅក្នុង UDF ទេ។

    តោះប្តូរពីពាក្យទៅជាឧទាហរណ៍។ ជាឧទាហរណ៍ អ្នកត្រូវសរសេរឈ្មោះសៀវភៅការងាររបស់អ្នកនៅក្នុងក្រឡាមួយ។ ដើម្បីធ្វើដូច្នេះ អ្នកបង្កើតមុខងារផ្ទាល់ខ្លួន៖

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

    ឥឡូវស្រមៃមើលករណីខាងក្រោម។ អ្នកបានសរសេររូបមន្តផ្ទាល់ខ្លួន =WorkbookName() ទៅក្នុងក្រឡា ហើយទទួលបានឈ្មោះឯកសារនៅទីនោះ។ មួយសន្ទុះក្រោយមក អ្នកសម្រេចចិត្តប្តូរឈ្មោះឯកសារ ហើយរក្សាទុកវាដោយឈ្មោះផ្សេង។ ប៉ុន្តែ​អ្នក​មើល​ទៅ​តម្លៃ​នៅ​ក្នុង​ក្រឡា ហើយ​ឃើញ​ថា​វា​មិន​បាន​ផ្លាស់​ប្តូរ​ទេ។ វានៅតែមានឈ្មោះឯកសារចាស់ដែលលែងត្រូវហើយ។

    ដោយសារមិនមានអាគុយម៉ង់នៅក្នុងមុខងារនេះ មុខងារនេះមិនត្រូវបានគណនាឡើងវិញទេ (ទោះបីជាអ្នកប្តូរឈ្មោះសៀវភៅការងារ បិទវា ហើយបើកម្តងទៀត it).

    ចំណាំ។ ដើម្បីគណនាឡើងវិញនូវមុខងារទាំងអស់នៅក្នុងឯកសាររបស់អ្នក អ្នកអាចប្រើផ្លូវកាត់ Ctrl + Alt + F9 ។

    តើមានវិធីងាយស្រួលជាងនេះទេ? ដើម្បីធ្វើឱ្យរូបមន្តគណនាឡើងវិញរាល់ពេលដែលសន្លឹកកិច្ចការផ្លាស់ប្តូរ អ្នកត្រូវការបន្ទាត់កូដបន្ថែម។ បិទភ្ជាប់បំណែកនៃកូដខាងក្រោមនៅដើមមុខងាររបស់អ្នក៖

    Application.Volatile

    ដូច្នេះ កូដរបស់អ្នកនឹងមើលទៅដូចនេះ៖

    មុខងារ WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    ឥឡូវនេះ UDF របស់អ្នកមានភាពប្រែប្រួល ដូច្នេះវានឹងត្រូវបានគណនាឡើងវិញដោយស្វ័យប្រវត្តិ ប្រសិនបើក្រឡាណាមួយនៅក្នុងសន្លឹកកិច្ចការត្រូវបានគណនាឡើងវិញ ឬការផ្លាស់ប្តូរណាមួយបានកើតឡើងនៅក្នុងសៀវភៅការងារ។ ដរាបណាអ្នកប្តូរឈ្មោះឯកសារ អ្នកនឹងឃើញការអាប់ដេតនោះភ្លាមៗ។

    ចំណាំ។ សូមចងចាំថាមុខងារដែលងាយនឹងបង្កជាហេតុច្រើនពេកអាចធ្វើឱ្យ Excel របស់អ្នកថយចុះ។ យ៉ាងណាមិញ មានមុខងារផ្ទាល់ខ្លួនច្រើនពេក ដែលធ្វើការគណនាស្មុគស្មាញ និងដំណើរការលើជួរទិន្នន័យធំជាបន្តបន្ទាប់។

    ហេតុដូច្នេះហើយ ខ្ញុំសូមណែនាំឱ្យប្រើភាពប្រែប្រួលតែនៅកន្លែងដែលវាពិតជាត្រូវការ។

    ហេតុអ្វីបានជាមុខងារផ្ទាល់ខ្លួនមិនអាចប្រើបាន

    នៅពេលអ្នកបញ្ចូលអក្សរដំបូងនៃឈ្មោះនៃមុខងារផ្ទាល់ខ្លួន វាលេចឡើង នៅក្នុងបញ្ជីទម្លាក់ចុះនៅជាប់នឹងក្រឡាបញ្ចូល ដូចជាមុខងារ 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 'description of function arguments' Register GetMaxBetween function ReDim strArgs (1 To 3) 'ចំនួនអាគុយម៉ង់ក្នុងមុខងាររបស់អ្នក strFuncName = "GetMaxBetween" strDescr = "ចំនួនអតិបរមាក្នុងជួរដែលបានបញ្ជាក់" strgs (Args) "ជួរនៃតម្លៃលេខ" strArgs (2) = "ព្រំដែនចន្លោះពេលទាប" strArgs (3) = "ព្រំដែនចន្លោះពេលខាងលើ" Application.MacroOptions ម៉ាក្រូ: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ ប្រភេទ: = " មុខងារផ្ទាល់ខ្លួនរបស់ខ្ញុំ " End Sub

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween", _ Description: = "ចំនួនអតិបរមានៅក្នុងជួរដែលបានបញ្ជាក់", _ ប្រភេទ: = "របស់ខ្ញុំ មុខងារផ្ទាល់ខ្លួន", _ ArgumentDescriptions: = អារេ (_ "ជួរនៃតម្លៃលេខ", _ "ចន្លោះពេលទាប der", _ "ព្រំដែនចន្លោះពេលខាងលើ") ចុងរង

    អថេរ str FuncName គឺជាឈ្មោះនៃអនុគមន៍។ strDescr - ការពិពណ៌នាមុខងារ។ អថេរ strArgs មានព័ត៌មានជំនួយសម្រាប់អាគុយម៉ង់នីមួយៗ។

    អ្នកអាចឆ្ងល់ថាតើអ្វីជាអាគុយម៉ង់ទីបួនចំពោះApplication.MacroOptions។ អាគុយម៉ង់ស្រេចចិត្តនេះត្រូវបានដាក់ឈ្មោះថា Category ហើយចង្អុលបង្ហាញថ្នាក់នៃមុខងារ Excel ដែលមុខងារ GetMaxBetween () ផ្ទាល់ខ្លួនរបស់យើងនឹងត្រូវបានដាក់បញ្ចូល។ អ្នកអាចដាក់ឈ្មោះវាតាមប្រភេទដែលមានស្រាប់ណាមួយ៖ Math & ; ទ្រីក ស្ថិតិ ឡូជីខល។ល។ អ្នកអាចបញ្ជាក់ឈ្មោះសម្រាប់ប្រភេទថ្មីដែលអ្នកនឹងដាក់មុខងារដែលអ្នកបង្កើត។ ប្រសិនបើអ្នកមិនប្រើអាគុយម៉ង់ប្រភេទទេ នោះមុខងារផ្ទាល់ខ្លួននឹងត្រូវបានដាក់ដោយស្វ័យប្រវត្តិនៅក្នុងប្រភេទ "អ្នកកំណត់ដោយអ្នកប្រើប្រាស់"។

    បិទភ្ជាប់កូដមុខងារទៅក្នុងបង្អួចម៉ូឌុល៖

    បន្ទាប់មកចុចលើប៊ូតុង "រត់" ។ ពាក្យបញ្ជានឹងដំណើរការការកំណត់ទាំងអស់សម្រាប់ការប្រើប្រាស់ប៊ូតុង Fx ជាមួយនឹងមុខងារ GetMaxBetween() របស់អ្នក។

    ប្រសិនបើអ្នកព្យាយាមបញ្ចូលមុខងារទៅក្នុងក្រឡាដោយប្រើ ឧបករណ៍បញ្ចូលមុខងារ អ្នកនឹងឃើញថាមានមុខងារ GetMaxBetween របស់អ្នកស្ថិតនៅក្នុងប្រភេទ "មុខងារផ្ទាល់ខ្លួនរបស់ខ្ញុំ"៖

    អ្នក អ្នកអាចចាប់ផ្តើមវាយឈ្មោះមុខងារទៅក្នុងក្រឡា ហើយអ្នកនឹងឃើញមុខងារផ្ទាល់ខ្លួនរបស់អ្នកនៅក្នុងបញ្ជីទម្លាក់ចុះនៃមុខងារដែលត្រូវជ្រើសរើសពី។

    បន្ទាប់មកហៅទៅ អ្នកជំនួយការមុខងារ ដោយប្រើប៊ូតុង Fx។

    គន្លឹះ។ អ្នកក៏អាចប្រើបន្សំគ្រាប់ចុច CRTL + A ដើម្បីបើកមុខងារអ្នកជំនួយការ។

    នៅក្នុងបង្អួច អ្នកជំនួយការមុខងារ អ្នកនឹងឃើញការពិពណ៌នាអំពីមុខងាររបស់អ្នក ក៏ដូចជាព័ត៌មានជំនួយសម្រាប់អាគុយម៉ង់ដំបូង។ ប្រសិនបើអ្នកដាក់ទស្សន៍ទ្រនិចរបស់អ្នកលើអាគុយម៉ង់ទីពីរ ឬទីបី អ្នកក៏នឹងឃើញព័ត៌មានជំនួយសម្រាប់ពួកវាផងដែរ។

    ប្រសិនបើអ្នកចង់ផ្លាស់ប្តូរអត្ថបទនៃការណែនាំទាំងនេះ ផ្លាស់ប្តូរតម្លៃនៃ 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

    អ្នកនឹងឃើញបញ្ជីនៃអាគុយម៉ង់របស់មុខងារទាំងអស់៖

    ជាអកុសល នៅទីនេះអ្នកនឹងមិនឃើញការពិពណ៌នាអំពីមុខងារ និងអាគុយម៉ង់របស់វាទេ។ ប៉ុន្តែប្រសិនបើឈ្មោះនៃអំណះអំណាងមានព័ត៌មានគ្រប់គ្រាន់ ដូច្នេះពួកគេអាចមានប្រយោជន៍ផងដែរ។ នៅតែវាប្រសើរជាងគ្មានអ្វីសោះ :)

    វានឹងត្រូវការការងារបន្តិចទៀតដើម្បីបង្កើតភាពវៃឆ្លាតសម្រាប់ UDFs ដែលដំណើរការដូចមុខងារ Excel ស្តង់ដារ។ ជាអកុសល Microsoft មិនផ្តល់ជម្រើសណាមួយទេ។ ដំណោះស្រាយតែមួយគត់ដែលមាននាពេលបច្ចុប្បន្នគឺផ្នែកបន្ថែម Excel-DNA IntelliSense ។ អ្នកអាចស្វែងរកព័ត៌មានបន្ថែមនៅលើគេហទំព័ររបស់អ្នកអភិវឌ្ឍន៍។

    សង្ឃឹមថា គោលការណ៍ណែនាំទាំងនេះនឹងជួយអ្នកដោះស្រាយបញ្ហា នៅពេលដែលមុខងារផ្ទាល់ខ្លួនរបស់អ្នកមិនដំណើរការ ឬមិនដំណើរការ។ធ្វើការដូចដែលអ្នកចង់បាន។ បើទោះជាយ៉ាងណា UDF របស់អ្នកនៅតែមិនដំណើរការ សូមពណ៌នាអំពីបញ្ហារបស់អ្នកឱ្យបានត្រឹមត្រូវនៅក្នុងផ្នែក មតិយោបល់។ យើងនឹងព្យាយាមដោះស្រាយវា ហើយស្វែងរកដំណោះស្រាយសម្រាប់អ្នក ;)

    ម៉ៃឃើល ប្រោន ជា​អ្នក​ចូល​ចិត្ត​ផ្នែក​បច្ចេកវិទ្យា​ដែល​មាន​ចំណង់​ចំណូល​ចិត្ត​ក្នុង​ការ​សម្រួល​ដំណើរការ​ស្មុគស្មាញ​ដោយ​ប្រើ​ឧបករណ៍​កម្មវិធី។ ជាមួយនឹងបទពិសោធន៍ជាងមួយទស្សវត្សនៅក្នុងឧស្សាហកម្មបច្ចេកវិទ្យា គាត់បានពង្រឹងជំនាញរបស់គាត់នៅក្នុង Microsoft Excel និង Outlook ក៏ដូចជា Google Sheets និង Docs ។ ប្លក់របស់ម៉ៃឃើលគឺឧទ្ទិសដល់ការចែករំលែកចំណេះដឹង និងជំនាញរបស់គាត់ជាមួយអ្នកដទៃ ដោយផ្តល់នូវគន្លឹះ និងមេរៀនដែលងាយស្រួលធ្វើតាមសម្រាប់ការកែលម្អផលិតភាព និងប្រសិទ្ធភាព។ មិនថាអ្នកជាអ្នកជំនាញ ឬអ្នកចាប់ផ្តើមដំបូងទេ ប្លក់របស់ Michael ផ្តល់នូវការយល់ដឹងដ៏មានតម្លៃ និងដំបូន្មានជាក់ស្តែងសម្រាប់ការទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពីឧបករណ៍កម្មវិធីសំខាន់ៗទាំងនេះ។