
در آموزش آشنایی با متغیر ها و ثابت ها در مورد انواع آنها صحبت کردیم و نحوه معرفی متغیر ها و ثابت ها رو گفتیم. امروز میخوایم در مورد علت های تعریف متغیر ها و ثابت ها و دامنه تعریف آنها صحبت کنیم. مسئله ای مهم و ظریف که یادگیری اون درک صحیحی از برنامه نویسی وی بی (VBA) به شما میده.
علت هایی که باید متغیرها رو تعریف کنیم
اکسل شما رو مجبور به تعریف متغیرها نمیکنه. به صورت پیشفرض همه متغیرهای اکسل از نوع Variant (برای آشنایی با این نوع از داده جدول موجود در بخش اول آموزش آشنایی با متغیرها مطالعه شود) هستند که امکان ذخیره سازی متن و عدد رو داره. بنابراین شما میتونید در هر قسمتی از برنامه بدون تعریف قبلی متغیر از متغیر جدید استفاده کنید که در اینصورت اکسل به صورت خودکار نوع این متغیر ها رو به صورت Variant تعریف میکنه. اینکه شما از متغیرهایی استفاده کنید که قبلا تعریف نشده اند روش خوبی برای برنامه نویسی نیست. در ادامه دلایل این مسئله رو میگیم:
سرعت انجام محاسبات و حافظه تخصصی به برنامه
همونطور که گفتیم در صورت تعریف نکردن متغیر در برنامه، اکسل به صورت پیشفرض نوع اون رو Variant در نظر میگیره. این نوع متغیر از سایر متغیرها حجم بیشتری رو اشغال میکنه.
شاید بگید چند بایت اضافه تر اونم با وجود سخت افزارهای بسیار قوی خیلی به چشم نمیاد اما استفاده از چند صد یا حتی چند هزار متغیر در برنامه معمول هست مخصوصا زمانیکه از آرایه ها در برنامه نویسی استفاده میکنید. به همین دلیل حافظه اضافی که به خاطر استفاده از متغیرهای Variant به جای متغیرهای Integer و Single اشغال میشه می تونه به طرز چشمگیری زیاد بشه.
از طرف دیگه متغیرهای از جنس Variant مدت زمانی بیشتری برای پردازش نسبت به اکثر متغیرها نیاز داره از این رو در برنامه هایی که تعداد متغیرهای غیرضروری از این جنس زیاده برنامه کندتری خواهید داشت.
جلوگیری از خطای تایپی (Typo Bugs)
اگه همیشه متغیرها رو تعریف میکنید راحت تر میتونید از گزینه VBA Option Explicit (در ادامه توضیح میدیم) که برای ایجاد الزام جهت تعریف متغیرها است، استفاده کنید. این کار باعث میشه خطاهای ناشی از تایپ اشتباه نام متغیر در برنامه از بین بره. این نکته رو با یک مثال توضیح میدم:
فرض کنید از یک متغیر با نام “SVat_Rate” استفاده میکنید. ممکنه زمانیکه میخواید یک مقدار به این متغیر تخصیص بدید کد زیر رو بنویسید (که خیلی احتمالش زیاده)
۱ |
SVatRate = ۰.۱۷۵ |
که مقدار ۰.۱۷۵ رو به متغیر اختصاص بده اما این کار انجام نشده! (یک بار دیگه به نام متغیری که اول گفتیم و متغیری که در کد استفاده کردیم دقت کنید). درحالیکه اگر از گزینه VBA Option Explicit استفاده کنید اکسل شما رو مجبور میکنه که هر متغیر جید رو اول تعریف کنید (به همین دلیل متغیرهایی که نام آنها اشتباها تایپ میشه به عنوان متغیر جدید شناسایی میشن و اکسل پیغام میده که باید تعریف بشه و شما متوجه خطا میشید). در این مثال اکسل پیغام میده که متغیر SVatRate قبلا تعریف نشده و باید آن را تعریف کنید.
اعلام مقادیر غیرقابل انتظار برای متغیر ها و ثابت ها
اگر شما جنس خاصی برای یک متغیر تغریف کنید و سعی کنید که داده ای با جنس دیگه بهش تخصیص بدید باعث میشه خطا ایجاد بشه و شما متوجه استفاده از داده اشتباه بشید. در صورتیکه اگر شما قبلا متغیر رو تعریف نکرده باشید و این کار رو انجام بدید، با دادن داده اشتباه به متغیر خروجی برنامه شما اشتباه خواهد بود.
به همین دلیل تعریف متغیرها باعث میشه که از دریافت داده با جنس صحیح مطمئن بشید و با انجام فرآیند صحیح خروجی صحیحی تولید کنید.
بنا به دلایل بالا همیشه توصیه میکنم که همیشه همه متغیرها رو در برنامه نویسی وی بی (VAB) قبل از استفاده تعریف کنید و از گزینه Option Explicit (در ادامه توضیح میدیم) استفاده کنید تا مطمئن بشید همه متغیرها تعریف شدند.
گزینه Option Explicit در تعریف متغیر ها و ثابت ها
با فعال سازی گزینه Option Explicit شما مجبور میشید که تمامی متغیرهایی رو که در کد وی بی (VBA) استفاده میکنید رو تعریف کنید. از طرفی با فعال بودن این گزینه، متغیرهایی که تعریف نشده اند رو قبل از اجرای برنامه با رنگ کردن آنها مشخص میکنه. برای استفاده از این مورد کافیه دستور زیر رو در بالای هر صفحه کد بنوییسد.
۱ |
Option Explicit |
از طرفی اگه میخواید که همیشه این کد بالای صفحات کدنویسی شما باشه میتونید از طریق مسیر زیر این کار رو انجام بدید تا به صورت خودکار این کد اضافه بشه:
- در صفحه ویرایشگر ویژوال بیسیک یا وی بی گزینه Tools> Options رو انتخاب کنید.
- از پنجره باز شده تپ Editor رو انتخاب کنید.
- تیک مربوط به گزینه Required Variable Declaration رو بزنید و OK کنید.
شکل ۱ – متغیر ها و ثابت ها – ایجاد الزام برای تعریف متغیرها در وی بی
وقتیکه این کار رو انجام دید از این به بعد این کد Option Explicit به صورت خودکار در بالای همه صفحات کد قرار داده میشه.
دامنه اعتبار متغیرها و ثابت ها
هر بار که یک متغیر و یا ثابت رو تعریف میکنید در یک محدوده مشخصی دارای اعتبار هستند و شناخته میشن و این دامنه به مکانی که متغیر رو تعریف میکنید بستگی داره.
به عنوان مثال فرض کنید از یک متغیر با نام “SVat_Rate” درون یک Function با نام “Total_Cost” استفاده میکنید. در جدول زیر در مورد دامنه اعتبار متغیر در دو حالت مختلف از تعریف متغیر صحبت کردیم:
۱ ۲ ۳ ۴ ۵ |
Option Explicit Dim SVAT_Rate As Single Function Total_Cost() As Double ... End Function |
اگر شما متغیر SVat_Rate رو در بالای ماژول تعریف کنید در اینصورت دامنه اعتبار متغیر به اندازه کل توابع و روال های ماژول هست. به عبارت دیگر متغیر SVat_Rate در تمام برنامه های این ماژول شناخته میشه. در واقع اگر شما یک مقدار رو به این متغیر در تابع Total_Cost تخصیص بدید این مقدار در سایر توابع موجود تو این ماژول باقی میمونه و پاک نمیشه. از طرفی اگر قصد داشته باشید از متغیر SVat_Rate رو در یک ماژول دیگه استفاده کنید به دلیل اینکه خارج از دامنه اعتبار متغیر هست، شناخته نمیشه.
۱ ۲ ۳ ۴ ۵ |
Option Explicit Function Total_Cost() As Double Dim SVAT_Rate As Single ... End Function |
اگر شما متغیر SVat_Rate رو در ابتدای تابع Total_Cost تعریف کنید، دامنه اعتبار این متغیر به اندازه همون تابع هست و خارج از تابع Total_Cost شناخته نمیشه. بنابراین اگر سعی کنید از متغیر SVat_Rate در هر تابع دیگه در هر جا استفاده کنید امکانش نیست.
در مثال بالا متغیری که در سطح ماژول تعریف شده با استفاده از دستور Dim تعریف شد و دامنه اعتبار اون حداکثر درون همون ماژول تعریف شد. حالا اگه بخوایم متغیرها رو طوری تعریف کنیم که در سایر ماژول ها هم در دسترس باشند میتونید از کلمه Public به جای Dim استفاده کنید.
برای متغیرهای در سطح یک ماژول میتونید از کلمه Private به جای Dim استفاده کنید نشاندهنده اینه که دامنه اعتبار متغیر محدود به همان ماژول هست.
نکته۲:
مطالبی که در مورد دامنه اعتبار متغیرها گفتیم در مورد ثابت ها هم صادق هست. به عبارت دیگه کلمات Public و Private در هنگام تعریف آنها استفاده میشه اما باید توجه کنید که این کلمات جایگزین کلمه Const نمیشن و در کنار اون قرار میگیرن.
تو مثال زیر نحوه استفاده این کلمات رو برای متغیر و ثابت میبینید:
۱ ۲ ۳ ۴ |
Option Explicit Public SVAT_Rate As Single Public Const IMax_Count = ۵۰۰۰ … |
این مثال نشون میده که چطوری از کلمه Public برای تعریف متغیر SVat_Rate و ثابت Imax_Count استفاده شده.
دامنه اعتبار این دو به اندازه کل پروژه تعریف شده هست.
بنابراین متغیر SVat_Rate و ثابت Imax_Rate در هر تابع و روالی که در این پروژه تعریف شده قابل دسترس هست.
۱ ۲ ۳ ۴ |
Option Explicit Private SVAT_Rate As Single Private Const IMax_Count = ۵۰۰۰ ... |
در این مثال نحوه استفاده از کلمه Private برای تعریف متغیر SVat_Rate و ثابت Imax_Count استفاده شده. دامنه اعتبار این دو در حد ماژولی هست که آنها در آن تعریف شده اند.
به عبارت دیگه SVat_Rate و Imax_Count تنها درون روال ها و توابع تعریف شده درون ماژول در دسترس هست.
تو این دو آموزش سعی کردم مباحث اولیه متغیر ها و ثابت ها رو باز کنیم آشنا بشیم. امیدوارم که استفاده لازم رو برده باشید.
با سلام چطور میشه مقدار یک تکس باکس رو بصورت global تعریف کرد که درصورت بسته شدن userform
بشه توی یک userfrom دیگه ازش استفاده کرد؟
ممنون
درود، وقت بخیر
متغیر را به صورت Public تعریف کنید.
با سلام یه سوال در مورد متغییر ها داشتم
می خواستم بدونم یه متغییر که تعریف کردیم بخواهیم قبل در اجرا در ماکروها یه عدد پیش فرض بهش بدیم تا درون ماکرو داشته باشه و بعد از تغییر در ماکروها و تغییر همین متغییر مبالغ جدید در متغییر اینجا کرد
سلام
برای این کار یک متغیر Public را در رویداد Workbook_Open تعریف کنید و مقدار دهی کنید (با این کار زمانیکه فایل باز میشه این متغیر تعریف میشه و مقدار اولیه رو تو خودش نگه میداره).
حالا میتونید درون کدهای ماکرو از این متغیر استفاده کنید.
بعد از پایان کدهای ماکرو، تغییرات روی این متغیر اعمال میشه و تا زمانیکه فایل باز هست قابل استفاده هست.
بسیار عالی واقعا فکر نمیکردم این مطلب در سایهای فارسی اومده باشه!
پس ما به کمک مطالب بالا میتونیم یک متغیرو در یک ماژول در SUB های مختلف استفاده کنیم؟! درس متوجه شدم
خوشحالیم که باعث خوشحالی شما شدیم
بله این مطلب درباره همین مورد هست.