Comment obtenir une adresse de plage comprenant le nom de la feuille de calcul, mais pas le nom du classeur, dans Excel VBA?

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

  •  02-07-2019
  •  | 
  •  

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 ?

Était-ce utile?

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, "=", "")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top