Excel UDF کار نمی کند: مشکلات و راه حل ها

  • این را به اشتراک بگذارید
Michael Brown

در این مقاله، مشکلاتی را که ممکن است هنگام استفاده از توابع سفارشی در کتاب‌های کاری خود با آن مواجه شوید، بررسی خواهیم کرد. من سعی خواهم کرد به شما نشان دهم که چه چیزی باعث آنها می شود و چگونه به راحتی می توان آنها را حل کرد. تابع سفارشی نحوه ایجاد و استفاده از آن است. اگر احساس می کنید که باید دانش اولیه UDF ها را از قبل به روز کنید، کمی مکث کنید و مقاله قبلی من را بررسی کنید.

چرا Excel UDF دوباره محاسبه نمی شود؟

هنگامی که تغییری در آن ایجاد می کنید کتاب کار شما، اکسل هر فرمولی را که در آنجا دارید دوباره محاسبه نمی کند. نتایج را برای فرمول هایی که فقط به سلول های تغییر یافته مرتبط هستند به روز می کند.

اما این مربوط به توابع استاندارد Excel است. در مورد موارد سفارشی، اکسل نمی تواند کد VBA را تأیید کند و سلول های دیگری را که می توانند بر نتیجه عملکرد سفارشی نیز تأثیر بگذارند، شناسایی کند. بنابراین، هنگام ایجاد تغییرات در کتاب کار، فرمول سفارشی شما ممکن است تغییر نکند.

برای رفع مشکل، فقط باید از عبارت Application.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 تابع پایان

اکنون UDF شما فرار است، بنابراین اگر سلولی در کاربرگ باشد به طور خودکار دوباره محاسبه می شودمجدداً محاسبه شده است یا تغییری در کتاب کار رخ داده است. به محض تغییر نام فایل، بلافاصله آن به روز رسانی را مشاهده خواهید کرد.

توجه داشته باشید. لطفاً به خاطر داشته باشید که بسیاری از توابع فرار می توانند سرعت اکسل شما را کاهش دهند. از این گذشته، توابع سفارشی زیادی وجود دارد که محاسبات پیچیده را انجام می دهند و به طور مداوم در محدوده داده های بزرگ کار می کنند.

بنابراین، توصیه می کنم از نوسانات فقط در جایی که واقعاً مورد نیاز است استفاده کنید.

چرا توابع سفارشی در دسترس نیستند

وقتی اولین حروف نام یک تابع سفارشی را وارد می کنید، ظاهر می شود. در لیست کشویی کنار سلول ورودی، درست مانند توابع استاندارد اکسل.

با این حال، همیشه این اتفاق نمی افتد. چه اشتباهاتی می تواند باعث این وضعیت شود؟

اگر Excel 2003-2007 دارید، UDF هرگز در لیست کشویی ظاهر نمی شود. در آنجا فقط می‌توانید توابع استاندارد را ببینید.

اما حتی اگر از نسخه جدیدتر اکسل استفاده می‌کنید، ممکن است اشتباه دیگری مرتکب شوید.

می‌بینید، تابع سفارشی باید در یک ماژول استاندارد VBA به نام Modules. هنگامی که یک ماژول جدید برای نوشتن کد تابع اضافه می کنید، یک پوشه Modules به طور خودکار ایجاد می شود که همه ماژول ها در آن نوشته می شوند.

اما گاهی اوقات اتفاق می افتد که یک ماژول جدید نیست. ایجاد شدن در اسکرین شات بعدی می بینید که کد تابع سفارشی در ماژول "Microsoft Excel Objects" به همراهThisWorkbook.

نکته این است که شما نمی توانید یک تابع سفارشی را در ناحیه کد یک کاربرگ یا کتاب کار قرار دهید. در این حالت، عملکرد کار نخواهد کرد. علاوه بر این، در لیست کشویی توابع ظاهر نمی شود. بنابراین، کد باید همیشه در پوشه Modules باشد.

متن راهنمای تابع سفارشی اکسل نمایش داده نمی‌شود

مشکل دیگری ممکن است این نکته باشد که هنگام چسباندن می‌بینید. یک تابع سفارشی اگر از یک تابع استاندارد استفاده می کنید، همیشه یک راهنمای ابزار برای تابع و آرگومان های آن خواهید دید. اما در مورد 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 Macro: = strFuncName, _ توضیحات: = strDescr, _ ArgumentDescriptions: = strArgs, _ دسته: = " توابع سفارشی من " End Sub

یا

Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ توضیحات: = "حداکثر تعداد در محدوده مشخص شده" , _ دسته: = "My توابع سفارشی" , _ ArgumentDescriptions: = آرایه (_ "محدوده مقادیر عددی" , _ "مقدار بازه پایین تر der" , _ "Upper interval border" ) End Sub

Variable str FuncName نام تابع است. strDescr - توضیحات تابع. متغیرهای strArgs حاوی نکاتی برای هر آرگومان هستند.

ممکن است تعجب کنید که آرگومان چهارم برای چیست؟Application.MacroOptions. این آرگومان اختیاری Category نام دارد و کلاس توابع اکسل را نشان می دهد که تابع سفارشی GetMaxBetween () ما در آن قرار می گیرد. می توانید آن را بر اساس هر یک از دسته های موجود نام گذاری کنید: Math & ; Trig، Statistical، Logical و غیره می توانید نامی برای دسته بندی جدید تعیین کنید که توابعی را که ایجاد می کنید در آن قرار دهید. اگر از آرگومان Category استفاده نکنید، تابع سفارشی به طور خودکار در دسته "User Defined" قرار می گیرد.

کد تابع را در پنجره ماژول جایگذاری کنید:

سپس بر روی دکمه "Run" کلیک کنید. این دستور تمام تنظیمات را برای استفاده از دکمه Fx با تابع GetMaxBetween() شما انجام می دهد.

اگر می خواهید یک تابع را با استفاده از <در یک سلول وارد کنید. 6>ابزار Insert Function ، خواهید دید که تابع GetMaxBetween شما در دسته "توابع سفارشی من" قرار دارد:

شما می توانید به سادگی شروع به تایپ نام تابع در سلول کنید و تابع سفارشی خود را در لیست کشویی توابع برای انتخاب مشاهده خواهید کرد.

سپس Function Wizard را فراخوانی کنید. با دکمه Fx.

نکته. همچنین می توانید از کلیدهای ترکیبی CRTL + A برای باز کردن Function Wizard استفاده کنید.

در پنجره Function Wizard شرحی از عملکرد خود و همچنین راهنمایی برای اولین آرگومان را خواهید دید. اگر مکان نما را روی آن قرار دهیدآرگومان دوم یا سوم، نکاتی را نیز برای آنها خواهید دید.

اگر می خواهید متن این نکات را تغییر دهید، مقادیر strDescr و strArgs<را تغییر دهید. 7> متغیرها در کد RegisterUDF () . سپس دوباره دستور RegisterUDF () را اجرا کنید.

اگر می خواهید تمام تنظیمات انجام شده را لغو کنید و توضیحات عملکرد را پاک کنید، این کد را اجرا کنید:

Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ توضیحات: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

یک راه دیگر برای دریافت راهنمایی هنگام وارد کردن یک تابع سفارشی وجود دارد. نام تابع را وارد کنید و سپس Ctrl + Shift + A را فشار دهید :

=GetMaxBetween( + Ctrl + Shift + A

لیستی از همه آرگومان های تابع را مشاهده خواهید کرد:

متأسفانه، در اینجا شرح تابع و آرگومان های آن را نخواهید دید. اما اگر نام استدلال‌ها بسیار آموزنده باشد، ممکن است مفید باشد. با این حال، بهتر از هیچ است :)

ایجاد intellisense برای UDFهایی که مانند توابع استاندارد اکسل کار می کنند، کمی بیشتر کار می کند. متأسفانه مایکروسافت هیچ گزینه ای ارائه نمی دهد. تنها راه حل موجود در حال حاضر یک پسوند Excel-DNA IntelliSense است. می‌توانید اطلاعات بیشتری را در وب‌سایت توسعه‌دهنده بیابید.

امیدواریم این دستورالعمل‌ها به شما در حل مشکلات در زمانی که عملکرد سفارشی شما کار نمی‌کند یا کار نمی‌کند کمک کند.همانطور که دوست دارید کار کنید با این حال، اگر UDF شما هنوز کار نمی کند، لطفاً مشکل خود را به طور دقیق در بخش نظرات توضیح دهید. ما سعی می کنیم آن را کشف کنیم و راه حلی برای شما پیدا کنیم ;)

مایکل براون یک علاقه‌مند به فناوری است که علاقه زیادی به ساده‌سازی فرآیندهای پیچیده با استفاده از ابزارهای نرم‌افزاری دارد. او با بیش از یک دهه تجربه در صنعت فناوری، مهارت های خود را در Microsoft Excel و Outlook و همچنین Google Sheets و Docs تقویت کرده است. وبلاگ مایکل اختصاص داده شده است تا دانش و تخصص خود را با دیگران به اشتراک بگذارد و نکات و آموزش هایی را برای بهبود بهره وری و کارایی ارائه دهد. چه یک حرفه ای با تجربه باشید و چه مبتدی، وبلاگ مایکل، بینش های ارزشمند و توصیه های عملی را برای استفاده حداکثری از این ابزارهای نرم افزاری ضروری ارائه می دهد.