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?

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

  •  02-07-2019
  •  | 
  •  

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 ?

È stato utile?

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, "=", "")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top