Как получить адрес диапазона, включая имя листа, но не имя книги, в Excel VBA? - PullRequest
36 голосов
/ 25 сентября 2008

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

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

Ответы [ 11 ]

49 голосов
/ 25 сентября 2008

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

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:

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

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

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

13 голосов
/ 30 июля 2013
Split(cell.address(External:=True), "]")(1)
4 голосов
/ 25 сентября 2008

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

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, "]"))
3 голосов
/ 12 августа 2009

Функция листа Address() делает именно это. Поскольку он недоступен через Application.WorksheetFunction, я нашел решение с использованием метода Evaluate().

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

Пример:

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

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

Это решение возвращает только адрес первой ячейки диапазона, а не адрес всего диапазона ("Лист1! $ A $ 1" против "Лист1! $ 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

0 голосов
/ 13 января 2017

для смущенного старого мне диапазона

. Адрес (False, False, True)

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

Если это не так, почему критерии .. избегать Str Functons

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

около 0,3 мкс

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

или

'около 1,7 мкс

RaAdd = split (радд, "]") (1)

0 голосов
/ 13 июля 2016

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

0 голосов
/ 19 января 2015

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

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 голосов
/ 09 июня 2014

Я обнаружил, что следующее работает для меня в пользовательской функции, которую я создал. Я объединил ссылку на диапазон ячеек и имя листа в виде строки, а затем использовал ее в выражении 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 в оставшейся части кода.

0 голосов
/ 25 марта 2011
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
0 голосов
/ 07 июля 2009

Почему бы просто не вернуть имя листа с address = cell.Worksheet.Name тогда вы можете объединить адрес обратно, как это address = cell.Worksheet.Name & "!" & cell.Address

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