2012-10-09 7 views
7

Để xây dựng, giả sử tôi có hai dải ô được đặt tên trong sổ làm việc của mình. Cả hai phạm vi được đặt tên có cùng tên (hãy nói "myName"), nhưng một phạm vi được sắp xếp thành Sheet1 và một phạm vi khác được sắp xếp vào Workbook.Nhận phạm vi được đặt tên theo chuỗi trong sổ làm việc Excel khi tên được nhân đôi

Đặt tên (chuỗi) của Dải ô đã đặt tên, tôi muốn lấy Phạm vi được đặt tên trong Bảng tính.

Nếu tôi sử dụng lệnh gọi gốc: wb.Names.Item("myName"), nó sẽ trả về phạm vi được đặt tên phạm vi trang tính.

Nếu thay vào đó tôi làm: wb.Names.Item("Sheet1!myName"), điều đó rõ ràng trả về phạm vi tên phạm vi trang tính. Tôi đã tìm thấy tôi có thể sử dụng để xác định những tờ cụ thể, nhưng không phải là một bảng tính.

Có cách nào tôi có thể chỉ định tôi muốn sổ làm việc được sắp xếp không?

Giải pháp thay thế của tôi hiện đang lặp qua danh sách tất cả các Tên và so sánh thuộc tính .Name để lấy phạm vi sách được đặt tên Phạm vi đã đặt tên. Điều này làm việc vì thuộc tính .Name gắn thêm một "Sheet1!" vào Phạm vi có tên phạm vi trang tính. Điều này tuy nhiên rất tốn kém để làm, và tôi muốn tránh nó.

+2

Nó không rõ ràng về cách bạn sử dụng phạm vi. Nếu bạn đang cố gắng đặt một đối tượng phạm vi thành một chuỗi tên thì 'Set rng1 = Range (" myName ")' sẽ trả về phạm vi từ tên trang tính cục bộ nếu * sheet1 đang hoạt động * nếu không nó sẽ trả về phạm vi từ tên bảng tính . Tôi nghĩ đây là giải pháp dọn dẹp sạch nhất - ví dụ: kiểm tra rằng trang tính đang hoạt động khác với trang tính lưu trữ tên cục bộ trước khi tìm cách sử dụng tên làm phạm vi sổ làm việc. Có lý? :) – brettdj

+0

bạn cũng có thể so sánh parent.name với tên bảng tính, nhưng bạn vẫn cần lặp qua các tên để trích xuất bộ sưu tập đó. – nutsch

+0

lại: nhận xét của @ brettdj. tùy thuộc vào những gì bạn đang cố gắng đạt được, dễ nhất có thể là chỉ cần thêm một bảng tạm thời ở đầu macro của bạn, để xóa ở cuối mã của bạn. – nutsch

Trả lời

1

Khi chúng tôi (JKP và bản thân mình) viết Name Manager, chúng tôi đã thêm một thông báo lọc và cảnh báo cho Tên toàn cục/địa phương vì hành vi mô hình đối tượng Excel này dẫn đến khó phát hiện lỗi.

Vì vậy, đề xuất của tôi không bao giờ được sử dụng tên Toàn cầu/Địa phương trùng lặp.

Chúng tôi sử dụng mã để phát hiện nếu tên trùng lặp toàn cầu/địa phương với cha mẹ của tên địa phương hoạt động và sau đó chuyển đổi trang tính nếu cần. Mã VBA được tối ưu hóa mà chúng tôi sử dụng để tìm phiên bản địa phương của tên toàn cục là: tốc độ nhanh hợp lý của nó trừ khi bạn có hàng chục nghìn tên -

Function FindNameLocal(oSheet As Worksheet, sName As String) As Name 
     Dim oName As Name 
     Dim strLocalName As String 
     Dim strLocalNameNoQuote 
     Dim strName As String 
     Set FindNameLocal = Nothing 
     If Len(sName) > 0 And Not oSheet Is Nothing And oSheet.Names.Count > 0 Then 
      On Error Resume Next 
      strLocalName = "'" & oSheet.Name & "'!" & sName 
      strLocalNameNoQuote = oSheet.Name & "!" & sName 
      Set FindNameLocal = oSheet.Names(strLocalName) 
      If Err <> 0 Or (FindNameLocal.NameLocal <> strLocalName And FindNameLocal.NameLocal <> strLocalNameNoQuote) Then 
       On Error GoTo 0 
       Set FindNameLocal = Nothing 
       For Each oName In oSheet.Names 
        strName = oName.Name 
        If Len(strLocalName) = Len(strName) Or Len(strLocalNameNoQuote) = Len(strName) Then 
         If strName = strLocalName Or strName = strLocalNameNoQuote Then 
          Set FindNameLocal = oName 
          GoTo GoExit 
         End If 
        End If 
       Next 
      End If 
     End If 
GoExit: 
    End Function 
+0

Tôi không chắc chắn điều này trả lời câu hỏi của tôi. Có lẽ tôi đang hiểu sai nó, nhưng tôi cần lấy phiên bản Toàn cầu của tên. Điều này trả về cấp độ trang tính mà tôi có thể thực hiện bằng cách chuyển nó theo định dạng wb.Names.Item ("Sheet1! MyName"). Tôi đã nhận thấy một điều trong mã của bạn mà tôi tò mò. Không so sánh chiều dài trước khi so sánh các chuỗi gây ra nhiều lợi ích hiệu suất? – Shark

+0

Chúng tôi sử dụng tính năng này để phát hiện xem có tên trùng lặp toàn cục hay không bằng cách chuyển tên toàn cục và tên trang tính đang hoạt động. Nếu có một bản sao thì bạn cần phải thay đổi trang tính và thử lại cho đến khi bạn tìm thấy một trang tính không chứa bản sao (hoặc tạm thời thêm trang tính mới) để sau đó khi bạn truy cập vào tên, bạn sẽ nhận được trang tính chung. Lấy chiều dài của một chuỗi là rất nhanh trong VBA nhưng so sánh chuỗi là chậm: không biết mức độ này áp dụng trong C#. –

+0

Ahh, có ý nghĩa bây giờ. Tôi sẽ phải xem liệu cách tiếp cận của bạn (được dịch sang C#) có nhanh hơn một ý tưởng khác mà tôi đã đưa ra hay không. Tôi sẽ đăng giải pháp như một câu trả lời khác. Sau đó, kiểm tra hiệu suất sẽ xác định người chiến thắng! – Shark