Как мне получить адрес диапазона, включающий имя рабочего листа, но не имя рабочей книги, в Excel VBA?

StackOverflow https://stackoverflow.com/questions/131121

  •  02-07-2019
  •  | 
  •  

Вопрос

Если у меня есть объект Range - например, допустим, он ссылается на ячейку A1 на рабочем листе, называемом Book1.Так что я знаю, что это призвание Address() вы дадите мне простую местную ссылку: $A$1.Я знаю, что это также можно назвать Address(External:=True) чтобы получить ссылку, включающую название рабочей книги и название рабочего листа: [Book1]Sheet1!$A$1.

Что я хочу, так это получить адрес, включающий название листа, но не название книги.Я действительно не хочу звонить Address(External:=True) и попробуйте удалить имя рабочей книги самостоятельно с помощью строковых функций.Есть ли какой-нибудь звонок, который я могу сделать по этому диапазону, чтобы получить Sheet1!$A$1?

Это было полезно?

Решение

Единственный способ, который я могу придумать, - это объединить имя листа со ссылкой на ячейку следующим образом:

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

Редактировать:

Измените последнюю строку на :

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

если вы хотите, чтобы это работало, даже если в названии листа есть пробелы или другие забавные символы.

Другие советы

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

Бен прав.Я также не могу придумать никакого способа сделать это.Я бы предложил либо метод, который рекомендует Бен, либо следующий, чтобы удалить название Рабочей книги.

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, "]"))

Тот Самый Address() функция worksheet делает именно это.Поскольку это недоступно через Application.WorksheetFunction, я придумал решение , используя Evaluate() способ.

Это решение позволяет Excel работать с пробелами и другими забавными символами в названии листа, что является приятным преимуществом по сравнению с предыдущими ответами.

Пример:

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

возвращает ровно "Sheet1!$A$1", с Range объект с именем rng ссылка на ячейку A1 на рабочем листе Sheet1.

Это решение возвращает только адрес первой ячейки диапазона, а не адрес всего диапазона ("Sheet1!$A $1" против "Sheet1!$A $ 1:$B $ 2").Поэтому я использую его в пользовательской функции:

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

Полная документация по функции рабочего листа Address() доступна на веб-сайте Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

Я обнаружил, что следующее сработало для меня в пользовательской функции, которую я создал.Я объединил ссылку на диапазон ячеек и имя рабочего листа в виде строки, а затем использовал в операторе Evaluate (я использовал Evaluate для Sumproduct).

Например:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

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

Затем обратитесь к strRngName в остальной части вашего кода.

Возможно, вам потребуется написать код, который обрабатывает диапазон с несколькими областями, что это и делает:

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

.Адрес (,,,, TRUE) (Показывает внешний адрес, Полный адрес) :-)

Почему бы просто не вернуть имя рабочего листа с помощью адрес = ячейка.Worksheet.Name затем вы можете снова объединить адрес следующим образом адрес = ячейка.Рабочий лист.Имя и "!" и ячейка.Адрес

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

Для сбитого с толку старого меня целый ряд

.Адрес(Ложный, False, , True)

кажется, дает в формате TheSheet!B4: K9

Если это не так , то зачем нужны критерии ?.избегайте функций Str

вероятно, это займет всего меньше миллисекунды и израсходует 153 уже использованных электрона.

около 0,3 Микросекунды

RaAdd=mid(RaAdd,instr(raadd,"]") +1)

или

- около 1,7 микросекунды

RaAdd= разделить (radd,"]")(1)

[правка 2009-04-21]

    Как отметил Мика, это работает только тогда, когда вы назвали это
    определенный диапазон (отсюда .Назовите кого-нибудь?) Да, упс!

[/править]

Я знаю, что немного опаздываю на вечеринку, но на случай, если кто-нибудь еще обнаружит это в поиске Google (как я только что сделал), вы также можете попробовать следующее:

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

Это должно вернуть полный адрес, что-то вроде "=Sheet1!$A$1".

Предполагая, что вам не нужен знак равенства, вы можете удалить его с помощью функции замены:

address = Replace(address, "=", "")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top