این مطلب در ادامه مطلب قبل در مورد برنامه نویسی ماکرو هست.

برنامه ویژوال بیسیک توسط جان کمنی John Kemeny و توماس کورتز Thomas Kurtz در سال 1964 خلق شده است و BASIC مخفف Beginners All-Purpose Symbolic Instruction Code است. در ابتدا به عنوان یک مفسر برای برنامه‌های تحت سیستم MS-DOS توسط مایکروسافت مورد استفاده قرار گرفته است. اما به مانند برنامه‌هایی مثل C و C++ سریع نبوده و نمی‌تونسته با اون‌ها رقابت کنه. برای همین زبان BASIC بیشتر برای کارهای آموزشی و پیش و پا افتاده مورد استفاده قرار می‌گرفت.

در سال‌های 1980 برنامه‌های گرافیکی graphical user interfaces (GUI) توسط مایکروسافت به وجود آمده بودند و ایجاد رابط‌های کاربری گرافیکی با برنامه‌های متنی کاری سخت و دشوار شده بود.

برای همین مایکروسافت در سال 1991 با تغییرات اساسی در BASIC برنامه جدیدی به نام Visual Basic 1.0 را معرفی می‌کند. معرفی این برنامه ساخت برنامه‌های ویندوز برای برنامه‌نویسان را ساده‌تر از قبل می‌کنه. این برنامه به مرور زمان به یک برنامه شی گرا Object Oriented و کاملا رویداد محور Event driven تبدیل می‌شه.

پروسه‌ی برنامه نویسی در ویژوال بیسیک به طور شفافی قابل توصیف است: 1. ایجاد رابط کاربری بر روی صفحه نمایش و کنترل‌کننده‌ها (مثل دکمه‌ها یا تابع Inputbox) 2. تعریف مشخصات کنترل‌کننده‌ها 3. نوشتن کدهایی که مشخص می‌کنند که کنترل‌کننده‌ها چه پاسخی به ورودی‌های کاربر بدهند.

مثلا با ایجاد MsgBox ما یک رابط کاربری ایجاد می‌کنیم که دارای دکمه‌های متفاوتی می‌تواند باشد.

هر کدام از دکمه‌ها خصوصیاتی Properties دارند. مثل اسمی که با اون به نمایش در میاند caption یا اسمی که با اون بهشون ارجاع داده می‌شه name.

علاوه بر خصوصیات هر دکمه به روش متفاوتی با کاربر تعامل می‌کنه. مثلا روی دکمه‌ها کلیک می‌شه یا در inputbox متن نوشته می‌شه. به این روش‌های متفاوت رویداد Event گفته می‌شه.

وقتی یک رویداد خاص اتفاق می‌افته برنامه باید به شکل مناسبی به آن جواب دهد. کار برنامه‌نویس این است که دستوراتی را بنویسد تا بگوید سیستم چگونه باید به این کنترل‌کننده‌ها پاسخ دهد.

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

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

مایکروسافت بخش‌هایی از ویژوال بیسیک را به برنامه‌های محبوب خود مثل وُرد و اکسل هم افزوده است که توانایی‌های محدودتری نسبت به ویژوال بیسیک دارند که به آن‌ها ویژوال بیسیک اپلیکیشن VBA گفته می‌شود. معمولا به عنوان برنامه ماکرو مورد استفاده قرار می‌گیرد تا بخشی از اپلیکیشن مورد نظر را کنترل کند. برای ساده کردن کارهای تکراری استفاده از آن‌ها بسیار مفید است.

شکل دیگری از ویژوال بیسیک که می‌توان آن را با جاوا اسکریپت Java Script مقایسه کرد، ویژوال بیسیک اسکریپتینگ VBScript هست که می‌تواند به شکل صفحات HTML نوشته شود و در اینترنت مورد استفاده قرار بگیرد. زبان VBScript برای ساختن صفحات وب پویا مفید است.

ویژوال بیسیک به مانند جد متنی‌اش عمل برنامه‌نویسی را بسیار ساده کرده است و به طور گسترده‌ای از آن استفاده می‌شود.

این سادگی در استفاده برای ویژوال بیسیک بدنامی آورده است و آن را در دسته زبان‌های برنامه‌نویسی درجه 2 قرار داده است. علت هم به دلیل انتخاب بین دو گزینه‌ی ساده‌تر بودن و کنترل بیشتر است. کنترل بیشتر سادگی زبان برنامه‌نویسی را کم می‌کند.

مثلا برنامه‌ای مثل C++ می‌تواند روی انجام پروسه‌های مختلف هم کنترل داشته باشد و بنابراین برای بهینه کردن کدهای نوشته‌ شده مناسب است. اگر بهینه‌سازی‌های بعدی برای برنامه‌ها مورد نیاز هست شاید زبان ویژوال بیسیک پاسخگو نباشد.

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

این سادگی در توسعه، ویژوال بیسیک را برای برنامه‌نویسان جذاب کرده است. منبع : Visual Basic 

یکی از جاهای خوب برای یادگرفتن ماکروها که خودم هم دنبال می‌کنم سایت Open Education Blackboard هست.  Introduction to Excel VBA Programming


چطور در اکسل ماکرو بنویسیم؟

گام اول وارد شدن به محیط ویژوال بیسیک اپلیکیشن VBA 

برای برنامه‌نویسی در زبان اکسل باید از ویژوال بیسیک اپلیکیشن VBA استفاده کرد.

باید صحفه اکسل رو باز کنید و برای دسترسی به آن می‌توان از کلید Alt+F11 (یا Alt+Fn+F11) استفاده کرد یا با رفتن به سربرگ Developer و انتخاب Visual Basic محیط برنامه‌نویسی اکسل را باز کرد.

اضافه کردن سربرگ Developer به اکسل:

در اکسل 2016 با رفتن به File -> Options -> Customize Ribben و تیک زدن گزینه Developer  در سمت راست صفحه می‌توان آن را به Tabهای اکسل اضافه کرد.

تب Developer در اکسل

کم کردن Security اکسل:

با استفاده از ماکروها می‌توان برنامه‌هایی نوشت که به کامپیوتر آسیب بزنند برای همین اکسل گاهی اوقات به صورت پیش‌فرض از اجرا شدن ماکروها جلوگیری می‌کند. 

برای اینکه چنین تنظیمی رو تغییر بدید باید به Developer -> Macro Security برید و در قسمت Macro Setting گزینه Disable all macros with notification رو انتخاب کنید.

گام دوم ذخیره کردن اکسل با پسوند .xlsm

حتما فایل اکسلی که دارای ماکرو هست رو با پسوند xlsm. ذخیره کنید و اگر به اشتباه اون رو با پسوند xlsx. ذخیره کنید بعد از بستن برنامه ماکروهایی که نوشته بودید رو از دست می‌دید. پس قبل از شروع به نوشتن ماکرو خوبه که این کار رو انجام بدید.

گام سوم نوشتن ماکرو

فرض کنید می‌خوایم یک ماکرو در اکسل بنویسیم که 2 عدد  رو از کاربر می‌گیره و اون عددها و جمعشون رو در یکی از خونه‌های اکسل نمایش می‌ده. و این کار رو برای 3 بار تکرار می‌کنه. می‌تونیم بگیم که 2 تاس رو برای 3 بار می‌ریزیم و جمعشون رو داریم یادداشت می‌کنیم.

وقتی وارد محیط ماکرو شدید باید یک ماژول جدید Module رو در قسمت Project ایجاد کنید و کد زیر رو در آن کپی کنید و با کلیک بر روی دکمه Run برنامه رو اجرا کنید.

Sub inout()

    For i = 2 To 4

    num1 = InputBox("Enter the 1st number?", i - 1)

    num2 = InputBox("Enter the 2nd number?", i - 1)

    num3 = Val(num1) + Val(num2)

    Cells(2, i) = num1

    Cells(3, i) = num2

    Cells(4, i) = num3

    Next i

    Sheets("Sheet1").Select

    Range("A4").Select

    ActiveCell.Value = "Sum"

End Sub

ماکرونویسی وارد کردن عدد در اکسل


به هر فایل اکسل تنها یک پروژه اختصاص داده می‌شود. اگر 3 تا فایل اکسل مختلف رو ایجاد کنید می‌تونید 3 پروژه مختلف رو با هم داشته باشید. یا اینکه اگر در یک فولدر فایل‌های اکسل با ماکرو داشته باشید آن‌ها هم در قسمت Project نمایش داده می‌شوند.
در زیر هر پروژه می‌‌توانید ماژول‌های مختلفی رو ایجاد کنید. استفاده از چند ماژول کمک می‌کند کدهای طولانی رو به تکه‌های کوچک‌تری تبدیل کنید یا اینکه کدهای متفاوت برای انجام فعالیت‌های متفاوت ایجاد کنید. به چنین سبکی برنامه‌نویسی ماژولار گفته می‌شود.

کد بالا از چه قسمت‌های تشکیل شده است؟

1. قسمت اول:   کل کد بین دو واژه Sub و End Sub قرار می‌گیرد و در جلوی Sub می‌توان نامی برای کد نوشته شده (تابع) انتخاب کرد. در اینجا: inout()

Sub inout()

End Sub

2. قسمت دوم، تابع inputbox: برای گرفتن اطلاعات از کاربر می‌توان از این تابع استفاده کرد. فرمت آن شبیه به تابع msgbox هست که در قسمت قبل توضیح داده شد.

Value = InputBox(Prompt, Title, Default, Type)

تنها ورودی اجباری برای تابع inputbox ورودی اول آن یعنی Prompt هست و ورودی‌های دیگر اختیاری هست. 

ورودی الزامی تابع inputbox یعنی Prompt: در این قسمت باید یک "استرینگ" یا متن رو وارد کنید که همان متنی هست که در معرض نمایش کاربر قرار می‌گیرد.

ورودی اختیاری اول تابع inputbox یعنی Title: به مانند ورودی اول باید یک "استرینگ" رو در اینجا وارد کرد و این استرینگ عنوان پنجره‌ی باز شده رو نمایش می‌دهد.

ورودی اختیاری دوم تابع inputbox یعنی Default: مقداری اولیه‌ای است که می‌خواهید در معرض نمایش کاربر قرار بگیرد. اگر این ورودی رو خالی بگذارید، هیچ مقداری نمایش داده نمی‌شود.

ورودی اختیاری سوم تابع inputbox یعنی Type: وقتی کاربر مقداری را در کادر تابع وارد می‌کند خروجی تابع یک "استرینگ" خواهد شد. اگر بخواهید تابع فقط مقادیری از جنس فرمول، عدد، متن، یا مقدار منطقی (بولین) را بپذیرد به ترتیب باید عددهای 0، 1، 2 و 4 را به تناظر وارد کنید. اگر بخواهید تابع هم عدد و هم متن را قبول کند می‌توانید جمع دو شماره مربوط به عدد و متن یعنی 1+2 را وارد کند.

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

برای مثال:

Value = InputBox("You should place a string as the first input", "InputBox","initial value",1+2)

که با نوشتن آن در یک Text Document و ذخیره کردن آن با فرمت vbs پنجره زیر به نمایش در می‌آید.

تابع InputBox

3. قسمت سوم، متغیرها: 

برای اینکه بفهمیم متغیرها چه هستند می‌تونیم به خونه‌های اکسل فکر کنیم که هر کدامشان آدرس مشخصی دارند و ما داده‌های متفاوتی را می‌توانیم در آن‌ها قرار بدیم.

ولی این داده‌ها رو می‌شه پاک کرد و دوباره داده‌ی جدید رو نوشت.

مثلا می‌تونم یک بار تو خونه A1 (بخونید متغیر A1) عدد 3 رو وارد کنم، یه بار هم می‌تونم اسم یک شخص رو وارد کنم مثل "مهران" یا می‌تونم عدد اعشاری درش قرار بدم مثل 2.1  یامقادیر دیگه. در ضمن اسم خونه (که همون متغیر هست) رو هم میشه تغییر داد.

 متغیرها هم در برنامه‌ها مثل خونه‌های اکسل هستند. ما بهشون مقادیری رو اختصاص می‌دیم تا بعد ازشون استفاده کنیم یا بهشون ارجاع بدیم. و این مقادیر رو دائم می‌تونیم تغییر بدیم. همچنین برای نامگذاری اطلاعات هم می‌توان از آن‌ها استفاده کرد.

علامت مساوی لزوما به معنای مساوی ریاضی نیست و به معنای نسبت دادن است. برای همین نوشتن:

a = 1

مقدار 1 را به متغیر a نسبت می‌دهد. پس مقدار کنونی a عدد 1 شده است.

و با نوشتن:

a = a+1

مقدار a+1 را به متغیر a نسبت می‌دهد. پس مقدار کنونی a عدد 2 شده است.

4. قسمت چهارم، حلقه‌ی تکرار For: برای اینکه سوال پرسیده شده از کاربر توسط تابع InputBox رو برای 3 بار تکرار کنیم لازم هست که آن را در یک حلقه For قرار بدیم. برای ایجاد حلقه از کلمات For ... Next استفاده می‌شود. همچنین لازم هست که شمارنده‌ای را برای حلقه انتخاب کنیم تا تعداد تکرار آن را مشخص کند.

فرمت آن به صورت زیر است:

For counter = start To end [ Step step ] 
statements ] 
Exit For ] 
statements ] 
Next [ counter ]

برای مثال کد زیر تابع MsgBox را برای 3 بار اجرا می‌کند و بعد از هر اجرا عنوان پنجره MsgBox را تغییر می‌دهد. باید آن را در یک فایل متنی بنویسیم.

For i = 1 To 3

Value = MsgBox(“Look at the Title”, i)

Next i

5. قسمت پنجم، انتخاب صفحه و خانه‌های اکسل و اختصاص دادن مقداری به آن:

روش اول:

با دستور Sheets(“Sheet1”).Select می‌توانید صفحه‌‌ی خاصی که می‌خواهید در اکسل رو انتخاب کنید. در اینجا صفحه Sheet1 انتخاب شده است.

با دستور Range(“A4”).Select می‌توانید خانه‌ی مشخصی در اکسل را انتخاب کنید. در اینجا خانه A4 انتخاب شده است.

پس اگر بنویسیم:

Sheets("Sheet1").Select

Range("A1").Select

خانه‌ی A1 از صفحه‌ی Sheet1 را در اکسل انتخاب کرده‌ایم. 

دستور ActiveCell.Value

با این دستور هم می‌توانید مقداری را به یک متغیر اختصاص دهید و هم می‌توانید مقداری را وارد یکی از خانه‌های اکسل کنید.

مثلا اگر بنویسید:

Range(“A1”).Select

ActiveCell.Value = “Sum”

مقدار Sum در خانه‌ی A1 نوشته می‌شود.

و اگر بنویسید:

Range(“B1).Select

Value = ActiveCell.Value

مقداری که در خانه‌ی B1 وجود دارد به متغیر Value داده می‌شود.

روش دوم:

با دستور Cells هم می‌تونیم خانه‌های مختلف اکسل را انتخاب کنیم.

مثلا در برنامه بالا Cells(2,i) = num1 عدد ذخیره شده در متغیر num1 را به سطر دوم و ستون i اُم اکسل اختصاص می‌دهد. 

در بار اولی که حلقه‌ی For اجرا می‌شود این مقدار برابر 2 است و در بار دوم برابر 3 و در بار آخر برابر 4 که به ترتیب مربوط به خانه‌های B2 و C2 و D2 می‌شوند.