2011-12-28 21 views
10

Tôi đang cố gắng đưa ra một câu lệnh vba khá đơn giản để kiểm tra xem một dải ô được đặt tên có được sắp xếp theo sổ làm việc hay một trang tính cụ thể hay không.Xác định một cách nghiêm trọng nếu phạm vi được đặt tên được sắp xếp thành sổ làm việc


Khi kiểm tra, tôi đã tạo tài liệu Excel mới và được thêm vào 6 dải ô được đặt tên. Dưới đây là cách thức chúng được đặt ra trong Name Manager:

Name   | Refers To   | Scope 
-------------+----------------------+----------- 
rng_Local01 | =Sheet1!$A$2:$A$16 | Sheet1 
rng_Local02 | =Sheet1!$C$2:$C$16 | Sheet1 
rng_Local03 | =Sheet1!$E$2:$E$16 | Sheet1 
rng_Global01 | =Sheet1!$B$2:$B$16 | Workbook 
rng_Global02 | =Sheet1!$D$2:$D$16 | Workbook 
rng_Global03 | =Sheet1!$F$2:$F$16 | Workbook 

Tôi mong rằng chạy:

For i = 1 To ThisWorkbook.Names.Count 
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

sẽ cho kết quả trong ba Workbook dãy tên scoped phải đăng nhập, tuy nhiên, không có gì xảy ra. Không có lỗi. .Names(i).WorkbookParameter đánh giá là False trên TẤT CẢ các dải ô được đặt tên và tôi không chắc chắn lý do.


Nhìn qua các đối tượng Name trong sự giúp đỡ VBA Tôi đã xem qua ValidWorkbookParameter mà trông giống như ReadOnly em họ của WorkbookParameter, tuy nhiên sử dụng phương pháp đó không làm cho bất kỳ sự khác biệt.

Tôi cũng đã cố gắng thiết lập một cách rõ ràng ThisWorkbook.Names(i).WorkbookParameter = True, tuy nhiên điều này dẫn đến một lỗi:

"Invalid procedure call or argument"

Mặc dù thực tế rằng WorkbookParameter được liệt kê như là Đọc/Viết


bất cứ ai có thể rụng bất kỳ ánh sáng vào lý do tại sao điều này không làm việc như tôi mong đợi nó quá? Tôi đã hiểu sai cách Name.WorkbookParameter được cho là hoạt động không? Có ai có thể làm điều này để chạy thành công không?

+0

Cảm ơn các bạn giải pháp rất hữu ích ... Tôi vẫn tò mò về hành vi của thuộc tính 'WorkbookParameter' và' ValidWorkbookParameter' của đối tượng 'Name' trong VBA. Trong tâm trí của tôi, những thuộc tính đó không hoạt động * như được quảng cáo *. –

+0

Không chắc chắn chính xác những gì WorkbookParameter là nhưng nghi ngờ của nó cho Excel Services trong Sharepoint và không cho khách hàng Excel –

Trả lời

19

Bạn có thể sử dụng tài sản của phụ huynh:

Sub Global_Local_names() 
    Dim oNm As Name 
    For Each oNm In Names 
     If TypeOf oNm.Parent Is Worksheet Then 
      Debug.Print oNm.Name & " is local to " & oNm.Parent.Name 
     Else 
      Debug.Print oNm.Name & " is global to " & oNm.Parent.Name 
     End If 
    Next 
End Sub 
+0

Nice. Cảm ơn cho các tip – JMax

+0

Cảm ơn các giải pháp ... Tôi đã không nghĩ đến việc sử dụng tài sản 'Parent'.Tôi đã đánh dấu câu trả lời này là câu trả lời vì nó trả lời trực tiếp nhất cho dù phạm vi được đặt tên thuộc về sổ làm việc hay trang tính. –

3

tôi không quản lý để thực hiện các công việc WorkbookParameter nhưng tôi tìm thấy một workaround:

For i = 1 To ThisWorkbook.Names.Count 
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

Tên của địa phương Name Range (tức là phạm vi cho một trang tính) được định dạng theo cách này: Sheet1!NamedRange trong khi tên của toàn cầu Dải tên được định dạng: NamedRange.

Vì vậy, bạn có thể chia nhỏ trên ! và kiểm tra độ dài của mảng.

+0

Tôi thích giải pháp sáng tạo bằng cách sử dụng 'Tách ' –

Các vấn đề liên quan