Como faço para obter o endereço do intervalo, incluindo o nome da planilha, mas não o nome do livro, no Excel VBA?
Pergunta
Se eu tiver um objeto Range - por exemplo, digamos que ele se refere a A1
célula em uma planilha chamada Book1
. Então eu sei que chamar Address()
vai me dar uma referência local simples: $A$1
. Sei que também pode ser chamado como Address(External:=True)
para obter uma referência, incluindo o nome do livro eo nome planilha:. [Book1]Sheet1!$A$1
O que eu quero é obter um endereço, incluindo o nome da folha, mas não o nome do livro. Eu realmente não quero chamar Address(External:=True)
e tentar retirar o nome do livro-me com funções de cadeia. Existe alguma ligação que eu possa fazer sobre a gama de obter Sheet1!$A$1
?
Solução
única maneira que eu posso pensar é para concatenar o nome da planilha com a referência de célula, como segue:
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:
Modificar última linha para:
cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False)
Se você quer que ele funcione, mesmo que haja espaços ou outros caracteres estranhos no nome da folha.
Outras dicas
Split(cell.address(External:=True), "]")(1)
Ben é certo. Eu também não consigo pensar em alguma maneira de fazer isso. Eu sugiro o método de Ben recomenda, ou o seguinte para retirar o nome do livro off.
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, "]"))
A função Address()
planilha faz exatamente isso. Como ele não está disponível através Application.WorksheetFunction
, eu vim com uma solução usando o método Evaluate()
.
Esta solução deixar Excel lida com espaços e outros personagens engraçados no nome da folha, o que é uma vantagem agradável sobre as respostas anteriores.
Exemplo:
Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
rng.Worksheet.Name & """)")
retorna exatamente "Sheet1! $ A $ 1", com um Range
objeto nomeado rng
referindo a célula A1 na planilha Sheet1.
Esta solução retorna apenas o endereço da primeira célula de um intervalo, não o endereço de toda a gama ( "Sheet1 $ A $ 1!" Vs "Sheet1 $ A $ 1: $ B $ 2"). Então, eu usá-lo em uma função personalizada:
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
A documentação completa da função de planilha Endereço () está disponível no site do Escritório: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89
Eu encontrei o seguinte trabalhou para mim em uma função definida pelo usuário que eu criei. I concatenado a referência do intervalo celular e nome da planilha como uma string e, em seguida, usado em um Avaliar declaração (eu estava usando Avaliar em SUMPRODUCT).
Por exemplo:
Function SumRange(RangeName as range)
Dim strCellRef, strSheetName, strRngName As String
strCellRef = RangeName.Address
strSheetName = RangeName.Worksheet.Name & "!"
strRngName = strSheetName & strCellRef
Em seguida, referem-se a strRngName no resto do seu código.
Você pode precisar escrever código que lida com um intervalo com várias áreas, que esta faz:
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
Porque não basta devolver o nome da planilha com address = cell.Worksheet.Name então você pode concatenar as costas endereço em como esta address = cell.Worksheet.Name & "!" & Cell.Address
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
Para confundido velho me uma gama
.Address (False, False, True)
parece dar em formato TheSheet B4: K9
Se isso não acontecer porque os critérios .. functons evitar Str
provavelmente só irá demorar menos de um milésimo de segundo e usá-153 elétrons já utilizados
cerca de 0,3 microssegundos
RaAdd = meio (RaAdd, instr (raadd, "]") +1)
ou
'cerca de 1,7 microssegundos
RaAdd = split (radd, "]") (1)
[edit on 2009-04-21]
Como Micah apontou, isso só funciona quando tiver nomeado que
determinado intervalo (daí .Name alguém?) Sim, oops!
[/ edit]
Um pouco atrasado para a festa, eu sei, mas no caso de alguém capturas isso em uma pesquisa do Google (como eu fiz), você também pode tentar o seguinte:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
Isso deve retornar o endereço completo, algo como "= Sheet1! $ A $ 1".
Assumindo que você não quer que o sinal de igual, você pode tira-lo com uma função Substituir:
address = Replace(address, "=", "")