هنگام نوشتن یک ماکرو، می توانید با استفاده از روش WorksheetFunction برای اعمال تابع کاربرگ MIN، کمترین مقدار را در محدوده سلولی پیدا کنید. با این حال، ممکن است نیاز داشته باشید که نه تنها کمترین مقدار را در محدوده، بلکه آدرس اولین سلولی را که حاوی آن مقدار است نیز بیابید.
یک راه ساده این است که به سادگی از محدوده ای که می خواهید بررسی کنید عبور کنید و هم کمترین مقدار و هم آدرس سلول مورد بررسی را استخراج کنید، مانند شکل زیر:
Function FindLowestAddr(pRng As Range) As String
Dim MinVal As Double
Dim MinAddr As String
Dim c As Range
MinVal = pRng.Cells(1).Value
MinAddr = pRng.Cells(1).Address
For Each c in pRng
If c.Value < MinVal Then
MinVal = c.Value
MinAddr = c.Address
End If
Next c
FindLowestAddr = MinAddr
End Function
توجه داشته باشید که این رویکرد به هیچ وجه به تابع کاربرگ MIN متکی نیست. با این حال، یک اشکال در آن وجود دارد - بین سلول هایی که دارای مقادیر عددی هستند و سلول هایی که فاقد مقادیر عددی هستند، تفاوتی قائل نمی شود. به عبارت دیگر، اگر محدوده ارسال شده به تابع حاوی یک سلول خالی باشد، آن سلول حاوی یک مقدار صفر در نظر گرفته می شود که ممکن است به خوبی کمترین مقدار در محدوده باشد.
یکی از راه های حل این مشکل، تکیه بر توابع کاربرگ از داخل ماکرو است. ماکرو زیر از هر دو تابع کاربرگ MIN و MATCH برای تعیین مکان حداقل مقدار و سپس شاخص (offset) آن سلول در محدوده استفاده می کند.
Function GetAddr(rng As Range) As String
Dim dMin As Double
Dim lIndex As Long
Dim sAddress As String
With Application.WorksheetFunction
dMin = .Min(rng)
lIndex = .Match(dMin, rng, 0)
End With
GetAddr = rng.Cells(lIndex).Address
End Function
لازم به ذکر است که اگر از ماکرو فقط برای کشف آدرس استفاده می کنید زیرا فکر می کنید هیچ راهی برای استخراج اطلاعات مورد نظر بدون ماکرو وجود ندارد، می توانید با استفاده از فرمول کاربرگ به طور کامل ماکرو را از بین ببرید. به عنوان مثال، اگر می خواهید آدرس سلول با کمترین مقدار را در محدوده نامگذاری شده MyRange تعیین کنید، می توانید از موارد زیر استفاده کنید:
=ADDRESS(ROW(MyRange)+MATCH(MIN(MyRange),MyRange,0)-1,COLUMN(MyRange))