Как мне получить адрес диапазона, включающий имя рабочего листа, но не имя рабочей книги, в Excel VBA?
Вопрос
Если у меня есть объект 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, "=", "")