فصل ۱: مبانی
این فصل برای آن طراحی شده است که شما را با گامهای اولیهٔ استفاده از پنجرهٔ Visual Basic Editor و نوشتن یک قطعه کد سادهٔ VBA آشنا کند. در این فصل نحوهٔ کار با Visual Basic Editor (VBE)، پنجرههای Project Explorer و کد را خواهید دید و یاد میگیرید چگونه یک ماکروی ساده بنویسید تا کادر پیام «Hello World» را نمایش دهد.
ماکروها و ماژولهای VBA در Access
ممکن است متوجه شده باشید که در Access میتوانید هم ماکرو ایجاد کنید و هم ماژولهایی که حاوی کد VBA هستند. تفاوت این دو چیست؟ هر دو روشی برای ایجاد رویههای خودکارسازی هستند، اما ماکروها نسبت به ماژولها محدودترند و از VBA استفاده نمیکنند.
اگر در نوار منو روی Create کلیک کنید و سپس در بخش Macros and Code از Ribbon روی آیکون Macro کلیک کنید، پنجرهٔ ویرایشگر ماکرو مطابق شکل ۱-۱ نمایش داده میشود.
اگر روی فهرست کشویی Add New Action کلیک کنید، فهرستی از فرمانهای مختلف ماکرو مانند CloseWindow یا DeleteRecord ظاهر میشود. با انتخاب یکی از این گزینهها میتوانید پارامترهایی مانند نام فرمی که باید باز شود وارد کنید یا یک فیلتر اضافه کنید.
در اصل، این روش شیوهای ساده برای ساخت ماکرو است، اما از نظر غنا و انعطافپذیری به پای یک ماژول VBA نمیرسد. هر کاری که در Macro Editor ارائه میشود در ماژولهای VBA نیز، هرچند با قالبی متفاوت، قابل انجام است و ماژولها انعطاف یک زبان برنامهنویسی واقعی را فراهم میکنند. توجه کنید که بسیاری از فرمانهای ماکرو را میتوان مستقیماً در کد VBA به کار برد. از آنجا که تمرکز این کتاب بر ماژولهای VBA است، در ادامه دربارهٔ ماکروهای Access بحث بیشتری نخواهد شد.
کاوش در Visual Basic Editor در Access
اگر زیاد با Access کار میکنید، با چیدمان پایگاهدادهٔ آن آشنا هستید. هنگامی که Access را باز میکنید، نمای استاندارد چیزی شبیه شکل ۱-۲ است. Ribbon مجموعهٔ Office در بالای صفحه قرار دارد و در سمت چپ پنجرهای دیده میشود که امکان تعریف و ویرایش اشیای مختلف پایگاهداده، مانند جدولها، Queryها، فرمها و گزارشها را فراهم میکند.
خوانندگانی که قبلاً از Access 2007 استفاده کردهاند با سبک جدید منوی Ribbon آشنا هستند؛ اما اگر از نسخههای قدیمیتر Access ارتقا میدهید، متوجه میشوید رابط کاربری کاملاً با چیزی که به آن عادت داشتید تفاوت دارد. از بعضی جهات کاربران تازهکار مزیت بزرگی دارند، چون به دنبال گزینههای منو در محلهای قدیمی نمیگردند. اگر سیستم منوی قدیمی را خوب بشناسید و بخواهید خود را با Ribbon جدید وفق دهید، این تغییر میتواند واقعاً آزاردهنده باشد.
خوشبختانه پنجرهٔ Visual Basic Editor (VBE) نسبت به نسخههای قدیمی Access تقریباً بدون تغییر مانده است؛ بنابراین اگر در Access 2003/2007 کد VBA طراحی کرده باشید، تفاوتهای زیادی مشاهده نخواهید کرد.
شکل ۱-۱ — پنجرهٔ Macro Editor و فهرست Add New Action
بسیاری از کاربران نمیدانند که افزون بر برنامهٔ پایگاهدادهٔ Access، یک زبان برنامهنویسی بسیار قدرتمند نیز درون Access تعبیه شده است که میتوانید با آن برنامههای خود را طراحی کنید. با VBA میتوانید برنامههای ماکرویی بنویسید که کارهای بسیار قدرتمندی انجام میدهند. یک برنامهٔ ماکرویی، رویهای نوشتهشده با کد VBA است که وظایف مشخصی را انجام میدهد؛ برای نمونه، خروجیگرفتن یک فایل متنی از یک جدول یا ایجاد و ویرایش یک Query. هر کاری که با آنها انجام دهید، ماکروها وظایف را خودکار میکنند و کار را برای شما و کاربران پایگاهداده آسانتر میسازند.
این زبان همراه با ساختارها و سلسلهمراتب اشیا کار میکند و حتی میتوانید با استفاده از ماژولهای کلاس، اشیای خود را ایجاد کنید؛ این موضوع در فصل ۲۱ توضیح داده میشود. ممکن است بعضی افراد استدلال کنند که VBA یک زبان شیءگرا نیست، اما بیتردید بسیاری از ویژگیهای یک زبان شیءگرا را در اختیار دارد.
به پروژههای VBA از طریق برنامهٔ همراهی به نام Visual Basic Editor (VBE) دسترسی پیدا میکنید. کلیدهای ALT+F11 را فشار دهید تا پنجرهٔ نشاندادهشده در شکل ۱-۳ را ببینید. همچنین میتوانید در نوار منوی Access روی Create کلیک کنید و سپس از فهرست کشویی آیکون Macro/Module در گروه Other روی Ribbon استفاده کنید. با این حال، این روش علاوه بر ماژولهای موجود یک ماژول جدید ایجاد میکند و ممکن است نخواهید چنین کاری انجام دهید.
شکل ۱-۲ — صفحهٔ استاندارد پایگاهداده در Access
در نگاه اول، این پنجره با نوار منوی تازهٔ خود که شامل گزینههای File, Edit, View, Insert, Format, Debug, Run, Tools, Add-Ins, Window و Help است، ممکن است گیجکننده به نظر برسد. این پنجره بهصورت یک پنجرهٔ برنامهٔ جداگانه باز میشود، اما همچنان کاملاً بخشی از برنامهٔ Access است. در واقع، این پنجره از نظر کارهایی که میتوانید با Access انجام دهید دنیای تازهای را پیش روی شما باز میکند. در بخش بعدی، پنجرههای آن با جزئیات بیشتری توضیح داده میشوند.
شکل ۱-۳ — پنجرهٔ استاندارد Visual Basic Editor
پنجرههای VBA Project Explorer و Code
Project Explorer که درخت پروژه را نمایش میدهد، در سمت چپ صفحه و درست زیر منو و نوار ابزار قرار دارد. این پنجره پروژهٔ VBA مربوط به پایگاهداده را در وضعیت فعلی آن نشان میدهد و جزئیات را به شکل درختی نمایش میدهد تا بتوانید بهآسانی میان آنها جابهجا شوید. توجه کنید که تنها ماژولها و ماژولهای کلاسی که خودتان ایجاد کردهاید در آن دیده میشوند. اگر به استفاده از VBA در Excel عادت داشته باشید، احتمالاً متوجه شدهاید که هر Workbook و Worksheet ماژول خودش را دارد و ساختار ماژولها بازتابی از Sheetهای Workbook شماست.
اگر تصور کنید که در Access، فرمها و گزارشها نقش Dialogها و Worksheetهای Excel را دارند، میتوانید برای این اشیا نیز ماژول داشته باشید. هنگامی که ماژولی برای یک فرم یا گزارش ایجاد شود، آن ماژول در درخت اشیا در سمت چپ پنجرهٔ VBE ظاهر خواهد شد.
یکی از دشواریهای Access این است که کد میتواند در چند محل متفاوت قرار بگیرد. ماژولها را میتوان از طریق پنجرهٔ VBE درج کرد یا آنها را به فرمها و گزارشها افزود. تا زمانی که فرم یا گزارش باز باشد، همهٔ ماژولهای کد با یکدیگر تعامل دارند و جریان برنامه اغلب میتواند از یک ماژول به ماژول دیگر، یا مثلاً از یک فرم به فرم دیگر، عبور کند.
برای نمونه، یک Subroutine ممکن است Subroutine یا Function دیگری را که در ماژولی دیگر قرار دارد فراخوانی کند. آن عمل انجام میشود و سپس جریان برنامه به رویهٔ اصلی که فراخوانی از آن انجام شده بود بازمیگردد.
این موضوع میتواند دنبالکردن دقیق اتفاقاتی را که در یک برنامهٔ Access رخ میدهد دشوار کند و اشکالزدایی کد نیز ممکن است به کاری بسیار پیچیده تبدیل شود. بیتردید تحویلگرفتن یک برنامهٔ Access موجود و فهمیدن اینکه تمام اجزای آن چگونه کار میکنند دشوارتر است.
به خاطر داشته باشید که VBA یک زبان مبتنی بر اشیاست. یعنی زبان با انواع مختلف اشیا کار میکند. برای مثال، خود برنامهٔ Access یک شیء است؛ تعریف یک Query نیز یک شیء است و تعریف جدول هم همینطور. هنگام استفاده از VBA، از این اشیا و Propertyها، Methodها و Eventهای مختلف آنها برای ساخت کد خود استفاده میکنید.
اولین شاخهٔ درخت که از ریشهٔ پروژهٔ VBA منشعب میشود Microsoft Office Access Class Objects نام دارد. در زیر این شاخه، اشیای مربوط به ماژولهایی که در VBE ساخته شدهاند قرار میگیرند. با این حال، هنگامی که فرمها و گزارشها را اضافه میکنید و برای آنها ماژول میسازید، این تغییرها نیز در ساختار درختی منعکس میشوند.
درک این مفهوم بسیار مهم است، زیرا تمام فرمها و گزارشهایی که ایجاد میکنید اشیایی هستند که میتوان به آنها ارجاع داد. البته اینها تنها اشیای موجود در Access نیستند؛ اما اگر Project Explorer را بهشکل ساده در نظر بگیریم، اشیایی هستند که در آن نمایش داده میشوند.
در یک پایگاهدادهٔ کاملاً جدید Access که بهتازگی ایجاد کردهاید، هیچ ماژولی قابل مشاهده نیست. برای درج یک ماژول از نوار منو روی Insert | Module کلیک کنید.
در ابتدا ماژول چیز زیادی نشان نمیدهد و ممکن است ندانید باید با آن چه کنید. اگر عبارتی تصادفی مانند What do I do now? را تایپ کنید و ENTER بزنید، خطای Compile دریافت خواهید کرد. دلیل آن این است که برای واردکردن کد قواعد و انضباط خاصی وجود دارد. هر چیزی که در اینجا وارد میکنید از یک کامپایلر Visual Basic عبور میکند؛ کامپایلر نوشتهٔ شما را تفسیر کرده و آن را به دستورهایی تبدیل میکند که رایانه میفهمد. متأسفانه کامپایلر زبان انگلیسی معمولی را نمیفهمد و به همین دلیل خطای Compile نشان داده میشود.
در کادر پیام Compile Error روی OK کلیک کنید و عبارت خود را حذف کنید. توجه کنید وقتی خطای Compile ظاهر شد، خط حاوی عبارت به رنگ قرمز درآمد تا توجه شما را به مشکل جلب کند. حتی اگر هیچ کاری نکنید، این خط قرمز باقی میماند تا بهعنوان علامت هشدار نشان دهد مشکلی در کد وجود دارد.
اکنون صفحهٔ شما باید شبیه شکل ۱-۴ باشد.
اولین گام برای واردکردن مقداری کد VBA، ایجاد Subroutineای به نام MyCode است. کافی است در هر جای صفحهٔ ماژول عبارت Sub MyCode را تایپ کرده و ENTER بزنید. VBA بهطور خودکار End Sub و پرانتزهای بعد از MyCode را اضافه میکند.
Sub MyCode()
End Sub
شکل ۱-۴ — پنجرهٔ کد برای یک ماژول Access
به این ترتیب ناحیهای برای نوشتن کد VBA در اختیار شما قرار میگیرد. توجه کنید که در فهرست کشویی گوشهٔ بالا-راست پنجرهٔ ماژول، Subroutine شما با نام MyCode اکنون اضافه شده است. این ویژگی برای ناوبری بسیار مفید است. در برنامههای پیچیده که تعداد زیادی رویه در یک ماژول وجود دارد، این فهرست یک لیست الفبایی مفید از آنها ارائه میکند.
اگر قصد دارید برای یک Event کد بنویسید، باید این دو عبارت را در کد داشته باشید؛ در غیر این صورت خطای Compile دریافت میکنید. میتوانید آنها را مانند خط شروع و پایان یک مسابقه در نظر بگیرید: این دو عبارت به کامپایلر میگویند کد از کجا آغاز و در کجا تمام میشود. اگر برای آن Event کدی نمیخواهید، میتوانید آنها را حذف کنید، اما باید هر دو حذف شوند؛ در غیر این صورت خطای Compile رخ میدهد. کامپایلر انتظار دارد کد مرتب و منظم باشد؛ یعنی ساختار آن باید صحیح باشد.
در حال حاضر شروع و پایان یک Event را دارید. با اینکه میان عبارتهای Sub و End Sub هیچ کدی نیست، رویه همچنان فعال است و با کلیک روی آیکون Run در نوار ابزار ــ مثلث سبزرنگی که به سمت راست اشاره میکند ــ یا با فشار دادن F5 اجرا میشود. با این حال، چون هیچ کدی در Event وجود ندارد، اتفاقی نمیافتد.
اولین ماکروی VBA در Access
کتابهای برنامهنویسی بهطور سنتی نخستین گامهای شما را با نوشتن قطعهکدی ساده برای نمایش متن «Hello World» آغاز میکنند و این کتاب نیز از این قاعده مستثنا نیست. برای نمایش این عبارت از دستور MsgBox استفاده خواهید کرد. این یک رابط کاربری ساده شامل پیام و دکمهٔ OK است که احتمالاً بارها در Windows دیدهاید.
زیر عبارت Sub MyCode() و قبل از End Sub عبارت msgbox "Hello World" را تایپ کنید. عمداً هنگام تایپ msgbox از کلید SHIFT استفاده نکنید و ببینید چه اتفاقی میافتد. واژهٔ msgbox به شکل ترکیبی حروف بزرگ و کوچک یعنی MsgBox تبدیل میشود، زیرا این واژه در VBA یک دستور تعریفشده است و از قبل برای نمایش به این شکل تنظیم شده است. با این حال باید املای آن را دقیق وارد کنید؛ اشتباه املایی باعث خطای Compile میشود.
Private Sub MyCode()
MsgBox "Hello World"
End Sub
توجه کنید که دستور MsgBox با کلید TAB تورفتگی گرفته است. این روش مفیدی برای تشخیص آغاز و پایان مجموعهای از دستورهاست. بدون این نشانهگذاری، هنگام کار با حلقههای پیچیده بهسادگی ممکن است گم کنید یک حلقه از کجا شروع شده و کجا پایان مییابد. دربارهٔ حلقهها در فصل ۴ بیشتر توضیح داده میشود.
دستور MsgBox روشی ساده برای ایجاد یک رابط با کاربر است که پیامی را همراه با دکمهٔ OK نمایش میدهد. بیشک بارها چنین کادرهای پیامی را دیدهاید و اکنون میدانید ساخت آنها چقدر ساده است. این کادرها میتوانند بسیار پیشرفتهتر شوند و فصل ۵ نحوهٔ استفاده از آنها را با جزئیات بیشتری توضیح میدهد.
پس از تایپ واژهٔ msgbox، کادری شامل تمام پارامترهای این فرمان نمایش داده میشود. در این مثال لازم نیست به آن توجه کنید، چون فقط یک رشتهٔ متنی را نمایش میدهید. با این حال این کادر برای فهمیدن پارامترهای موردنیاز یک Function و ترتیب قرارگیری آنها بسیار مفید است. برای مثال اگر بخواهید به کادر پیام یک آیکون یا عنوان بدهید، کادر پارامترها کمک میکند این کار را درست انجام دهید. هنگامی که به پارامتر مربوط به آیکون میرسید، یک List Box ظاهر میشود که فهرستی از Constantهای اختیاری برای آیکون موردنظر را نشان میدهد. این نوع راهنما برای همهٔ Functionها هنگام استفاده از ویرایشگر VBA در دسترس است. پنجرهٔ کد شما باید اکنون شبیه شکل ۱-۵ باشد.
اکنون میتوانید کد خود را اجرا کنید. این کار به یکی از سه روش زیر انجام میشود:
- در هر نقطهای از کد MyCode کلیک کنید و سپس آیکون Run را در نوار ابزار VBE بزنید؛ همان مثلث سبزرنگی که به سمت راست اشاره میکند.
- کلید F5 را فشار دهید.
- در منوی VBE گزینهٔ Run | Run Sub/UserForm را انتخاب کنید.
پیش از اجرا مطمئن شوید Cursor داخل بدنهٔ Subroutine قرار گرفته باشد تا VBA بداند کدام رویه را باید اجرا کند. اکنون صفحهٔ شما باید شبیه شکل ۱-۶ باشد. در این شکل فرض شده است که از قبل پایگاهدادهای باز نبوده، به همین دلیل Ribbon بهصورت خاکستری نمایش داده شده است.
همانطور که میبینید، تقریباً بدون نوشتن کد میتوانید در Access رابطهایی با ظاهر حرفهای تولید کنید. این یک نمایش ساده از افزودن کد به یک ماژول است. اگر قبلاً از VBA در Excel استفاده کرده باشید، میدانید Eventهایی نیز وجود دارند که میتوانید برای آنها کد بنویسید؛ برای مثال Workbook_Open. Eventها در VBA مربوط به فرمها و گزارشهای Access هم وجود دارند. نمونهای مشابه در Access، Event مربوط به بازشدن فرم است که هر بار آن فرم خاص در پایگاهداده باز شود اجرا میشود. این موضوع در فصل ۹ بیشتر بررسی خواهد شد.
در یک پایگاهدادهٔ Access، هر زمان اتفاقی رخ میدهد Eventهای گوناگونی نیز دائماً فعال میشوند. میتوانید برای واکنش به یک Event خاص کد بنویسید؛ مثلاً زمانی که کاربر در یک فرم انتخابی انجام میدهد. هر بار آن Event رخ دهد، کد شما اجرا خواهد شد.
با این حال، تا زمانی که در کادر پیام روی OK کلیک نکرده و اجرای ماکرو تمام نشده است، نمیتوانید در پنجرهٔ کد ویرایش انجام دهید. دلیل آن این است که Focus کد روی پنجرهٔ کادر پیام قرار دارد و تا زمانی که کادر پیام بسته نشود، Focus نمیتواند به بخش دیگری از Access منتقل شود.
شکل ۱-۵ — کد نمایش کادر پیام «Hello World» با استفاده از MyCode
برای حذف این رویه، کافی است تمام خطهای مربوط به آن را پاک کنید، یا فقط خط MsgBox "Hello World" را با کلید DELETE حذف کنید. راه دیگر برای جلوگیری از اجرای یک خط کد، تبدیل آن به Comment است. برای این کار کاراکتر تککوتیشن (') را در ابتدای خط قرار دهید، مانند ' MsgBox "Hello World". در این حالت خط به رنگ سبز درمیآید و اجرا نمیشود. Commentها همچنین برای قرار دادن توضیح و شرح دربارهٔ کد درون یک ماکرو استفاده میشوند تا در آینده بتوان منطق آن را بهتر فهمید.
شکل ۱-۶ — کادر پیام Hello World
کاوش بیشتر در پنجرهٔ پروژهٔ VBA
اگر دوباره به Project Explorer و درخت پروژه در گوشهٔ بالا-چپ صفحه برگردیم، اشیایی برای فرمها و گزارشهایی که ماژول VBA به آنها متصل شده است نیز مشاهده میکنیم. هر فرم و هر گزارش یک شیء مستقل است و در درخت Project نیز به همین شکل نمایش داده میشود.
ماژولهایی که از طریق VBE درج میکنید Event ندارند، اما ماژولهای مربوط به فرمها و گزارشها دارای Event هستند. این Eventها میتوانند از بازشدن فرم تا تغییر داده توسط کاربر را پوشش دهند. Eventها نقاطی را در اختیار برنامهنویس VBA قرار میدهند تا کدی بنویسد که اعمال کاربر را رهگیری و مدیریت کند. این موضوع در فصل ۹ با جزئیات بیشتری توضیح داده میشود.
ذخیرهکردن کد
دانستن اینکه چگونه کد خود را همراه با فایل پایگاهدادهای که استفاده میکنید ذخیره کنید اهمیت زیادی دارد. فرایند بسیار ساده است: یا روی نماد دیسک در نوار ابزار VBE کلیک کنید یا در نوار منوی پنجرهٔ VBE گزینهٔ File | Save… را انتخاب کنید.
با این کار همهٔ تغییرهای ماژولها، از جمله تغییرهای مربوط به فرمها و گزارشها، ذخیره میشوند. هنگام توسعهٔ کد باید مرتباً آن را ذخیره کنید؛ در غیر این صورت اگر قطع برق یا بحران دیگری رخ دهد ممکن است کار خود را از دست بدهید.
هنگام ایجاد تغییرهای مهم در کد، معمولاً بهتر است نسخهٔ دیگری از فایل با شمارهٔ نسخهای متفاوت، مانند 1.02 یا 1.1، ایجاد کنید. در این صورت اگر مشکلی غیرمنتظره در کد یا پایگاهداده پیدا شود، نسخهٔ پشتیبانی دارید که میتوانید به نسخهٔ قبلی پایگاهداده برگردید و دوباره از آنجا ادامه دهید.
اگر برای توسعهٔ برنامههای VBA از Excel استفاده کرده باشید، ذخیرهٔ نسخهٔ دیگری از Spreadsheet با نامی متفاوت بسیار آسان است. Access این انعطاف را فراهم نمیکند. پس از ایجاد پایگاهدادهٔ جدید، از تابع Save As فقط برای ذخیره در قالبی دیگر میتوانید استفاده کنید، در حالی که برای ساخت یک نسخهٔ توسعهای جدید چنین کاری نمیخواهید.
راهحل این است که پایگاهداده را ببندید و در Windows Explorer از آن یک کپی بگیرید؛ برای دسترسی به آن میتوانید روی دکمهٔ Start ویندوز در گوشهٔ پایین-چپ صفحه راستکلیک کنید. سپس شمارهٔ نسخهٔ جدیدی در نام فایل قرار دهید و همان نسخه را برای ادامهٔ کار باز کنید.
هنگام کار روی یک پایگاهدادهٔ Access، بهویژه زمانی که برنامه در محیط واقعی در حال استفاده است، نویسنده همیشه از این تکنیک برای توسعه استفاده میکند. حتی با کدهای سادهٔ VBA نیز اتفاقهای زیادی ممکن است اشتباه پیش برود، بنابراین همیشه باید امکان بازگشت به نسخهای سالم را داشته باشید.