Comment obtenir une adresse de plage comprenant le nom de la feuille de calcul, mais pas le nom du classeur, dans Excel VBA?
Question
Si j'ai un objet Range - par exemple, supposons qu'il se réfère à la cellule A1
d'une feuille de calcul appelée Book1
. Je sais donc que l'appel de Address ()
m'aura une simple référence locale: $ A $ 1
. Je sais qu'il peut également être appelé 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 souhaite vraiment pas appeler Address (External: = True)
et essayer de supprimer le nom du classeur moi-même avec des fonctions de chaîne. Puis-je effectuer un appel sur la plage pour obtenir Sheet1! $ A $ 1
?
La solution
Le seul moyen auquel je puisse 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)
EDIT:
Modifier 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.
Autres conseils
Split(cell.address(External:=True), "]")(1)
Ben a raison. Je ne peux pas non plus penser à un moyen de le faire. 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 elle n'est pas disponible via Application.WorksheetFunction
, j'ai proposé une solution à l'aide de la méthode Evaluate ()
.
Cette solution laisse Excel gérer les espaces et autres caractères amusants dans le nom de la feuille, ce qui constitue un avantage appréciable 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 de la feuille de calcul Sheet1.
Cette solution ne renvoie que 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 de l'Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89
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 travail en tant que chaîne, puis utilisés 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
Faites ensuite référence à strRngName dans le reste de votre code.
Il se peut que vous deviez écrire du code qui gère une plage comportant 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
.Address (,,, TRUE) (Affiche l'adresse externe, adresse complète) : -)
Pourquoi ne pas simplement renvoyer le nom de la feuille de calcul avec address = cell.Worksheet.Name alors vous pouvez concaténer l'adresse à nouveau comme ça address = cell.Worksheet.Name & amp; "! " & amp; 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
Pour moi vieux confus une gamme
.Address (False, False,, True)
semble donner au format TheSheet! B4: K9
Si ce n’est pas pourquoi les critères .. évitez les fonctions Str
prendra probablement moins d'une milliseconde et utilisera 153 électrons déjà utilisés
environ 0,3 Microsec
RaAdd = mid (RaAdd, instr (raadd, "]") +1)
ou
'environ 1,7 microsec
RaAdd = split (radd, "]") (1)
[edit on 2009-04-21]
& nbsp; & nbsp; & nbsp; & nbsp; Comme l'a fait remarquer Micah, cela ne fonctionne que si vous l'avez nommé ainsi
& nbsp; & nbsp; & nbsp; & nbsp; plage particulière (d'où le nom. N'importe qui?) Ouais, oups!
[/ edit]
Je sais que je suis un peu en retard à la fête, mais au cas où quelqu'un d'autre le trouverait dans une recherche google (comme je viens de le faire), vous pouvez également essayer ce qui suit:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
Ceci devrait renvoyer l’adresse complète, par exemple "= Sheet1! $ A $ 1".
En supposant que vous ne vouliez pas le signe égal, vous pouvez le supprimer avec une fonction de remplacement:
address = Replace(address, "=", "")