Если у меня есть объект 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)
EDIT:
Изменить последнюю строку на:
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, "]"))
Адрес функции()
делает именно это. Как это's не доступны через приложение.WorksheetFunction, я придумал решение с помощью оценки()` метод.
Данное решение позволило в Excel сделок с пробелами и другие забавные символы в имени листа, что является приятным плюсом за предыдущие ответы.
Пример:
Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
rng.Worksheet.Name & """)")
возвращает именно то "Лист1!$А$1" С, с спектр
объект РНГ
со ссылкой на ячейку А1 на листе Лист1.
Это решение возвращает только адрес первой ячейки диапазона, не по адресу весь ассортимент (на"Лист1!$А мне 1$&; против "и Лист1!$А$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
Полное документирование адресу() функции листа размещен на сайте Управления: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89
Возможно, вам придется написать код, который работает в диапазоне с несколькими областями, который это делает:
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
rngYourRange.Address(,,,TRUE)
Показывает Внешний Адрес, Полный Адрес
Я нашел следующие работал для меня в пользовательской функции я создал. Я сцепляются ссылку на ячейку диапазона и имя листа в строку, а затем использовать в оценке заявление (я использовал оценки на функцию sumproduct).
Например:
Function SumRange(RangeName as range)
Dim strCellRef, strSheetName, strRngName As String
strCellRef = RangeName.Address
strSheetName = RangeName.Worksheet.Name & "!"
strRngName = strSheetName & strCellRef
Затем обратитесь к strRngName в остальной части кода.
Для смущает меня ряд
.Адрес(Ложь, Ложь,, , Истина)
кажется, чтобы дать в лист формата!В4:К9
Если это не так, почему критерии .. избежать ул. functons
вероятно, только занять менее миллисекунды и использовать 153 уже используют электроны
около 0,3 МКС
RaAdd=середина(RaAdd,инстр(raadd, что"]", У) +1)
или
'О 1.7 МКС
На" RaAdd= сплит(Радд" и];) (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
[edit on 2009-04-21]
Как отметил Micah, это работает только в том случае, если вы назвали этот
конкретный диапазон (отсюда и .Name anyone?) Да, упс!
[/edit]
Я знаю, что немного опоздал, но на случай, если кто-то еще обнаружит это в поиске Google (как это сделал я), вы можете попробовать следующее:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
Это должно вернуть полный адрес, что-то вроде "=Sheet1!$A$1".
Если предположить, что знак равенства не нужен, то его можно убрать с помощью функции Replace:
address = Replace(address, "=", "")