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
?
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.
Split(cell.address(External:=True), "]")(1)
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, "]"))
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
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
.Adresse (, TRUE) (Affiche l'adresse externe, l'adresse complète) :-)
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.