تابع InputBox در VBA: ساختار، پارامترها، مثالها و مرجع
تابع InputBox در VBA از کاربر یک ورودی متنی کوتاه میگیرد و رشته واردشده را به روال VBA برمیگرداند. در این مرجع روی چیزهایی تمرکز میکنیم که هنگام نوشتن ماکروهای واقعی Excel VBA لازم دارید: شکل دقیق فراخوانی، معنی هر آرگومان، نوع مقدار بازگشتی و شرطهایی که بهتر است پیش از استفاده از نتیجه بررسی شوند. مثالها بهاندازهای کوتاه هستند که بتوان آنها را در یک Standard Module اجرا کرد، اما الگوی کدنویسی آنها برای پروژههای بزرگتر نیز قابل استفاده است.
توابع داخلی VBA کارهای رایج را با کدی کوتاه و قابل تشخیص بیان میکنند. کوتاهبودن بهتنهایی به معنی کد خوب نیست؛ یک فراخوانی مطمئن باید نوع ورودی را روشن کند، حالتهای مرزی را در نظر بگیرد و از تبدیلهای پنهانی که ممکن است با داده یا تنظیمات منطقهای تغییر کنند دوری کند. این صفحه به سبک Reference نوشته شده تا هم برای یادگیری و هم برای مراجعه سریع هنگام رفع خطا مناسب باشد.
InputBox چیست؟
در VBA، InputBox از کاربر یک ورودی متنی کوتاه میگیرد و رشته واردشده را به روال VBA برمیگرداند. این قابلیت بخشی از خود زبان VBA است و در ماژولهای معمول Excel VBA بدون افزودن Reference کتابخانه خارجی قابل استفاده است. بهترین نتیجه زمانی به دست میآید که پیش از فراخوانی، ورودی بهاندازه کافی مطابق نیاز عملیات اعتبارسنجی شده باشد.
رفتار خروجی نیز مهم است: یک String برمیگرداند. اگر کاربر Cancel را بزند، خروجی یک رشته با طول صفر است. اگر نتیجه در ادامه کد برای تصمیمگیری یا محاسبه لازم است آن را در متغیر مناسب ذخیره کنید. اگر چند تبدیل پشتسرهم انجام میشود، متغیرهای میانی معمولاً اشکالزدایی و مدیریت خطا را سادهتر میکنند.
چرا InputBox مهم است؟
InputBox بخشی از کدی را که در غیر این صورت به حلقه، parsing دستی، تبدیل نوع یا منطق رابط کاربری نیاز دارد کوتاه میکند. استفاده از تابع داخلی برای برنامهنویس VBA آشناست و قصد کد را سریع منتقل میکند؛ از نام تابع میتوان فهمید عملیات مربوط به جستوجو، استخراج رشته، تبدیل، تاریخ یا تعامل با کاربر است.
مزیت دیگر، ثبات در پروژه است. وقتی یک قانون در واردکردن داده، اعتبارسنجی، ساخت گزارش و پاکسازی شیت تکرار میشود، استفاده از همان تابع داخلی با قواعد اعتبارسنجی یکسان باعث میشود روالها رفتار متفاوت و پیشبینیناپذیر نداشته باشند. بنابراین مثال مرجع فقط کوتاهترین عبارت را نشان نمیدهد، بلکه شرایطی را که آن عبارت را قابل اعتماد میکند نیز توضیح میدهد.
ساختار
| جزء | مرجع |
|---|---|
| Syntax | InputBox(prompt, [title], [default], [xpos], [ypos], [helpfile], [context]) |
| مقدار بازگشتی | یک String برمیگرداند. اگر کاربر Cancel را بزند، خروجی یک رشته با طول صفر است. |
پارامترها و اجزا
| پارامتر | توضیح |
|---|---|
| prompt | اجباری. پیامی که مشخص میکند کاربر چه چیزی وارد کند. |
| title | اختیاری. متن نوار عنوان. |
| default | اختیاری. مقدار اولیهای که در کادر ورودی دیده میشود. |
| xpos/ypos | اختیاری. مختصات صفحه بر حسب twip؛ معمولاً بهتر است حذف شوند مگر موقعیت دقیق لازم باشد. |
آرگومانهای اختیاری را زمانی وارد کنید که رفتار موردنظر را روشنتر میکنند. اگر مقدار پیشفرض دقیقاً همان چیزی است که برنامه میخواهد، حذف آرگومان ایرادی ندارد. اما وقتی حساسیت به حروف، بازه زمانی، قالب خروجی یا دکمه پیشفرض بر درستی نتیجه اثر میگذارد، انتخاب را صریح کنید تا کد به حافظه برنامهنویس درباره پیشفرضهای VBA وابسته نباشد.
مثالها
دریافت عنوان برای شیت
Option Explicit
Sub AskForTitle()
Dim reportTitle As String
reportTitle = InputBox("Enter the report title:", "Report Title", "Monthly Report")
If Len(reportTitle) = 0 Then Exit Sub
Range("A1").Value = reportTitle
End Subمتن را دریافت میکند، در صورت خروجی خالی پایان مییابد و مقدار پذیرفتهشده را در A1 مینویسد.
اعتبارسنجی ورودی عددی
Option Explicit
Sub AskForThreshold()
Dim rawValue As String
Dim threshold As Double
rawValue = InputBox("Enter a positive threshold:", "Threshold")
If Len(rawValue) = 0 Then Exit Sub
If Not IsNumeric(rawValue) Then
MsgBox "Please enter a number.", vbExclamation
Exit Sub
End If
threshold = CDbl(rawValue)
If threshold <= 0 Then
MsgBox "The threshold must be greater than zero.", vbExclamation
Exit Sub
End If
Range("B1").Value = threshold
End Subخروجی InputBox را ابتدا متن در نظر میگیرد، اعتبارسنجی میکند و سپس تبدیل عددی انجام میدهد.
استفاده از مقدار پیشفرض
Option Explicit
Sub AskForRegion()
Dim regionName As String
regionName = InputBox("Enter the sales region:", "Region", "North")
If regionName <> vbNullString Then
Range("C1").Value = Trim$(regionName)
End If
End Subیک مقدار پیشفرض مناسب پیشنهاد میدهد و قبل از استفاده فاصلههای ابتدا و انتهای ورودی را حذف میکند.
مثالهای کاربردی VBA
برای استفاده عملی از InputBox بهتر است آن را داخل یک روال کوچک با مرز روشن ورودی و خروجی قرار دهید. الگوی بعدی مقدار را از Workbook میخواند، حداقل بررسیهای لازم را انجام میدهد و قبل از نوشتن نتیجه در شیت آن را در متغیر نگه میدارد. در پروژه واقعی این ساختار از یک عبارت فشرده تکخطی قابل توسعهتر است، چون میتوانید گزارش خطا، پیام کاربر یا قانون کسبوکار دیگری را بدون بازنویسی کل منطق اضافه کنید.
Option Explicit
Sub ReferencePattern()
Dim sourceValue As Variant
Dim resultText As String
sourceValue = Range("A2").Value
If IsError(sourceValue) Then
MsgBox "Cell A2 contains a worksheet error.", vbExclamation
Exit Sub
End If
resultText = CStr(sourceValue)
Range("B2").Value = resultText
End Sub
این الگوی عمومی جای مثالهای مخصوص تابع را نمیگیرد؛ بلکه ساختار اطراف فراخوانی را نشان میدهد. اعتبارسنجی را قبل از تبدیل انجام دهید، تبدیل نوع را آگاهانه بنویسید و نوشتن در شیت را زمانی انجام دهید که از قابل استفاده بودن نتیجه مطمئن هستید. اگر عملیات به علت قابل پیشبینی ممکن است شکست بخورد، همان علت را مدیریت کنید و همه خطاها را بدون بررسی سرکوب نکنید.
توضیح کد
Option Explicit اعلان متغیرها را اجباری میکند و جلوی ساختهشدن ناخواسته Variant جدید در اثر غلط تایپی را میگیرد. در مثالها از نامهایی مانند sourceText، reportDate یا answer استفاده شده تا نقش هر مقدار روشن باشد. در توابع رشتهای، هر جا نسخه دارای علامت دلار مناسب باشد و احتمال Null وجود نداشته باشد، آن شکل خروجی String مستقیم میدهد.
همچنین ورودی شیت خودکار معتبر فرض نشده است. سلول میتواند خالی، دارای قالب غیرمنتظره یا حاوی مقداری باشد که با فرض زمان طراحی ماکرو هماهنگ نیست. یک کد Reference خوب قبل از فراخوانی تابع چند بررسی کمهزینه انجام میدهد و مسیر شکست را برای کاربر یا برنامهنویس قابل فهم نگه میدارد.
خطاهای رایج
| مشکل | چرا مهم است |
|---|---|
| معتبر فرضکردن هر ورودی | InputBox متن برمیگرداند؛ نوع، محدوده و قالب ورودی باید پیش از استفاده بررسی شود. |
| اشتباهگرفتن Cancel با ورودی خالی | هر دو میتوانند رشته خالی بدهند؛ اگر تفکیک آنها مهم است از UserForm استفاده کنید. |
| استفاده برای فرم پیچیده | InputBox برای یک مقدار کوتاه مناسب است، نه ورود اطلاعات چندفیلدی. |
بیشتر اشتباهها در توابع داخلی خطای Syntax نیستند؛ خطای فرض هستند. ممکن است جداکننده وجود نداشته باشد، طول متن ثابت نباشد، تاریخ متنی مبهم باشد، رشته مختلط بهاشتباه عدد معتبر تصور شود یا برنامهنویس فراموش کند تابع یک مقدار جدید برمیگرداند و منبع را تغییر نمیدهد. آزمودن دادههای واقعی Workbook سریعترین راه برای کشف این دسته مشکلات است.
بهترین روشها
| روش | پیشنهاد |
|---|---|
| اعتبارسنجی ورودی خارجی | مقادیر کاربر، شیت، فایل و داده واردشده را پیش از تبدیل یا indexing بررسی کنید. |
| نوع داده صریح | موقعیت را Long، متن را String، تاریخ را Date و آزمون منطقی را Boolean نگه دارید. |
| ثابتهای نامدار | اگر تابع ثابت VBA دارد، از نام ثابت بهجای عدد خام استفاده کنید. |
| تفکیک مقدار از نمایش | رشته قالببندیشده را با مقدار عددی یا Date مورد استفاده در محاسبه یکی ندانید. |
| آزمون مرزها | حالت خالی، حداقل، حداکثر، نبود جداکننده، قالب نامعتبر و مسائل locale را متناسب با تابع آزمایش کنید. |
رفتار InputBox با مقادیر Excel VBA
در Excel VBA دادههای سلولها اغلب بهصورت Variant وارد کد میشوند. مقدار Range.Value ممکن است متن، Double، Date، Empty، Boolean یا حتی خطای شیت باشد. این انعطاف مفید است، اما در یک کد مرجع باید فرضها روشن باشند. پیش از استفاده از InputBox مشخص کنید روال شما همه مقادیر قابل تبدیل را میپذیرد یا فقط یک نوع ورودی مشخص را معتبر میداند. اگر فایل در اختیار کاربران دیگر است، این تصمیم بخشی از رابط ماکرو محسوب میشود.
الگوی مناسب این است که دریافت داده، اعتبارسنجی، تبدیل و خروجی را از هم جدا کنید. ابتدا مقدار سلول یا پاسخ کاربر را در متغیر بگیرید. سپس قواعد لازم را بررسی کنید. بعد InputBox را فراخوانی و نتیجه را در متغیری با نام معنادار ذخیره کنید. در پایان خروجی را روی شیت بنویسید یا در تصمیمگیری بهکار ببرید. این ساختار اشکالزدایی را سادهتر میکند، زیرا هر مرحله را میتوان با breakpoint یا پنجره Immediate جداگانه بررسی کرد.
انتخاب نوع داده مناسب برای نتیجه قابل اعتماد
برای تبدیلهای متنی از String، برای موقعیت و شمارش کاراکترها از Long، برای محاسبات عددی بسته به دقت از Double یا Currency، برای محاسبات تاریخ و زمان از Date و برای آزمونهای منطقی از Boolean استفاده کنید. اینکه VBA اجازه Variant میدهد دلیل خوبی برای Variant بودن همه متغیرها نیست. نوع صریح، قصد کد را مستند و خطاهای نوع را زودتر آشکار میکند.
هنگام تبدیل نوع، «مقدار» را از «نمایش» جدا نگه دارید. رشتهای که شبیه تاریخ دیده میشود الزاماً Date نیست و متن ظاهراً عددی نیز همیشه ورودی عددی امنی نیست. توابعی مانند CStr، CDbl، CDate، IsNumeric و IsDate کمک میکنند مرز تبدیل روشن باشد. اینکه کدام بررسی لازم است به منبع داده و انتظار بخش بعدی برنامه بستگی دارد.
کارایی و نگهداری کد
برای یک سلول یا ورودی کاربر، هزینه اجرای InputBox ناچیز است. گلوگاههای واقعی معمولاً از خواندن و نوشتن تکتک سلولها در حلقههای بزرگ به وجود میآیند. اگر هزاران ردیف دارید، Range را یکباره در آرایه بخوانید، مقادیر را در حافظه پردازش کنید و خروجی را یکجا به شیت برگردانید. به این ترتیب هم سرعت مناسب میماند و هم مزیت خوانایی تابع داخلی حفظ میشود.
برای نگهداری بهتر از اعداد جادویی و عبارتهای مبهم دوری کنید. مقادیر میانی را نامگذاری کنید، در مقایسههای رشتهای نوع compare را در صورت اهمیت صریح بنویسید و کدهای interval یا رشتههای قالب را با توضیح کوتاه همراه کنید. برنامهنویس بعدی باید علاوه بر اینکه بداند فراخوانی InputBox چه میکند، دلیل درستبودن آرگومانهای انتخابشده را نیز بفهمد.
موضوعات مرتبط
InputBox معمولاً در کنار موضوعات دیگر مرجع VBA بهکار میرود. برای اعلان متغیر و نوعدهی قابل پیشبینی، مطالب موجود دستور Dim و Option Explicit مرتبط هستند. برای مقایسه الگویی متن، مقاله موجود عملگر Like مفید است. همچنین مدخلهای برنامهریزیشده توابع داخلی مانند Len، InStr، Replace، Split و توابع تاریخ را میتوان با InputBox ترکیب کرد و روالهای کاملتر ساخت.
سؤالات متداول درباره InputBox
تابع InputBox در VBA چه کاری انجام میدهد؟
تابع InputBox در VBA از کاربر یک ورودی متنی کوتاه میگیرد و رشته واردشده را به روال VBA برمیگرداند. این تابع زمانی مفید است که بخواهید یک کار مشخص و تکرارشونده را بدون نوشتن منطق اضافی انجام دهید. برای استفاده مطمئن، نوع ورودی، مقدار بازگشتی و رفتار تابع در ورودیهای مرزی را بشناسید. اگر داده از کاربر، فایل یا سلول میآید، اعتبارسنجی پیش از فراخوانی میتواند از خطا یا نتیجه گمراهکننده جلوگیری کند.
ساختار تابع InputBox در VBA چیست؟
ساختار اصلی به شکل InputBox(prompt, [title], [default], [xpos], [ypos], [helpfile], [context]) است. آرگومانهای اجباری مقدار یا متن اصلی را مشخص میکنند و آرگومانهای اختیاری رفتار تابع را دقیقتر کنترل میکنند. در کدهای قابل نگهداری بهتر است ثابتهای نامدار VBA را بهجای اعداد خام بهکار ببرید و وقتی نتیجه برای تصمیمگیری لازم است آن را در متغیری با نوع روشن ذخیره کنید.
آیا میتوان InputBox را مستقیم روی سلول اکسل بهکار برد؟
بله، اما مقدار Range.Value از نوع Variant است و ممکن است متن، عدد، تاریخ، Empty یا حتی مقدار خطای شیت باشد. اگر InputBox نوع مشخصی انتظار دارد، پیش از استفاده مقدار را بررسی یا تبدیل کنید. این کار باعث میشود ماکرو با دادههای واقعی کاربران پایدارتر باشد و خطاهایی که فقط در شرایط خاص رخ میدهند زودتر کنترل شوند.
بهترین روش مدیریت خطا هنگام استفاده از InputBox چیست؟
فرضهای مهم را پیش از فراخوانی بررسی کنید: متن اجباری خالی نباشد، ورودی عددی قبل از تبدیل اعتبارسنجی شود، تاریخ متنی با IsDate کنترل شود و موقعیت یا طول محاسبهشده در محدوده معتبر بماند. بهجای اتکای گسترده به On Error Resume Next، شرطهای صریح بنویسید و در صورت خطا پیام روشن یا خروج کنترلشده داشته باشید.
آیا استفاده از نسخهای مانند InputBox$ بهتر است؟
برای بعضی توابع رشتهای VBA نسخه دارای علامت دلار خروجی String مستقیم میدهد، در حالی که نسخه بدون دلار میتواند Variant حاوی String برگرداند. این شکل گاهی قصد کد را روشنتر میکند. با این حال، اگر احتمال Null وجود دارد باید احتیاط کنید، زیرا نسخه String مستقیم ممکن است در جایی که نسخه Variant مقدار Null را عبور میدهد خطا ایجاد کند.
برای آزمودن کدی که از InputBox استفاده میکند چه ورودیهایی لازم است؟
حداقل یک مقدار عادی، یک مقدار خالی، یک حالت مرزی و یک ورودی نامعتبر یا غیرمنتظره را آزمایش کنید. دادههای کپیشده از سامانههای دیگر نیز مهماند، چون فاصلههای اضافی، قالب منطقهای، تفاوت حروف و کاراکترهای پنهان میتوانند نتیجه را تغییر دهند. یک جدول کوچک از ورودی و خروجی مورد انتظار اغلب برای کشف فرضهای پنهان کافی است.
جمعبندی
تابع InputBox در VBA زمانی بهترین نتیجه را میدهد که Syntax کوتاه آن با فرضهای روشن همراه باشد. معنی آرگومانها و خروجی را بدانید، ورودی کاربر یا Workbook را اعتبارسنجی کنید و حالتهای مرزی متناسب با داده واقعی را آزمایش کنید. مثالهای این مرجع در Excel VBA Editor قابل اجرا هستند و میتوانید با تغییر Range، ثابتها یا قانون کسبوکار آنها را برای پروژه خود تطبیق دهید، بدون اینکه ساختار اعتبارسنجی قبل از عملیات را از دست بدهید.
بیشتر بخوانید
تابع Format در VBA | ساختار، پارامترها، مثالها و مرجع
تابع DateDiff در VBA | ساختار، پارامترها، مثالها و مرجع
تابع DateAdd در VBA | ساختار، پارامترها، مثالها و مرجع
تابع CDate در VBA | ساختار، پارامترها، مثالها و مرجع
دستور Static | اعلان متغیر استاتیک درون روال در ویژوال بیسیک
دستور Option Explicit | نحوه اعلان متغیرها در ویژوال بیسیک
انواع داده در VBA (با جدول محدوده مقادیر و پیشوند نامگذاری متغیرها)