Come posso ottenere l'indirizzo di un intervallo compreso il nome del foglio di lavoro, ma non il nome della cartella di lavoro, in Excel VBA?
Domanda
Se ho un oggetto Range, ad esempio, supponiamo che si riferisca alla cella A1
su un foglio chiamato Book1
. Quindi so che chiamare Address ()
mi darà un semplice riferimento locale: $ A $ 1
. So che può anche essere chiamato come Address (External: = True)
per ottenere un riferimento che includa il nome della cartella di lavoro e il nome del foglio di lavoro: [Book1] Foglio1! $ A $ 1
.
Quello che voglio è ottenere un indirizzo che includa il nome del foglio, ma non il nome del libro. Non voglio davvero chiamare Address (External: = True)
e provare a cancellare da solo il nome della cartella di lavoro con le funzioni di stringa. È possibile effettuare chiamate sull'intervallo per ottenere Sheet1! $ A $ 1
?
Soluzione
L'unico modo in cui posso pensare è concatenare il nome del foglio di lavoro con il riferimento di cella, come 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:
Modifica l'ultima riga in:
cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False)
se vuoi che funzioni anche se ci sono spazi o altri personaggi divertenti nel nome del foglio.
Altri suggerimenti
Split(cell.address(External:=True), "]")(1)
Ben ha ragione. Inoltre non riesco a pensare ad alcun modo per farlo. Suggerirei il metodo che Ben consiglia o quanto segue per eliminare il nome della cartella di lavoro.
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 funzione del foglio di lavoro Address ()
fa esattamente questo. Dato che non è disponibile tramite Application.WorksheetFunction
, ho trovato una soluzione usando il metodo Evaluate ()
.
Questa soluzione consente a Excel di gestire spazi e altri caratteri divertenti nel nome del foglio, il che è un bel vantaggio rispetto alle risposte precedenti.
Esempio:
Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
rng.Worksheet.Name & """)")
restituisce esattamente " Sheet1! $ A $ 1 " ;, con un oggetto Range
denominato rng
che fa riferimento alla cella A1 nel foglio di lavoro Sheet1.
Questa soluzione restituisce solo l'indirizzo della prima cella di un intervallo, non l'indirizzo dell'intero intervallo (" Foglio1! $ A $ 1 " vs " Foglio1! $ A $ 1: $ B $ 2 "). Quindi lo uso in una funzione personalizzata:
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 documentazione completa della funzione del foglio di lavoro Indirizzo () è disponibile sul sito Web di Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89
Ho trovato il seguente funzionato per me in una funzione definita dall'utente che ho creato. Ho concatenato il riferimento dell'intervallo di celle e il nome del foglio di lavoro come una stringa e quindi utilizzato in un'istruzione Evaluate (stavo usando Evaluate on Sumproduct).
Ad esempio:
Function SumRange(RangeName as range)
Dim strCellRef, strSheetName, strRngName As String
strCellRef = RangeName.Address
strSheetName = RangeName.Worksheet.Name & "!"
strRngName = strSheetName & strCellRef
Quindi fai riferimento a strRngName nel resto del codice.
Potrebbe essere necessario scrivere un codice che gestisca un intervallo con più aree, cosa che fa:
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 (,,, VERO) (Mostra indirizzo esterno, indirizzo completo) : -)
Perché non restituire semplicemente il nome del foglio di lavoro con indirizzo = cell.Worksheet.Name quindi puoi concatenare nuovamente l'indirizzo in questo modo indirizzo = cell.Worksheet.Name & amp; & Quot;! & Quot; & 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
Per vecchi confusi un intervallo
.Address (False, False,, True)
sembra dare nel formato TheSheet! B4: K9
In caso contrario, i criteri .. evitano le funzioni Str
probabilmente impiegherà meno di un millisecondo e utilizzerà 153 elettroni già usati
circa 0,3 Microsec
RaAdd = mid (RaAdd, instr (raadd, "] ") +1)
o
'circa 1,7 microsec
RaAdd = split (radd, "] ") (1)
[modifica il 21-04-2009]
& nbsp; & nbsp; & nbsp; & nbsp; Come ha sottolineato Micah, questo funziona solo quando lo hai nominato
& nbsp; & nbsp; & nbsp; & nbsp; intervallo particolare (quindi. Dai un nome a qualcuno?) Sì, oops!
[/ modifica]
Lo so un po 'tardi alla festa, ma nel caso in cui qualcun altro lo rilevi in ??una ricerca su Google (come ho appena fatto), puoi anche provare quanto segue:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
Questo dovrebbe restituire l'indirizzo completo, qualcosa come " = Foglio1! $ A $ 1 " ;.
Supponendo che non desideri il segno di uguale, puoi rimuoverlo con una funzione Sostituisci:
address = Replace(address, "=", "")