لاورنس به راهی برای تعیین تعداد کاربرگ نیاز دارد حتی اگر کاربرگ تغییر نام داده باشد. برای مثال، اگر برگه ای Sheet11 نامیده شود، به اندازه کافی آسان است که بفهمید برگه 11 است. اگر برگه را به ژانویه تغییر نام دهد، لارنس هنوز به راهی نیاز دارد که بداند این برگه 11 است.
راه حل این مشکل به بهترین وجه با یک تابع تعریف شده توسط کاربر (یک ماکرو) انجام می شود. در واقع، دو عدد وجود دارد که ماکرو می تواند برای هر کاربرگ بازگرداند. اولی شماره شاخص برای کاربرگ است. این عدد نمایانگر شیء کاربرگ برگه در مجموعه Worksheets است. این مقدار را می توان با یک ماکرو مشابه زیر برگرداند:
Function SheetNumber1(shtname As String)
Dim sht As Worksheet
Application.Volatile
For Each sht In ThisWorkbook.Worksheets
If LCase(sht.Name) = LCase(shtname) Then
SheetNumber1 = sht.Index
Exit Function
End If
Next
SheetNumber1 = -1
End Function
این تابع، هنگامی که در یک کاربرگ استفاده می شود، شماره فهرست هر کاربرگ را که نام آن به تابع ارسال شده است، برمی گرداند. اگر نامی که به تابع ارسال می شود در مجموعه کاربرگ ها وجود نداشته باشد، مقدار -1 توسط تابع برمی گردد. به عنوان مثال، موارد زیر که در یک سلول استفاده می شود، مقدار شاخص را برای کاربرگ به نام "ژانویه" در مجموعه برمی گرداند:
=SheetNumber("January")
مشکل این رویکرد این است که ترتیب اشیاء Worksheet در مجموعه Worksheets می تواند در طول زمان تغییر کند. بنابراین، شما همیشه نمی توانید فرض کنید که یازدهمین برگه در مجموعه، برگه ای است که در ابتدا Sheet11 بود.
یک راه سازگارتر برای تعیین نام اصلی یک کاربرگ (صرف نظر از نحوه تغییر نام آن) استفاده از چیزی است که ویژوال بیسیک از آن به عنوان برگه های "CodeName" یاد می کند. این یکی از ویژگی های کاربرگ است و به روش زیر قابل تعیین است:
Function SheetNumber2(shtname As String)
Dim sht As Worksheet
Dim sTemp As String
Application.Volatile
For Each sht In ThisWorkbook.Worksheets
If LCase(sht.Name) = LCase(shtname) Then
sTemp = sht.CodeName
SheetNumber2 = Val(Mid(sTemp, 6, 4))
Exit Function
End If
Next
SheetNumber2 = -1
End Function
ویژگی CodeName در ماکرو فقط خواندنی است. در زمان ایجاد کاربرگ اختصاص داده می شود، اما امکان تغییر دستی آن در ویرایشگر ویژوال بیسیک وجود دارد. CodeName همیشه یک رشته است که نشان دهنده اولین نامی است که روی کاربرگ اعمال می شود، بنابراین چیزی شبیه به "Sheet11" خواهد بود. هنگامی که CodeName تنظیم شد، حتی اگر کاربرگ تغییر نام داد (مانند "ژانویه")، ثابت می ماند ("Sheet11").
در مثال ماکرو (SheetNumber2) ویژگی CodeName به متغیر sTemp اختصاص داده شده است. این در اکثر مواقع چیزی شبیه به "Sheet3" یا "Sheet11" خواهد بود. بنابراین، ماکرو سپس مقدار عددی هر چیزی که با کاراکتر ششم شروع می شود را می گیرد (درست بعد از "Sheet"). این مقداری است که توسط تابع برگردانده می شود.