web-dev-qa-db-fra.com

Comment obtenir l'adresse d'une plage, y compris le nom de la feuille de calcul, mais pas le nom du classeur, dans Excel VBA?

Si j'ai un objet Range - par exemple, disons qu'il fait référence à la cellule A1 Sur une feuille de calcul appelée Book1. Je sais donc qu'en appelant Address() j'obtiendrai une simple référence locale: $A$1. Je sais qu'il peut également être appelé en tant que Address(External:=True) pour obtenir une référence comprenant le nom du classeur et le nom de la feuille de calcul: [Book1]Sheet1!$A$1.

Ce que je veux, c'est obtenir une adresse incluant le nom de la feuille, mais pas le nom du livre. Je ne veux vraiment pas appeler Address(External:=True) et essayer de supprimer moi-même le nom du classeur avec des fonctions de chaîne. Y a-t-il un appel que je peux faire sur la gamme pour obtenir Sheet1!$A$1?

37
Micah

La seule façon dont je peux penser est de concaténer le nom de la feuille de calcul avec la référence de cellule, comme suit:

Dim cell As Range
Dim cellAddress As String
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)

MODIFIER:

Modifiez la dernière ligne en:

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

si vous voulez que cela fonctionne même s'il y a des espaces ou d'autres personnages amusants dans le nom de la feuille.

51
Ben Hoffstein
Split(cell.address(External:=True), "]")(1)
14

Ben a raison. Je ne vois pas non plus de moyen de faire ça. Je suggérerais soit la méthode recommandée par Ben, soit la suivante pour supprimer le nom du classeur.

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, "]"))
4
theo

La fonction de feuille de calcul Address() fait exactement cela. Comme il n'est pas disponible via Application.WorksheetFunction, J'ai trouvé une solution en utilisant la méthode Evaluate().

Cette solution permet à Excel de gérer les espaces et autres caractères amusants dans le nom de la feuille, ce qui est un bel avantage par rapport aux réponses précédentes.

Exemple:

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

renvoie exactement "Sheet1! $ A $ 1", avec un objet Range nommé rng faisant référence à la cellule A1 dans la feuille de calcul Sheet1.

Cette solution renvoie uniquement l'adresse de la première cellule d'une plage, pas l'adresse de la plage entière ("Sheet1! $ A $ 1" vs "Sheet1! $ A $ 1: $ B $ 2"). Je l'utilise donc dans une fonction personnalisée:

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

La documentation complète de la fonction de feuille de calcul Address () est disponible sur le site Web Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

3
raph82

Vous devrez peut-être écrire du code qui gère une plage avec plusieurs zones, ce qui:

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
HarveyFrench

.Adresse (, TRUE) (Affiche l'adresse externe, l'adresse complète) :-)

0
ArnonK

J'ai trouvé ce qui suit fonctionnait pour moi dans une fonction définie par l'utilisateur que j'ai créée. J'ai concaténé la référence de plage de cellules et le nom de la feuille de calcul sous forme de chaîne, puis utilisé dans une instruction Evaluate (j'utilisais Evaluate sur Sumproduct).

Par exemple:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

strCellRef = RangeName.Address                 
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef        

Reportez-vous ensuite à strRngName dans le reste de votre code.

0
Jeff