پرش به محتوای اصلی

تابع InStr در VBA | ساختار، پارامترها، مثال‌ها و مرجع

تابع InStr در VBA: ساختار، پارامترها، مثال‌ها و مرجع

تابع InStr در VBA یک رشته را داخل رشته دیگر جست‌وجو می‌کند و موقعیت اولین تطابق را برمی‌گرداند. در این مرجع روی چیزهایی تمرکز می‌کنیم که هنگام نوشتن ماکروهای واقعی Excel VBA لازم دارید: شکل دقیق فراخوانی، معنی هر آرگومان، نوع مقدار بازگشتی و شرط‌هایی که بهتر است پیش از استفاده از نتیجه بررسی شوند. مثال‌ها به‌اندازه‌ای کوتاه هستند که بتوان آن‌ها را در یک Standard Module اجرا کرد، اما الگوی کدنویسی آن‌ها برای پروژه‌های بزرگ‌تر نیز قابل استفاده است.

توابع داخلی VBA کارهای رایج را با کدی کوتاه و قابل تشخیص بیان می‌کنند. کوتاه‌بودن به‌تنهایی به معنی کد خوب نیست؛ یک فراخوانی مطمئن باید نوع ورودی را روشن کند، حالت‌های مرزی را در نظر بگیرد و از تبدیل‌های پنهانی که ممکن است با داده یا تنظیمات منطقه‌ای تغییر کنند دوری کند. این صفحه به سبک Reference نوشته شده تا هم برای یادگیری و هم برای مراجعه سریع هنگام رفع خطا مناسب باشد.

تصویر بدون متن از صفحه‌گسترده و کد برای نمایش مفهوم تابع InStr در VBA
Did you know:

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

InStr چیست؟

در VBA، InStr یک رشته را داخل رشته دیگر جست‌وجو می‌کند و موقعیت اولین تطابق را برمی‌گرداند. این قابلیت بخشی از خود زبان VBA است و در ماژول‌های معمول Excel VBA بدون افزودن Reference کتابخانه خارجی قابل استفاده است. بهترین نتیجه زمانی به دست می‌آید که پیش از فراخوانی، ورودی به‌اندازه کافی مطابق نیاز عملیات اعتبارسنجی شده باشد.

رفتار خروجی نیز مهم است: یک Long؛ اگر تطابق پیدا نشود 0 و در غیر این صورت موقعیت یک‌مبنایی اولین تطابق را برمی‌گرداند. اگر نتیجه در ادامه کد برای تصمیم‌گیری یا محاسبه لازم است آن را در متغیر مناسب ذخیره کنید. اگر چند تبدیل پشت‌سرهم انجام می‌شود، متغیرهای میانی معمولاً اشکال‌زدایی و مدیریت خطا را ساده‌تر می‌کنند.

چرا InStr مهم است؟

InStr بخشی از کدی را که در غیر این صورت به حلقه، parsing دستی، تبدیل نوع یا منطق رابط کاربری نیاز دارد کوتاه می‌کند. استفاده از تابع داخلی برای برنامه‌نویس VBA آشناست و قصد کد را سریع منتقل می‌کند؛ از نام تابع می‌توان فهمید عملیات مربوط به جست‌وجو، استخراج رشته، تبدیل، تاریخ یا تعامل با کاربر است.

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

ساختار

جزءمرجع
SyntaxInStr([start], string1, string2, [compare])
مقدار بازگشتییک Long؛ اگر تطابق پیدا نشود 0 و در غیر این صورت موقعیت یک‌مبنایی اولین تطابق را برمی‌گرداند.

پارامترها و اجزا

پارامترتوضیح
startموقعیت اختیاری و یک‌مبنایی شروع جست‌وجو.
string1رشته اجباری که در آن جست‌وجو انجام می‌شود.
string2زیررشته اجباری مورد جست‌وجو.
compareحالت اختیاری مقایسه مانند vbBinaryCompare یا vbTextCompare.

آرگومان‌های اختیاری را زمانی وارد کنید که رفتار موردنظر را روشن‌تر می‌کنند. اگر مقدار پیش‌فرض دقیقاً همان چیزی است که برنامه می‌خواهد، حذف آرگومان ایرادی ندارد. اما وقتی حساسیت به حروف، بازه زمانی، قالب خروجی یا دکمه پیش‌فرض بر درستی نتیجه اثر می‌گذارد، انتخاب را صریح کنید تا کد به حافظه برنامه‌نویس درباره پیش‌فرض‌های VBA وابسته نباشد.

مثال‌ها

یافتن جداکننده

Option Explicit

Sub FindColon()
    Dim sourceText As String
    Dim pos As Long
    sourceText = "Status:Closed"
    pos = InStr(1, sourceText, ":", vbBinaryCompare)
    If pos > 0 Then Range("A1").Value = pos
End Sub

وجود جداکننده را بررسی می‌کند و فقط در صورت یافتن، موقعیت آن را ثبت می‌کند.

جست‌وجوی غیرحساس به حروف

Option Explicit

Sub FindWord()
    Dim noteText As String
    noteText = "Payment RECEIVED today"
    If InStr(1, noteText, "received", vbTextCompare) > 0 Then
        Range("B1").Value = "Matched"
    End If
End Sub

با vbTextCompare تفاوت حروف بزرگ و کوچک را نادیده می‌گیرد.

استخراج مقدار پس از برچسب

Option Explicit

Sub ExtractValue()
    Dim sourceText As String
    Dim separatorPos As Long
    sourceText = "Region=North"
    separatorPos = InStr(1, sourceText, "=", vbBinaryCompare)
    If separatorPos > 0 Then Range("A1").Value = Mid$(sourceText, separatorPos + 1)
End Sub

موقعیت بازگشتی را به‌عنوان ورودی Mid$ استفاده می‌کند.

مثال‌های کاربردی VBA

برای استفاده عملی از InStr بهتر است آن را داخل یک روال کوچک با مرز روشن ورودی و خروجی قرار دهید. الگوی بعدی مقدار را از 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 خوب قبل از فراخوانی تابع چند بررسی کم‌هزینه انجام می‌دهد و مسیر شکست را برای کاربر یا برنامه‌نویس قابل فهم نگه می‌دارد.

خطاهای رایج

مشکلچرا مهم است
فراموش‌کردن نتیجه صفرپیش از استفاده موقعیت در تابع دیگر، حتماً بزرگ‌تر بودن آن از صفر را بررسی کنید.
ابهام در حساسیت به حروفوقتی حساسیت به بزرگی و کوچکی مهم است compare را صریح تعیین کنید.
شروع جست‌وجوی نادرستstart محاسبه‌شده ممکن است تطابق‌های قبلی را رد کند؛ دلیل شروع غیرپیش‌فرض را روشن نگه دارید.

بیشتر اشتباه‌ها در توابع داخلی خطای Syntax نیستند؛ خطای فرض هستند. ممکن است جداکننده وجود نداشته باشد، طول متن ثابت نباشد، تاریخ متنی مبهم باشد، رشته مختلط به‌اشتباه عدد معتبر تصور شود یا برنامه‌نویس فراموش کند تابع یک مقدار جدید برمی‌گرداند و منبع را تغییر نمی‌دهد. آزمودن داده‌های واقعی Workbook سریع‌ترین راه برای کشف این دسته مشکلات است.

بهترین روش‌ها

روشپیشنهاد
اعتبارسنجی ورودی خارجیمقادیر کاربر، شیت، فایل و داده واردشده را پیش از تبدیل یا indexing بررسی کنید.
نوع داده صریحموقعیت را Long، متن را String، تاریخ را Date و آزمون منطقی را Boolean نگه دارید.
ثابت‌های نام‌داراگر تابع ثابت VBA دارد، از نام ثابت به‌جای عدد خام استفاده کنید.
تفکیک مقدار از نمایشرشته قالب‌بندی‌شده را با مقدار عددی یا Date مورد استفاده در محاسبه یکی ندانید.
آزمون مرزهاحالت خالی، حداقل، حداکثر، نبود جداکننده، قالب نامعتبر و مسائل locale را متناسب با تابع آزمایش کنید.

رفتار InStr با مقادیر Excel VBA

در Excel VBA داده‌های سلول‌ها اغلب به‌صورت Variant وارد کد می‌شوند. مقدار Range.Value ممکن است متن، Double، Date، Empty، Boolean یا حتی خطای شیت باشد. این انعطاف مفید است، اما در یک کد مرجع باید فرض‌ها روشن باشند. پیش از استفاده از InStr مشخص کنید روال شما همه مقادیر قابل تبدیل را می‌پذیرد یا فقط یک نوع ورودی مشخص را معتبر می‌داند. اگر فایل در اختیار کاربران دیگر است، این تصمیم بخشی از رابط ماکرو محسوب می‌شود.

الگوی مناسب این است که دریافت داده، اعتبارسنجی، تبدیل و خروجی را از هم جدا کنید. ابتدا مقدار سلول یا پاسخ کاربر را در متغیر بگیرید. سپس قواعد لازم را بررسی کنید. بعد InStr را فراخوانی و نتیجه را در متغیری با نام معنادار ذخیره کنید. در پایان خروجی را روی شیت بنویسید یا در تصمیم‌گیری به‌کار ببرید. این ساختار اشکال‌زدایی را ساده‌تر می‌کند، زیرا هر مرحله را می‌توان با breakpoint یا پنجره Immediate جداگانه بررسی کرد.

انتخاب نوع داده مناسب برای نتیجه قابل اعتماد

برای تبدیل‌های متنی از String، برای موقعیت و شمارش کاراکترها از Long، برای محاسبات عددی بسته به دقت از Double یا Currency، برای محاسبات تاریخ و زمان از Date و برای آزمون‌های منطقی از Boolean استفاده کنید. اینکه VBA اجازه Variant می‌دهد دلیل خوبی برای Variant بودن همه متغیرها نیست. نوع صریح، قصد کد را مستند و خطاهای نوع را زودتر آشکار می‌کند.

هنگام تبدیل نوع، «مقدار» را از «نمایش» جدا نگه دارید. رشته‌ای که شبیه تاریخ دیده می‌شود الزاماً Date نیست و متن ظاهراً عددی نیز همیشه ورودی عددی امنی نیست. توابعی مانند CStr، CDbl، CDate، IsNumeric و IsDate کمک می‌کنند مرز تبدیل روشن باشد. اینکه کدام بررسی لازم است به منبع داده و انتظار بخش بعدی برنامه بستگی دارد.

کارایی و نگهداری کد

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

برای نگهداری بهتر از اعداد جادویی و عبارت‌های مبهم دوری کنید. مقادیر میانی را نام‌گذاری کنید، در مقایسه‌های رشته‌ای نوع compare را در صورت اهمیت صریح بنویسید و کدهای interval یا رشته‌های قالب را با توضیح کوتاه همراه کنید. برنامه‌نویس بعدی باید علاوه بر اینکه بداند فراخوانی InStr چه می‌کند، دلیل درست‌بودن آرگومان‌های انتخاب‌شده را نیز بفهمد.

موضوعات مرتبط

InStr معمولاً در کنار موضوعات دیگر مرجع VBA به‌کار می‌رود. برای اعلان متغیر و نوع‌دهی قابل پیش‌بینی، مطالب موجود دستور Dim و Option Explicit مرتبط هستند. برای مقایسه الگویی متن، مقاله موجود عملگر Like مفید است. همچنین مدخل‌های برنامه‌ریزی‌شده توابع داخلی مانند Len، InStr، Replace، Split و توابع تاریخ را می‌توان با InStr ترکیب کرد و روال‌های کامل‌تر ساخت.

سؤالات متداول درباره InStr

تابع InStr در VBA چه کاری انجام می‌دهد؟

تابع InStr در VBA یک رشته را داخل رشته دیگر جست‌وجو می‌کند و موقعیت اولین تطابق را برمی‌گرداند. این تابع زمانی مفید است که بخواهید یک کار مشخص و تکرارشونده را بدون نوشتن منطق اضافی انجام دهید. برای استفاده مطمئن، نوع ورودی، مقدار بازگشتی و رفتار تابع در ورودی‌های مرزی را بشناسید. اگر داده از کاربر، فایل یا سلول می‌آید، اعتبارسنجی پیش از فراخوانی می‌تواند از خطا یا نتیجه گمراه‌کننده جلوگیری کند.

ساختار تابع InStr در VBA چیست؟

ساختار اصلی به شکل InStr([start], string1, string2, [compare]) است. آرگومان‌های اجباری مقدار یا متن اصلی را مشخص می‌کنند و آرگومان‌های اختیاری رفتار تابع را دقیق‌تر کنترل می‌کنند. در کدهای قابل نگهداری بهتر است ثابت‌های نام‌دار VBA را به‌جای اعداد خام به‌کار ببرید و وقتی نتیجه برای تصمیم‌گیری لازم است آن را در متغیری با نوع روشن ذخیره کنید.

آیا می‌توان InStr را مستقیم روی سلول اکسل به‌کار برد؟

بله، اما مقدار Range.Value از نوع Variant است و ممکن است متن، عدد، تاریخ، Empty یا حتی مقدار خطای شیت باشد. اگر InStr نوع مشخصی انتظار دارد، پیش از استفاده مقدار را بررسی یا تبدیل کنید. این کار باعث می‌شود ماکرو با داده‌های واقعی کاربران پایدارتر باشد و خطاهایی که فقط در شرایط خاص رخ می‌دهند زودتر کنترل شوند.

بهترین روش مدیریت خطا هنگام استفاده از InStr چیست؟

فرض‌های مهم را پیش از فراخوانی بررسی کنید: متن اجباری خالی نباشد، ورودی عددی قبل از تبدیل اعتبارسنجی شود، تاریخ متنی با IsDate کنترل شود و موقعیت یا طول محاسبه‌شده در محدوده معتبر بماند. به‌جای اتکای گسترده به On Error Resume Next، شرط‌های صریح بنویسید و در صورت خطا پیام روشن یا خروج کنترل‌شده داشته باشید.

آیا استفاده از نسخه‌ای مانند InStr$ بهتر است؟

برای بعضی توابع رشته‌ای VBA نسخه دارای علامت دلار خروجی String مستقیم می‌دهد، در حالی که نسخه بدون دلار می‌تواند Variant حاوی String برگرداند. این شکل گاهی قصد کد را روشن‌تر می‌کند. با این حال، اگر احتمال Null وجود دارد باید احتیاط کنید، زیرا نسخه String مستقیم ممکن است در جایی که نسخه Variant مقدار Null را عبور می‌دهد خطا ایجاد کند.

برای آزمودن کدی که از InStr استفاده می‌کند چه ورودی‌هایی لازم است؟

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

جمع‌بندی

تابع InStr در VBA زمانی بهترین نتیجه را می‌دهد که Syntax کوتاه آن با فرض‌های روشن همراه باشد. معنی آرگومان‌ها و خروجی را بدانید، ورودی کاربر یا Workbook را اعتبارسنجی کنید و حالت‌های مرزی متناسب با داده واقعی را آزمایش کنید. مثال‌های این مرجع در Excel VBA Editor قابل اجرا هستند و می‌توانید با تغییر Range، ثابت‌ها یا قانون کسب‌وکار آن‌ها را برای پروژه خود تطبیق دهید، بدون اینکه ساختار اعتبارسنجی قبل از عملیات را از دست بدهید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تأیید امنیتی هنگام تعامل با فرم بارگذاری می‌شود.