یکی از امکانات جذاب در زبان برنامه نویسی VBA (ماکرونویسی در اکسل) امکان مدیریت و کار بر روی فایل هاست. اگرچه همواره می توان با تعریف متغیر و انتساب مقدار به متغیرهای تعریف شده در روال ها (Procedures) و زیر روالهای (Sub Procedures) برنامه، داده ها را از ابتدا تا انتهای یک ماژول یا یک تابعِ تعریف شده توسط کاربر پیش بُرد مع الوصف اتخاذ این روند جهت پیش برد کار، این مضرّت را داراست که با پایان یافتن برنامه، کلیه متغیرهای ایجاد شده نیز از حافظهء Stack حذف شده و اطلاعات موجود در آنها نیز همراه با خود متغیر از بین خواهد رفت. یکی از بهترین راهکارها جهت فائق آمدن بر این مشکل استفاده از قابلیتی تحت عنوان مدیریت فایل هاست. با استفاده از این قابلیت قادر خواهیم بود تا مدیریتی همه جانبه بر روی کلیه فایلهای Hard Disk خود اِعمال نموده و از انجام ساده ترین عملیات نظیر Copy نمودن یک یا چند فایل در محلی دلخواه از دیسک سخت گرفته تا ایجاد ساختارهای چند منظوره و نیز از کدینگ و نوشتن برنامه های مخرب نظیر ویروس های تکثیر شونده اتوماتیک که منجر به فلج نمودن  کامل مخاطب و کاربر نهایی توسط Format نمودن یک یا چند درایو دلخواه از هارد دیسک وی تا رفع مشکلات نرم افزاری دیگر نرم افزارهای موجود بر روی PC همه و همه را در قالب کار با فایل ها امکان پذیر دانست. در ادامه این بحث جهت آشنایی سروران محترم با این قابلیت و استفاده از یک کد ماکرنویسی شده در اکسل (VBA)، نحوه تعریف و استفاده از توانایی یاد شده توضیح داده خواهد شد.
به منظور قابل فهم ساختن موضوع برای عموم کاربران و امکان برقراری ارتباط با محتوای ارائه شده توسط عزیزانی که کمترین اطلاعات از برنامه نویسی را دارا نیستند، یکی از ساده ترین شیوه های بکارگیری از برنامه نویسی فایل را توضیح داده و بواسطه آن اقدام به مرتفع نمودن یکی از مشکلات شایع مهندسین آب در خصوص کار با نرم افزار WaterGEMS خواهیم نمود. در این نوشته به کاربرد ماکرونویسی در نرم افزار WaterGems خواهیم پرداخت. پس با ما تا آخر همراه باشید.

در نرم افزار WaterGEMS عنصری تحت عنوان کتابخانه مهندسی (Engineering Library) موجود است که اطلاعات قابل توجهی را در دل خود دارد. این افزونه بطور پیش فرض اطلاعات جامعی در خصوص انواع و اقسام پمپ های تجاری و صنعتی، انواع Pattern  و الگوی مصرف، انواع شیرهای کنترلی و … را برای کاربر فراهم می سازد. علاوه بر اطلاعات پیش فرضِ موجود در نرم افزار، برای کاربرِ واترجمز این امکان موجود است که دیگر اطلاعات لازم را به محیط این کتابخانه اضافه نماید. به عنوان مثال کاربر ایرانی قادر است تمام پمپ های شرکت های ایرانی تولید کننده پمپ را به کتابخانه مهندسی نرم افزار بیفزاید.

کاربرد ماکرونویسی در نرم افزار WaterGems

جهت اضافه نمودن یک عارضه Physical مانند Material در لوله ها اگرچه جنس های مختلفی از انواع لوله ها با ضرایب متعدد در کتابخانه مهندسی تعریف شده است، با این حال گاه لازم خواهد بود تا کاربر بسته به نیاز خود اقدام به تعریف متریال جدید همچون پلی اتیلن (PE 100) یا انواعی دیگر نماید. در این مرحله از کار چنانچه در کتابخانه مهندسی نرم افزار قصد اضافه نمودن لوله یاد شده را داشته باشیم، بدین صورت عمل خواهیم نمود که با فراخوانی فرم مربوط به کتابخانه مهندسی نرم افزار، بر روی گزینه  Material Libraries کلیک کرده و در نمودار درختی موجود، زیر مجموعهء Material Library را در حالت انتخاب قرار داده و بر روی گزینه Add Item کلیک می کنیم:

کاربرد ماکرونویسی در نرم افزار WaterGems

نکته ای که دستمایهء نگارش این سیاهه گردید مشکلی است که در این مرحله از کار برای تنی چند از کاربران بروز می نماید؛ بدین صورت که گزینه Add Item در برخی سیستم ها غیر فعال بوده و امکان اضافه شدن Material جدید را به کاربر نمیدهد. یکی از راه های حل مشکل بدین صورت است که به محل نصب کتابخانه مهندسی نرم افزار رفته و پوشه مربوطه را باز کنیم. آدرس این پوشه را می توان در همین فرم نیز پیدا کرد.

کاربرد ماکرونویسی در نرم افزار WaterGems

نکتهء مهم اینکه پوشه مذکور در زمره فایلهای Hidden و مخفی هارد دیسک بوده و برای فراخونی آن ابتدا باید امکان مشاهده تمام پوشه های مخفی هارد دیسک را فراهم نمود. در گام دیگر بدین شکل عمل می گردد که تمام محتویات موجود در پوشهء Libraries را در محلی دیگر از هارد دیسک و در پوشه دلخواه دیگر کپی نموده و پوشه اصلی را حذف (Delete) نماییم. پس از اینکه عملیات حذف پوشه اصلی به اتمام رسید، پوشهء کپی شده در مرحله پیشین را مجددا در همین آدرس و بجای پوشهء حذف شدهء اصلی قرار میدهیم. در مراجعهء مجدد به Engineering Library ملاحظه خواهید کرد که گزینه Add Item فعال گردیده و امکان اضافه شدن لوله های جدید و دیگر متریال دلخواه فراهم آمده است. روال توضیح داده شده جهت انجام این فرآیند و اشکال زدایی از برنامه بسیار ساده و قابل درک بوده و اصطلاحا چیزی بیش از یک Copy – Paste معمولی نیست. همین روال با استفاده از مجموعه کدهای VBA نیز به سادگی قابل انجام بوده و با توجه به سادگی روال انجام کار، درک عملیاتِ پیشِ رو بسیار سریع و راحت صورت خواهد یافت.

حتما بخوانید  مدل سازی طوفان و روندیابی جریان با مدل HEC-1 در نرم افزار WMS

اما کاربرد ماکرونویسی در نرم افزار WaterGems کجاست؟!

جهت استفاده از کدهای VBA و ماکرونویسی در اکسل پیش از هر کار دیگر باید زبانه مربوط به کدینگ این نرم افزار تحت عنوان Developer را فعال نمود. این Tab بطور پیش فرض غیر فعال بوده و کاربران در ورود به نرم افزار اکسل قادر به دیدن آن نیستند. جهت فعال سازی، ابتدا از منوی File گزینه Excel Option را انتخاب نموده و مطابق تصویر زیر، Tab مربوطه را فعال نمایید:

کاربرد ماکرونویسی در نرم افزار WaterGems

پس از طی مرحله یاد شده فوق، Tab مورد نظر فعال شده و گزینه Developer را در میان دیگر Tab های قابل استفاده خواهید دید. برای ورود به محیط برنامه نویسی بر روی اولین گزینه از سمت چپ این Tab که آیتمی است تحت عنوان Visual Basic کلیک نمایید:

کاربرد ماکرونویسی در نرم افزار WaterGems

با کلیک بر روی این افزونه، وارد محیط برنامه نویسی شده و قادر به ایجاد ماژول دلخواه جهت ایجاد برنامهء مورد نظر خود خواهیم بود. مراحل ساخت ماژول بدین صورت است که از منوی Insert بر روی گزینه Module کلیک می نماییم. با طی این روند، مکان نما در صفحه سفید رنگ جدیدی که مربوط به برنامه نویسی ماژولِ ایجاد شدهء فعلی است به صورت یک کِرسِرِ چشمک زن قرار خواهد گرفت. این محیط محلی است که کدهای VBA را درون آن می نویسیم. جهت شروع برنامه نویسی بدین صورت عمل خواهیم نمود که در اولین خط از برنامه ای که ایجاد خواهیم نمود ابتدا نامی برای برنامه خود اختیار خواهیم کرد. دقت شود که این نام هوشمندانه و با توجه به کارکرد کدها انتخاب گردد تا در آینده نیز قادر باشیم برنامه مورد نظر خود را در میان انبوه برنامه های نوشته شده به سهولت شناسایی نماییم. این روال به صورت زیر و با مجموعه دستوراتِ توصیف شده ذیل انجام خواهد یافت:

Sub نام برنامه

            مجموعه کدهای برنامه نویسی شده

          …

End Sub

کلمات لاتین نوشته شده در کدهای فوق جزء لاینفک برنامه بوده و بصورت پیش فرض با رنگی متمایز از رنگ کدهای نوشته شده توسط کاربر ایجاد می شوند و به برنامه اعلام می نمایند که قرار است یک زیرروال (Subroutine) تحت عنوانی خاص (نام برنامه) ایجاد گردد. در خط دوم تا آخرین خط از برنامه که قبل از کلمات کلیدی End Sub نوشته می شوند، بدنه برنامه قرار دارد. در ادامه به نگارش و توضیح خط به خط کدهای برنامه می پردازیم:

Sub CopyFiles()
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
If Not FSO.FolderExists(“C:\WaterseBentley”) Then
FSO.CreateFolder “C:\WaterseBentley”
Else
FSO.DeleteFolder “C:\WaterseBentley”, True
FSO.CreateFolder “C:\WaterseBentley”
End If
FSO.CopyFile “C:\ProgramData\Bentley\WaterGEMS\8\Libraries\*.*”, “C:\WaterseBentley”, True
FSO.DeleteFile “C:\ProgramData\Bentley\WaterGEMS\8\Libraries\*.*”, True
FSO.CopyFile “C:\WaterseBentley\*.*”, “C:\ProgramData\Bentley\WaterGEMS\8\Libraries”, True
FSO.DeleteFolder “C:\WaterseBentley”, True
MsgBox “مشکل با موفقیت مرتفع گردید”
End Sub

همانطور که توضیح داده شد، خط اول برنامه اعلام می نماید که یک زیرروال (Subroutine) با نام CopyFiles در این برنامه ایجاد خواهد شد. توجه شود که هرگز نمیتوان نام زیرروال را در دو پارت جدا از هم بصورت Copy Files نوشت و وجود فاصله بین کلمات تنها با استفاده از Underline ممکن است: Copy_Files.

دومین خط برنامه توسط کلمه کلیدی Dim، یک متغیر تعریف می کند. متغیرها در دسته های داده ای مختلف (Data Type) تعریف می شوند. این دسته های داده ای محدوده های مختلفی از اعداد و نیز انواع مختلف دیگر از داده نظیر انواع متنی، تاریخ، رنجهای دلخواه، اشیاء، فایل ها، فولدرها و … را پوشش می دهد. در این خط از کد اعلام شده است که یک متغیر به نام FSO از نوع داده ای Object تعریف گردد.

حتما بخوانید  تحلیل سری زمانی | توابع اکسل در محیط برنامه‌نویسی

برای استفاده از متدهایی همچون Copy، Move، Delete و … باید کلاسی تحت عنوان File System Object فعال شود. اینکار به صورتهای مختلف قابل انجام است. در سومین خط این برنامه یکی از روشهای فعال کردن این کلاس ذکر شده است. توجه فرمایید که Class ها همچون نقشه هایی عمل میکنند که اشیاء از روی آن نقشه ساخته می شوند. در نتیجه برای ایجاد هر عضو یا فراخوانی هر متد، باید کلاس مربوط به همان عضو یا متد فعال باشد و انتخاب کلاسِ نادرست امکان ایجاد برخی عملیات دلخواه را از برنامه نویس سلب می کند چنانچه نمیتوان با در دست داشتن نقشهء یک میز، یک صندلی ایجاد کرد.

خط چهارم از برنامهء فوق یک وجه شرطی را بررسی میکند. در واقع این کد بررسی می کند که آیا در درایو “\:C” پوشه ای با نام WaterseBentley وجود دارد یا خیر. در این خط از برنامه عبارتی به صورت  FSO.FolderExists نیز موجود است. جهت توضیح این قسمت از کدها باید توجه داشته باشیم که در سومین از خط برنامه و زمانی که کلاس File System Object را تعریف می کردیم، توسط کلمه کلیدی Set این کلاس را مساوی با یک شیء به نام FSO قرار دادیم. توجه شود که اشیاء کلاس تمام خصوصیات کلاس را دارا هستند. مثلا اگر یک کلاس امکان کپی نمودن فایلها و فولدرها را فراهم کند، هر یک از اشیاء موجود در این کلاس نیز قادر هستند عملیات کپی نمودن فایلها و فولدرها را انجام دهند. یکی از امکاناتی که کلاس File System Object فراهم می کند، بررسی این موضوع است که آیا در مکان دلخواه، پوشه یا فولدر خاصی وجود دارد یا نه. در نتیجه عبارت موجود در این خط از کد که به صورت FSO.FolderExists(“C:\WaterseBentley”) نوشته شده است بدین معناست که بررسی شود آیا آدرس موجود در پرانتز معتبر است یا خیر بدین معنی که آیا در درایو “\:C” پوشه ای به نام WaterseBentley وجود دارد؟ کلمه کلیدی Not موجود در این خط عنوان میکند که در صورتیکه در درایو “\:C” پوشهء یاد شده وجود نداشت آنگاه دستورات موجود در خط پنجم اجرا گردد. ترجمه تحت الفظی خط چهارم برنامه بدین شکل است: اگر در درایو “\:C” پوشه ای به نام WaterseBentley وجود نداشت، آنگاه:

خط پنجم برنامه ادامه قسمت قبل و جواب شرط است. این خط از کد اعلام میکند که باید در درایو “\:C” یک پوشه با نام WaterseBentley ساخته شود. در نتیجه مجموعه دستورات موجود در خط چهارم و پنجم برنامه اعلام میکنند که: اگر در درایو “\:C” پوشه ای به نام WaterseBentley وجود نداشت، در این آدرس پوشه ای با همین نام را ایجاد کن! توجه کنید که در خط پنجم برنامه از متد CreateFolder برای ایجاد یک پوشه استفاده شده است.

خط ششم نقیض خط چهارم است بدین معنی که اگر شرط موجود در جلوی عبارت If که در چهارمین خط ذکر گردید برقرار نبود در این صورت …   در کل ترجمه تحت الفظی خطوط چهار تا شش بدین صورت است که اگر در درایو “\:C” پوشه WaterseBentley موجود نبود این پوشه را ایجاد کن ولی (در غیر اینصورت) اگر این پوشه در درایو مذکور موجود بود … (کلیه عملیات و دستورات بعد از Else تا End If انجام شود)

خطوط هفت و هشت جواب Else است. بدین معنی که اگر در درایو یاد شده، پوشه WaterseBentley وجود داشت، ابتدا با استفاده از متد DeleteFolder این پوشه را حذف کن و همین پوشه با همین نام را در همین درایو مجددا بساز ! شاید این سوال پیش آید که در صورت وجود این پوشه چرا باید آنرا حذف نموده و دوباره ساخت؟ جواب این پرسش بدین صورت عنوان می شود که در ادامهء این برنامه، قرار است فایلهای خاصی درون این پوشه ذخیره شود. در صورتیکه این برنامه بدون خطوط شش، هفت و هشت نوشته شده باشد، در اولین اجرا بدون هیچگونه اشکال به کار خود ادامه خواهد داد ولی معمولا برنامه های نوشته شده را بیش از یکبار Run می نماییم و اگر خواسته باشیم مجددا این برنامه را اجرا کنیم این شرط مانع از بروز پیام خطا توسط برنامه می گردد. البته شاید بتوان بدون نوشتن کلیه عبارات موجود در خطوط شش، هفت و هشت نیز این برنامه را بدون خطا اجرا نمود ولی حضور این سه خط کد که شاید در ظاهر اضافه به نظر برسد تضمین می کند که برنامه هرگز کاربر را با پیام خطا متوقف نمی کند.

حتما بخوانید  مهندسی که ماکرونویسی در اکسل رو ندونه، مهندس نیست!

در خط نهم کل ساختار شرطی به پایان می رسد. همیشه در انتهای دستور If باید از کد End If استفاده نمود تا کامپایلر متوجه شود که در صورت برقرار بودن یا بر قرار نبودن شرط یا شروط خاص، کدام بلاک از دستورات را باید به موقعِ اجرا گذاشت.

دهیمن خط از مجموعه کدهای فوق با استفاده از متد CopyFile کلیه فایلهای موجود در آدرس کتابخانه مهندسی نرم افزار WaterGEMS را که عبارت است از C:\ProgramData\Bentley\WaterGEMS\8\Libraries در درایو “\:C” و در پوشه ای که با استفاده از وجه شرطی ساخته ایم قرار می دهد.

یازدهمین خط برنامه از متدی به نام DeleteFile جهت حذف تمام فایلهای موجود در کتابخانه مهندسی نرم افزار WaterGEMS واقع در آدرس C:\ProgramData\Bentley\WaterGEMS\8\Libraries را حذف می نماید. توجه کنیم که دراین برنامه از متدهایی با نام های CopyFile، DeleteFile، DeleteFolder، CreateFolder و FolderExists استفاده کرده ایم. این متدها بصورت پیش فرض فعال نیستند و با فعال نمودن کلاسی تحت عنوان File System Object قابل دسترسی خواهند شد.

دوزادهمین خط از کدهای این برنامه، تمام فایلهای موجود در آدرس C:\WaterseBentley را مجددا به کتابخانه مهندسی نرم افزار WaterGEMS باز خواهد گرداند.

در سیزدهمین خط این برنامه نیز پس از آنکه کلیه فایلهای موجود در آدرس C:\WaterseBentley به کتابخانه مهندسی WaterGEMS برگردانده شد، این پوشه توسط متد DeleteFolder حذف می گردد. این حذف به دلیل آنست که پس از اجرای برنامه و اصلاح فایل نصبی کتابخانه مهندسی WaterGEMS، دیگر به پوشه C:\WaterseBentley و فایلهای درون آن نیاز نیست و بهتر است برنامه پس از اینکه خواسته برنامه نویس را تأمین نمود، تمام فایلها و پوشه های بلا استفاده را که بطور موقت نیاز به آنها داشته و خود ایجاد نموده، حذف نماید. با اینکار پس از اجرای برنامه، محتوای هارد دیسک بدون تغییر باقی می ماند و تنها تفاوت ایجاد شده آنست که ایراد موجود در کتابخانه مهندسی WaterGEMS مرتفع گردیده است.

چهاردهمین خط برنامه یک پیام به کاربر خواهد داد. مضمون این پیام بدین صورت است که پس از اجرای برنامه ای که با هم اقدام به نوشتن آن کردیم، چنانچه برنامه توانسته بدون اشکال اجرا شود و خواسته برنامه نویس را تأمین نماید، اتمام کار و رضایت بخش بودن عملیات کد نویسی شده توسط پیام “مشکل با موفقیت مرتفع گردید” به کاربر اعلام گردد.

بدیهی است که این برنامه بسیار بسیار ساده بوده و عملکردی کاملا ابتدایی دارد مع الوصف دقت در اجزاء تشکیل دهنده آن کمک خواهد کرد تا با استفاده از یادگیری روند کدنویسی و روال توضیح داده شده در همین دستورات ساده نیز، قادر باشیم تا اقدام به نوشتن کدهای پیشرفته تر و طولانی نماییم. تسلط بر تکنیک هایی ساده از این دست تا پیچیده ترین تکنیکهای برنامه نویسی که کنترل کامل تمام حرکات کاربر را در دستان برنامه نویس قرار خواهد داد، در دوره استادی VBA بطور مشروح بیان و تقدیم حضور سروران گردید. ضمنا با توجه به آنکه استفاده از کدهای VBA بسیاری از تحلیل های هیدرولیکی را به سرعت میسر خواهد ساخت، کدهایی بسیار پیچیده جهت انجام محاسبات هیدرولیکی پیشرفته به سر فصل دوره های جدید استادی اضافه شده که در دوره های آتی WaterGEMS Master با تحلیل های همزمان در WaterGEMS و Visual Basic Editor (VBE) روالهای سریع و بسیار دقیق جهت تحلیلهای پیچیده و وقت گیر حضور محترم سروران ارائه خواهد گردید. انشاء الله توانسته باشیم کاربرد ماکرونویسی در نرم افزار WaterGems را به اختصار و بطور شفاف برای شما شرح داده باشیم.

آرش ازکیا
اگر دورتر ها را دیدم، بر دوش بزرگان ایستاده بودم!
نظر خود را بنویسید:
ثبت دیدگاه
دیدگاه های کاربران
فرجی
13:10 - 1397/07/08
پاسخ دهید

با سلام ی مقاله خوب 2018 خارجی در مورد سری های زمانی چند گانه دارید؟

لطفا صبر کنید