اگر در پروژهای پیامهای خطای غیرقابل توضیحی دریافت میکنید، بهویژه زمانی که میخواهید کد VBA خود را کامپایل کنید، یا اگر Microsoft Access هنگام اجرای برنامه یا عملکرد خاصی در آن از کار میافتد، این احتمال وجود دارد که فایل Access شما حاوی کد VBA خراب باشد. این در واقع کد VBA نیست که خراب است، بلکه کد "ماشین" است که کد VBA شما برای آن کامپایل شده است.
کامپایل کد VBA
هنگامی که پروژه VBA خود را با استفاده از دستور Debug – Compile ... از منوی محیط VBA کامپایل می کنید، کامپایلر VBA تمام کدهای VBA پروژه شما را به P-Code ترجمه می کند .
P-Code یک کد میانی است که کد ماشین است، اما نه برای یک معماری فیزیکی واقعی، بلکه برای یک کامپیوتر مجازی انتزاعی. میتوان آن را به سرعت به کد ماشین اصلی رایانهای که برنامه VBA در حال حاضر روی آن اجرا میکند ترجمه کرد. این می تواند یک فرآیند باینری باشد. در ابتدا فقط کد VBA در نمایش متن متعارف آن که در ویرایشگر VBA می بینید وجود دارد و اصلاً کد کامپایل شده وجود ندارد. سپس کد کامپایل شده ایجاد می شود. همانطور که احتمالا متوجه شده اید، می توانید یک خطای کامپایل در کد خود داشته باشید که از کامپایل شدن برخی از کدها جلوگیری می کند، اما در عین حال می توانید بخش های دیگر پروژه خود را اجرا کنید. اجرای کد در پروژه شما نیاز به کامپایل شدن دارد. بنابراین، در این سناریو یک قسمت از پروژه شما به حالت قابل اجرا کامپایل می شود در حالی که قسمت دیگری از پروژه شما به دلیل خطا در کد قابل کامپایل نیست. کامپایلر می تواند بخی ز ماژول های را کامپایل کند در حالی که دیگر ماژولها را نادیده می گیرد. این زمانی اتفاق میافتد که یک ماژول جدید ایجاد میکنید، مقداری کد مینویسید و سپس کد جدید را بدون کامپایل کردن کل پروژه اجرا میکنید. سپس کامپایلر تنها ماژول (و وابستگیهای آن) را که برای اجرای کدی که میخواهید در حال حاضر اجرا کنید مورد نیاز است، کامپایل میکند.
نتیجه گیری: حالت کامپایل برای کل پروژه اتفاق نمی افتد بلکه فقط برای هر ماژول اتفاق می افتد.
اما به همین جا ختم نمی شود. کامپایل کردن از متن متعارف (کدی که شما نوشتید) به کدی که یک کامپیوتر می تواند اجرا کند معمولاً یک فرآیند چند مرحله ای است. به عنوان مثال، کد در زبان برنامه نویسی C به صورت متوالی توسط یک پیش پردازنده، یک کامپایلر، یک اسمبلر و در نهایت یک پیوند دهنده برای ایجاد یک فایل اجرایی پردازش می شود. در طی این فرآیند، حالت های میانی کد بین متن ساده و کد ماشین ذخیره می شود. نکته اصلی این است: مراحل و بخش های متحرک زیادی از کدهای متنی خالص تا کدهای کاملاً کامپایل شده درگیر هستند. بسیاری از چیزها ممکن است در طول مسیر اشتباه پیش بروند و می توانند باعث شوند که بخش هایی از کد تا حدی کامپایل شده به حالتی برسد که باعث رفتار غیرمنتظره شود، از پیام های خطای مزخرف گرفته تا از کار افتادن Access، در هنگام پردازش. برای کامپایل صریح پروژه VBA از دستور Debug – Compile ... استفاده کنید . اگر این کار با موفقیت انجام شود، همه کدها با موفقیت کامپایل شده اند و دیگر خطر اجرا نشدن ناخواسته به دلیل کامپایل بخشی وجود ندارد.
دیکامپایل(decompile) کنید
برای رفع مشکلات (تا حدی) کد VBA کامپایل شده در یک پایگاه داده Access، تیم Microsoft Access سوئیچ خط فرمان decompile/ را برای MSACCESS.EXE ایجاد کرد. در ابتدا این به عنوان یک ویژگی داخلی و غیر مستند مایکروسافت فقط برای تیم پشتیبانی در نظر گرفته شده بود، اما در نهایت به جامعه Access درز کرد و تبدیل به ابزاری ارزشمند برای نجات پایگاههای اطلاعاتی اکسس خراب، شد.
اصطلاح decompile نشان میدهد که فرآیند P-Code کامپایلشده را از فایل پایگاه داده شما میگیرد و فرآیند کامپایل را برای بازسازی نسخه متنی ساده کد VBA معکوس میکند.
یک پایگاه داده عادی (mdb/accdb) اکسس شامل کد کامپایل شده و کد اصلی VBA ساده است. اجرای Access با سوئیچ decompile/ به سادگی به Access میگوید که تمام حالتهای مختلف کد کامپایلشده را از بین ببرد و دوباره از ابتدا (یعنی کد VBA شما) شروع کند.
اشتباه نکنید، شما نمی توانید از سوئیچ decompile/ برای بازیابی کد اصلی VBA از یک فایل کامپایل شده mde/accde Access استفاده کنید، این سوئیچ در واقع راهکاری برای تیم برنامه نویسی Access در مایکروسافت بوده است که کامپایل کامل را از سر می گرفته(شروع می کرده)، و نه برای استفاده عموم مردم- اما همانطور که گفتم کارایی دارد. هنگام ایجاد یک فایل mde/accde، کد VBA به P-Code کامپایل می شود، P-Code در فایل ذخیره می شود و کد اصلی VBA حذف می شود. بنابراین، دستور decompile/ نمی تواند با فایل کامپایل شده (mde یا accde) کاری انجام دهد، این دستور برای فایل های از نوع mdb یا accdb کارایی دارد.
هنگامی که کد به طور کامل با موفقیت کامپایل شد، خطر برگشت از کد باینری به کد VBA و حالت های میانی وجود ندارد.
Decompile در عمل
برای جمع بندی همه چیز، بیایید نحوه استفاده واقعی از decompile/ را بررسی کنیم.
از آنجایی که این یک سوئیچ خط فرمان است، باید یک خط فرمان برای اجرای اکسس بسازید و به نوبه خود فایل پایگاه داده خود را باز کنید. این به سادگی شبیه این است:
"MSACCESS.EXE" /decompile "C:\path\to\database.accdb"
ممکن است لازم باشد مسیر MSACCESS.EXE و البته فایل پایگاه داده خود را تنظیم کنید. سپس می توانید خط فرمان بالا را از پردازنده خط فرمان Window (cmd.exe) اجرا کنید.
برای راحتی من، من معمولاً یک میانبر در فهرست کاری هر پروژه Access با چنین خط فرمانی برای فایل Access آن پروژه ایجاد می کنم. این باعث می شود که با دوبار کلیک به راحتی در دسترس باشد.
لطفاً توجه داشته باشید: سوئیچ decompile/ فقط به عنوان یک ابزار داخلی در مایکروسافت در نظر گرفته شده است. این به طور رسمی مستند نیست و احتمالاً به اندازه سایر ویژگی ها کاملاً آزمایش نشده است. همیشه ایده خوبی است که قبل از دیکامپایل کردن از فایل پایگاه داده خود نسخه پشتیبان تهیه کنید.