جدول المحتويات
في هذه المقالة ، سنلقي نظرة على المشكلات التي قد تواجهها عند استخدام وظائف مخصصة في المصنفات الخاصة بك. سأحاول أن أوضح لك ما الذي يسببها وكيف يمكن حلها بسهولة.
هذا ما سنتحدث عنه:
تحدثنا سابقًا حول ما الوظيفة المخصصة هي كيفية إنشائها واستخدامها. إذا كنت تشعر أنك بحاجة إلى تحديث المعرفة الأساسية لـ UDFs مسبقًا ، فتوقف مؤقتًا وانظر في مقالتي السابقة.
لماذا لا يتم إعادة حساب Excel UDF؟
عند إجراء أي تغييرات في المصنف الخاص بك ، لن يقوم Excel بإعادة حساب كل صيغة لديك هناك. سيتم تحديث النتائج لتلك الصيغ المرتبطة بالخلايا التي تم تغييرها فقط.
ولكن هذا يتعلق بوظائف Excel القياسية. بالنسبة للخلايا المخصصة ، لا يستطيع Excel التحقق من صحة رمز VBA وتحديد الخلايا الأخرى التي يمكن أن تؤثر أيضًا على نتيجة الوظيفة المخصصة. لذلك ، قد لا تتغير الصيغة المخصصة عند إجراء تغييرات على المصنف.
لإصلاح المشكلة ، ستحتاج فقط إلى استخدام العبارة Application.Volatile . راجع الفصل التالي لمعرفة الإرشادات خطوة بخطوة حول كيفية تطبيقه.
الوظائف المخصصة المتطايرة مقابل الوظائف غير المتطايرة
افتراضيًا ، الوظائف المخصصة في Excel ليست متغيرة. هذا يعني أنه يتم إعادة حساب UDF فقط إذا تغيرت قيمة أي من الخلايا التي يشير إليها. ولكن إذا كان تنسيق الخلايا ، فإن اسم ملفورقة العمل ، اسم الملف يتغير ، ثم لن تحدث أي تغييرات في UDF.
دعنا ننتقل من الكلمات إلى الأمثلة. على سبيل المثال ، تحتاج إلى كتابة اسم المصنف الخاص بك في خلية. للقيام بذلك ، يمكنك إنشاء دالة مخصصة:
Function WorkbookName () باسم String WorkbookName = ThisWorkbook.Name End Function
تخيل الآن الحالة التالية. لقد كتبت صيغة مخصصة = WorkbookName () في الخلية وحصلت على اسم الملف هناك. بعد فترة ، قررت إعادة تسمية الملف وحفظه باسم مختلف. لكنك تنظر إلى القيمة في الخلية وترى أنها لم تتغير. لا يزال هناك اسم ملف قديم لم يعد صحيحًا.
نظرًا لعدم وجود وسائط في هذه الوظيفة ، لا تتم إعادة حساب الوظيفة (حتى إذا قمت بتغيير اسم المصنف ، فأغلقه ، ثم أعد فتحه it).
ملاحظة. لإعادة حساب جميع الوظائف في ملفك ، يمكنك استخدام الاختصار Ctrl + Alt + F9.
هل هناك طريقة أسهل؟ لإجراء إعادة حساب الصيغة في كل مرة تتغير فيها ورقة العمل ، تحتاج إلى سطر إضافي من التعليمات البرمجية. الصق الجزء التالي من التعليمات البرمجية في بداية الوظيفة: WorkbookName () باسم String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
الآن UDF الخاص بك متقلب ، وبالتالي سيتم إعادة حسابه تلقائيًا إذا كانت هناك أي خلية في ورقة العملتمت إعادة الحساب أو حدث أي تغيير في المصنف. بمجرد تغيير اسم الملف ، سترى هذا التحديث على الفور.
ملاحظة. يرجى أن تضع في اعتبارك أن الكثير من الوظائف المتقلبة يمكن أن تبطئ برنامج Excel الخاص بك. بعد كل شيء ، هناك العديد من الوظائف المخصصة التي تؤدي عمليات حسابية معقدة وتعمل على نطاقات بيانات كبيرة باستمرار.
لذلك ، أوصي باستخدام التقلب فقط عندما تكون هناك حاجة حقيقية إليه.
لماذا لا تتوفر الوظائف المخصصة
عندما تقوم بإدخال الأحرف الأولى من اسم الوظيفة المخصصة ، فإنها تظهر في القائمة المنسدلة بجوار خلية الإدخال ، تمامًا مثل وظائف Excel القياسية.
ومع ذلك ، هذا لا يحدث دائمًا. ما هي الأخطاء التي يمكن أن تسبب هذا الموقف؟
إذا كان لديك Excel 2003-2007 ، فلن يظهر UDF مطلقًا في القائمة المنسدلة. هناك يمكنك رؤية الوظائف القياسية فقط.
ولكن حتى إذا كنت تستخدم إصدارًا أحدث من Excel ، فهناك خطأ آخر قد ترتكبه عن طريق الخطأ.
كما ترى ، يجب أن تكون الوظيفة المخصصة في وحدة VBA قياسية تسمى الوحدات النمطية. عند إضافة وحدة نمطية جديدة لكتابة رمز الوظيفة ، يتم إنشاء مجلد وحدات تلقائيًا يتم فيه كتابة جميع الوحدات.
ولكن في بعض الأحيان يحدث أن الوحدة الجديدة ليست كذلك يتم إنشاؤه. في لقطة الشاشة التالية ، يمكنك أن ترى أن رمز الوظيفة المخصصة موجود في وحدة "كائنات Microsoft Excel" جنبًا إلى جنب معThisWorkbook.
النقطة هي أنه لا يمكنك وضع دالة مخصصة في منطقة التعليمات البرمجية لورقة العمل أو المصنف. في هذه الحالة ، لن تعمل الوظيفة. علاوة على ذلك ، لن يظهر في القائمة المنسدلة للوظائف. لذلك ، يجب أن يكون الرمز دائمًا في المجلد الوحدات النمطية .
لا يتم عرض نص تعليمات وظيفة مخصصة لـ Excel
قد تحدث مشكلة أخرى وهي التلميح الذي تراه عند اللصق وظيفة مخصصة. إذا كنت تستخدم دالة قياسية ، فسترى دائمًا تلميحًا للوظيفة وللوسيطات الخاصة بها. ولكن ماذا عن UDFs؟
إذا كان لديك الكثير من الوظائف المخصصة ، فسيكون من الصعب للغاية عليك تذكر العمليات الحسابية لكل منها. سيكون من الصعب تذكر الحجج التي يجب استخدامها. أعتقد أنه سيكون فكرة جيدة أن يكون لديك وصف لوظائفك المخصصة كتذكير.
لهذا ، أقترح استخدام طريقة Application.MacroOptions . سيساعدك على إظهار وصف ليس فقط للوظيفة ولكن أيضًا لكل من وسيطاتها في نافذة معالج الوظيفة. ترى هذه النافذة عند النقر فوق الزر Fx في شريط الصيغة.
دعونا نرى كيفية إضافة مثل هذا التلميح إلى UDFs الخاصة بك. في المقالة السابقة نظرنا إلى وظيفة GetMaxBetween المخصصة. يعثر على الحد الأقصى للرقم في النطاق المحدد ويأخذ ثلاث وسيطات: نطاق من القيم الرقمية ، والحد الأقصى والحد الأدنى للقيمةابحث عن.
الآن سنضيف وصفًا لهذه الوظيفة المخصصة. للقيام بذلك ، قم بإنشاء وتشغيل الأمر Application.MacroOptions . بالنسبة للوظيفة GetMaxBetween ، يمكنك تشغيل الأمر التالي:
Sub RegisterUDF () Dim strFuncName As String 'اسم الوظيفة التي تريد تسجيل وصف Dim strDescr As String' للوظيفة نفسها Dim strArgs () بصفتها وصف String 'لوسائط الدالة' Register GetMaxBetween function ReDim strArgs (1 To 3) 'عدد الوسائط في وظيفتك strFuncName = "GetMaxBetween" strDescr = "أقصى رقم في النطاق المحدد" strArgs (1) = "نطاق القيم الرقمية" strArgs (2) = "حد الفاصل الزمني السفلي" strArgs (3) = "حد الفاصل الزمني العلوي" Application.MacroOptions ماكرو: = strFuncName ، _ الوصف: = strDescr ، _ ArgumentDescriptions: = strArgs ، _ الفئة: = "دالاتي المخصصة" End Sub
أو
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" ، _ الوصف: = "الحد الأقصى للرقم في النطاق المحدد" ، _ الفئة: = " الوظائف المخصصة "، _ ArgumentDescriptions: = Array (_" Range of numeric value "، _" Lower الفاصل الزمني bor der "، _" حد الفاصل الزمني العلوي ") End Subالمتغير str FuncName هو اسم الوظيفة. strDescr - وصف الوظيفة. تحتوي متغيرات strArgs على تلميحات لكل وسيطة.
قد تتساءل ما هي الوسيطة الرابعة لApplication.MacroOptions. تسمى هذه الوسيطة الاختيارية الفئة وتشير إلى فئة وظائف Excel التي سيتم وضع وظيفة GetMaxBetween () المخصصة لدينا فيها. يمكنك تسميتها بعد أي من الفئات الموجودة: الرياضيات وأمبير ؛ Trig ، الإحصائي ، المنطقي ، إلخ. يمكنك تحديد اسم للفئة الجديدة التي ستضع فيها الوظائف التي تنشئها. إذا لم تستخدم وسيطة الفئة ، فسيتم وضع الوظيفة المخصصة تلقائيًا في فئة "معرف المستخدم".
الصق رمز الوظيفة في نافذة الوحدة النمطية:
ثم انقر فوق الزر "تشغيل". سيقوم الأمر بتنفيذ جميع الإعدادات لاستخدام الزر Fx مع الوظيفة GetMaxBetween () .
إذا حاولت إدراج وظيفة في خلية باستخدام إدراج وظيفة أداة ، سترى أن هناك وظيفة GetMaxBetween موجودة في فئة "وظائفي المخصصة":
أنت يمكنك ببساطة البدء في كتابة اسم الوظيفة في الخلية وسترى وظيفتك المخصصة في القائمة المنسدلة للوظائف للاختيار من بينها.
ثم اتصل بـ معالج الوظائف بالزر Fx.
نصيحة. يمكنك أيضًا استخدام مجموعة المفاتيح CRTL + A لفتح معالج الوظائف.
في نافذة معالج الوظائف سترى وصفًا لوظيفتك ، بالإضافة إلى تلميح للوسيطة الأولى. إذا قمت بوضع المؤشر فوق ملفالوسيطة الثانية أو الثالثة ، سترى أيضًا تلميحات لها.
إذا كنت تريد تغيير نص هذه التلميحات ، فقم بتغيير قيم strDescr و strArgs المتغيرات في كود RegisterUDF () . ثم قم بتشغيل الأمر RegisterUDF () مرة أخرى.
إذا كنت تريد التراجع عن جميع الإعدادات التي تم إجراؤها ومسح وصف الوظيفة ، فقم بتشغيل هذا الرمز:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" ، _ الوصف: = فارغ ، ArgumentDescriptions: = فارغ ، الفئة: = Empty End Sub
هناك طريقة أخرى للحصول على تلميح عند إدخال دالة مخصصة. أدخل اسم الوظيفة ثم اضغط على Ctrl + Shift + A:
=GetMaxBetween(
+ Ctrl + Shift + A
سترى قائمة بجميع وسائط الوظيفة:
لسوء الحظ ، هنا لن ترى وصف الوظيفة ووسيطاتها. ولكن إذا كانت أسماء الحجج مفيدة جدًا ، فقد تكون مفيدة أيضًا. ومع ذلك ، فهو أفضل من لا شيء :)
سوف يستغرق الأمر المزيد من العمل لإنشاء تحسس لـ UDFs التي تعمل مثل وظائف Excel القياسية. لسوء الحظ ، لا تقدم Microsoft أي خيارات. الحل الوحيد المتاح حاليًا هو امتداد Excel-DNA IntelliSense. يمكنك العثور على مزيد من المعلومات على موقع المطور.
نأمل أن تساعدك هذه الإرشادات في حل المشكلات عندما لا تعمل وظيفتك المخصصة أو لا تعملتعمل كما تريد. ومع ذلك ، إذا استمر فشل UDF الخاص بك في العمل ، فيرجى وصف مشكلتك بدقة في قسم التعليقات. سنحاول اكتشاف ذلك وإيجاد الحل المناسب لك ؛)