2008-09-25 58 views
31

Nếu tôi có đối tượng Phạm vi - ví dụ: giả sử nó đề cập đến ô A1 trên trang tính có tên là Book1. Vì vậy, tôi biết rằng việc gọi Address() sẽ giúp tôi tham khảo địa phương đơn giản: $A$1. Tôi biết nó cũng có thể được gọi là Address(External:=True) để có được một tài liệu tham khảo bao gồm tên bảng tính và tên bảng tính: [Book1]Sheet1!$A$1.Làm cách nào để nhận địa chỉ của phạm vi bao gồm tên trang tính chứ không phải tên bảng tính, trong Excel VBA?

Điều tôi muốn là nhận địa chỉ bao gồm tên trang tính chứ không phải tên sách. Tôi thực sự không muốn gọi Address(External:=True) và cố gắng tách tên bảng tính ra khỏi bản thân bằng các hàm chuỗi. Có bất kỳ cuộc gọi nào tôi có thể thực hiện trên phạm vi để nhận được Sheet1!$A$1 không?

Trả lời

41

Chỉ cách tôi có thể nghĩ đến là để nối tên bảng tính với các tham chiếu ô, như sau:

Dim cell As Range 
Dim cellAddress As String 
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1) 
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False) 

EDIT:

Sửa dòng cuối cùng để:

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 

nếu bạn muốn nó hoạt động ngay cả khi có dấu cách hoặc các ký tự hài hước khác trong tên trang tính.

+1

Vâng, điều đó phù hợp với những gì tôi cần làm. Cảm ơn. Tôi sẽ sửa đổi dòng cuối cùng thành: cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address (External: = False) để nó hoạt động ngay cả khi có dấu cách hoặc các ký tự hài hước khác trong tên trang tính. – Micah

4

Ben là đúng. Tôi cũng không thể nghĩ ra cách nào để làm điều này. Tôi muốn đề nghị hoặc là phương pháp Ben đề nghị, hoặc sau đây để tách tên Workbook tắt.

Dim cell As Range 
Dim address As String 
Set cell = Worksheets(1).Cells.Range("A1") 
address = cell.address(External:=True) 
address = Right(address, Len(address) - InStr(1, address, "]")) 
-2

[edit on 2009/4/21]

        Như Micah chỉ ra, công trình chỉ này khi bạn đã đặt tên cho rằng
        phạm vi cụ thể (do đó .name có ai không?) Yeah, oops!

[/ sửa]

Một chút muộn để bên, tôi biết, nhưng trong trường hợp bất cứ ai khác bắt này trong một tìm kiếm google (như tôi vừa làm), bạn cũng có thể thử như sau:

Dim cell as Range 
Dim address as String 
Set cell = Sheet1.Range("A1") 
address = cell.Name 

Điều này sẽ trả về địa chỉ đầy đủ, chẳng hạn như "= Sheet1! $ A $ 1".

Giả sử bạn không muốn dấu bằng, bạn có thể tước nó đi với một chức năng Replace:

address = Replace(address, "=", "") 
+0

Điều này không hiệu quả đối với tôi khi tôi thử nó. Tôi gặp lỗi khi nó chạm vào ô.Tên. Theo trợ giúp VBA, thuộc tính Name của đối tượng Range trả về một đối tượng Name và chỉ hợp lệ khi đối tượng tham chiếu đến một phạm vi được đặt tên. – Micah

+0

Ack! Bạn hoàn toàn đúng. Bằng cách nào đó, tôi chỉ tình cờ đã đặt tên cho phạm vi đó khi tôi đang thử nghiệm. Tôi sẽ được cập nhật phản ứng của tôi cho phù hợp :( – TimS

-1

Tại sao không chỉ trả lại tên bảng tính với địa chỉ = cell.Worksheet.Name sau đó bạn có thể ghép nối lại địa chỉ như thế này address = cell.Worksheet.Name & "!" & cell.Address

+0

Tôi nghĩ rằng Cell.Worksheet.Name chỉ sẽ nhận được tên ActiveSheet, mà không phải là những gì OP muốn? Nó đặc biệt nhận được một bảng số ... – FinancialRadDeveloper

3

Address() chức năng bảng tính thực hiện chính xác điều đó. Vì nó không có sẵn thông qua Application.WorksheetFunction, tôi đã đưa ra một giải pháp bằng cách sử dụng phương thức Evaluate().

Giải pháp này cho phép Excel xử lý dấu cách và các ký tự hài hước khác trong tên trang tính, đây là một lợi thế tốt đẹp so với các câu trả lời trước đó.

Ví dụ:

Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _ 
    rng.Worksheet.Name & """)") 

lợi nhuận chính xác "Sheet1 $ A $ 1!", Với một đối tượng tên là Rangerng ám chỉ các ô A1 trong worksheet Sheet1.

Giải pháp này chỉ trả về địa chỉ của ô đầu tiên của một phạm vi chứ không phải địa chỉ của toàn bộ phạm vi ("Sheet1! $ A $ 1" so với "Sheet1! $ A $ 1: $ B $ 2"). Vì vậy, tôi sử dụng nó trong một chức năng tùy chỉnh:

Public Function AddressEx(rng As Range) As String 

    Dim strTmp As String 

    strTmp = Evaluate("ADDRESS(" & rng.Row & "," & _ 
     rng.Column & ",1,1,""" & rng.Worksheet.Name & """)") 

    If (rng.Count > 1) Then 

     strTmp = strTmp & ":" & rng.Cells(rng.Count) _ 
      .Address(RowAbsolute:=True, ColumnAbsolute:=True) 

    End If 

    AddressEx = strTmp 

End Function 

Các tài liệu đầy đủ của Địa chỉ() chức năng bảng tính có sẵn trên trang web của văn phòng: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

+0

Chăm sóc cần được lấy làm đối số cho 'Đánh giá()' phải nhỏ hơn 255 ký tự, có thể giới hạn là cao hơn, nhưng chắc chắn là giới hạn, với tên bảng dài thực sự, điều này có thể không thành công bất ngờ – ja72

-1
Dim rg As Range 
Set rg = Range("A1:E10") 
Dim i As Integer 
For i = 1 To rg.Rows.Count 

    For j = 1 To rg.Columns.Count 
    rg.Cells(i, j).Value = rg.Cells(i, j).Address(False, False) 

    Next 
Next 
+1

Chào mừng bạn đến với Stack Overflow! đăng một khối mã, hãy giải thích tại sao mã này giải quyết được vấn đề đặt ra.Không có giải thích, đây không phải là câu trả lời – Artemix

11
Split(cell.address(External:=True), "]")(1) 
+0

Tùy chọn tốt và ngắn gọn +1 –

+0

Vâng, tôi thích khái niệm này nhưng nó sẽ không hoạt động như khi tên trang tính có dấu cách và do đó cần dấu nháy đơn (ví dụ: 'Trang tính của tôi') – Berryl

0

tôi thấy sau đây làm việc cho tôi trong một hàm do người dùng định nghĩa mà tôi đã tạo. Tôi nối các tham chiếu phạm vi ô và tên trang tính dưới dạng một chuỗi và sau đó được sử dụng trong một báo cáo Đánh giá (Tôi đã sử dụng Đánh giá trên Sumproduct).

Ví dụ:

Function SumRange(RangeName as range) 

Dim strCellRef, strSheetName, strRngName As String 

strCellRef = RangeName.Address     
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef   

Sau đó tham khảo strRngName trong phần còn lại của mã của bạn.

0

Bạn có thể cần phải viết mã để xử lý một loạt với nhiều lĩnh vực, mà điều này không:

Public Function GetAddressWithSheetname(Range As Range, Optional blnBuildAddressForNamedRangeValue As Boolean = False) As String 

    Const Seperator As String = "," 

    Dim WorksheetName As String 
    Dim TheAddress As String 
    Dim Areas As Areas 
    Dim Area As Range 

    WorksheetName = "'" & Range.Worksheet.Name & "'" 

    For Each Area In Range.Areas 
'   ='Sheet 1'!$H$8:$H$15,'Sheet 1'!$C$12:$J$12 
     TheAddress = TheAddress & WorksheetName & "!" & Area.Address(External:=False) & Seperator 

    Next Area 

    GetAddressWithSheetname = Left(TheAddress, Len(TheAddress) - Len(Seperator)) 

    If blnBuildAddressForNamedRangeValue Then 
     GetAddressWithSheetname = "=" & GetAddressWithSheetname 
    End If 

End Function 
0

.Address (,,, TRUE) (Hiển thị Địa chỉ bên ngoài, đầy đủ Địa chỉ) :-)

+0

OP nêu rõ rằng anh/cô ấy không muốn sử dụng '.Address' nhưng bạn đang đề xuất sử dụng nó. Có lý do gì không? Nếu không, tôi khuyên bạn nên xóa hoặc chỉnh sửa câu trả lời của mình. – Ralph

-1

Đối bối rối cũ cho tôi một loạt

.Address (False, False,, True)

dường như cung cấp ở định dạng TheSheet ! B4: K9

Nếu nó không lý do tại sao các tiêu chuẩn .. tránh Str functons

có thể sẽ chỉ mất ít hơn một phần nghìn giây và sử dụng 153 electron đã sử dụng

khoảng 0,3 Microsec

RaAdd = giữa (raAdd, InStr (raadd, "]") +1)

hoặc

'khoảng 1,7 microsec

RaAdd = split (radd, "]") (1)

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