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?

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

  •  02-07-2019
  •  | 
  •  

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?

Foi útil?

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
.Address (,,, TRUE) (Shows endereço externo, endereço completo): -)

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, "=", "")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top