در یک کلان، رابرت مایل است محدوده یک نام تعریف شده را دریابد. برای مثال، او می خواهد فهرستی از تمام نام های تعریف شده ایجاد کند که در محدوده «ورک بوک» نیستند. او فکر می کند که آیا راهی برای انجام این کار به صورت برنامه ای وجود دارد؟
بله وجود دارد. نام های تعریف شده در ویژگی .Name شی Name ذخیره می شوند. (تقریباً زائد به نظر می رسد، درست است؟) اگر نام دارای محدوده یک کاربرگ واحد باشد، نام کاربرگ در ویژگی .Name قرار می گیرد. به عنوان مثال، ماکرو ساده زیر را در نظر بگیرید:
Sub ListNames()
Dim n As Name
Dim sTemp As String
For Each n In Names
sTemp = sTemp & "Name: " & n.Name & vbCr
Next n
MsgBox sTemp
End Sub
اگر چیزی که نمایش داده می شود، نام چیزی مانند «پاداش» یا «کارمندان» را نشان می دهد، آن گاه این نام شامل کل ورک بوک است. اگر نام، به جای آن، چیزی شبیه به "Sheet1!Bonus" یا "Sheet7!Employees" باشد، در این صورت نام دارای محدوده ای محدود به کاربرگ موجود در نام است.
این بدان معنی است که شما می توانید با کمی تغییر در ماکرو، تمام نام های تعریف شده را پیدا کنید که از نظر وسعت "Workbook" نیستند (همانطور که رابرت می خواست):
Sub ListNames2()
Dim n As Name
Dim sTemp As String
For Each n In Names
If Instr(n.Name, "!") > 0 Then
sTemp = sTemp & "Name: " & n.Name & vbCr
End If
Next n
MsgBox sTemp
End Sub
مثال های ارائه شده تا کنون به گام برداشتن در مجموعه نام ها متکی هستند که به طور پیش فرض مجموعه ای برای کل ورک بوک است. با این حال، هر کاربرگ مجموعه نام های مخصوص به خود را دارد، به این معنی که می توانید از میان کاربرگ ها برای تعیین نام ها عبور کنید:
Sub ListNames3()
Dim n As Name
Dim s As Worksheet
Dim sTemp As String
For Each s In Worksheets
If s.Names.Count > 0 Then
sTemp = sTemp & "Worksheet: " & s.Name & vbCr
For Each n In s.Names
sTemp = sTemp & " Name: " & n.Name & vbCr
Next n
End If
Next s
MsgBox sTemp
End Sub
وقتی به این روش از کاربرگ ها عبور می کنید، فقط نام هایی با محدوده سطح کاربرگ گنجانده می شوند. نام ها همچنان شامل نام کاربرگ درون خود هستند، اما نام هایی با محدوده سطح ورک بوک قابل مشاهده نیستند.
هنگامی که متوجه شدید که فقط نام ها در محدوده سطح کاربرگ دارای علامت تعجب هستند، می توانید آنها را به روش های دیگری پردازش کنید. به عنوان مثال، می توانید نام را به یک متغیر اختصاص دهید و همه چیز را از طریق علامت تعجب حذف کنید تا نام بدون نام کاربرگ به دست آید. و جالب اینجاست که می توانید با حذف نام کاربرگ، ویژگی .Name را از worksheet-scope به workbook-scope تغییر دهید.