Wie erhalte ich in Excel VBA die Adresse eines Bereichs einschließlich des Arbeitsblattnamens, jedoch nicht des Arbeitsmappennamens?
Frage
Wenn ich beispielsweise ein Range-Objekt habe, nehmen wir an, dass es sich auf eine Zelle bezieht A1
auf einem Arbeitsblatt namens Book1
.Ich kenne also diese Berufung Address()
werde mir eine einfache lokale Referenz besorgen: $A$1
.Ich weiß, dass es auch so heißen kann Address(External:=True)
So erhalten Sie eine Referenz einschließlich des Namens der Arbeitsmappe und des Arbeitsblatts: [Book1]Sheet1!$A$1
.
Ich möchte eine Adresse erhalten, die den Blattnamen enthält, aber nicht den Buchnamen.Ich möchte wirklich nicht anrufen Address(External:=True)
und versuche, den Namen der Arbeitsmappe selbst mit String-Funktionen zu entfernen.Gibt es einen Anruf, den ich über die Reichweite tätigen kann? Sheet1!$A$1
?
Lösung
Nur so ich denken kann, ist der Arbeitsblatt Namen mit dem Zellbezug verketten, wie folgt:
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:
Ändern letzte Zeile:
cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False)
Wenn Sie wollen, dass es funktioniert, selbst wenn Leerzeichen oder andere lustige Zeichen im Blattnamen.
Andere Tipps
Split(cell.address(External:=True), "]")(1)
Ben ist richtig. Ich kann auch nicht glauben, von irgendeiner Weise, dies zu tun. Ich würde vorschlagen, entweder das Verfahren Ben empfiehlt, oder die folgende den Namen der Arbeitsmappe abzustreifen.
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, "]"))
Die Address()
Tabellenfunktion tut genau das. Da es nicht möglich, durch Application.WorksheetFunction
ist, kam ich mit einer Lösung mit der Evaluate()
Methode auf.
Diese Lösung läßt Excel-Angebote mit Leerzeichen und anderen lustigen Zeichen im Blattnamen, die ein schöner Vorteil gegenüber den bisherigen Antworten ist.
Beispiel:
Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
rng.Worksheet.Name & """)")
liefert genau "Sheet1! $ A $ 1", mit einem Range
Objekt mit dem Namen rng
Bezug auf die A1 Zelle in dem Sheet1 Arbeitsblatt.
Diese Lösung gibt nur die Adresse der ersten Zelle eines Bereichs, nicht die Adresse des gesamten Bereichs (vs "Sheet1 $ A $ 1: B $ 2 $" "Sheet1 $ A $ 1!"). Also ich benutze es in einer benutzerdefinierten Funktion:
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
Die vollständige Dokumentation der Adresse () Tabellenfunktion ist auf der Office-Website: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89
Ich fand das in einer benutzerdefinierten Funktion für mich gearbeitet folgende ich herstellte. Ich verketteten den Zellbereich Referenz- und Arbeitsblatt-Namen als String und dann in einer Anweisung auswerten verwendet (ich war auf SUMPRODUCT auswerten verwenden).
Zum Beispiel:
Function SumRange(RangeName as range)
Dim strCellRef, strSheetName, strRngName As String
strCellRef = RangeName.Address
strSheetName = RangeName.Worksheet.Name & "!"
strRngName = strSheetName & strCellRef
Dann beziehen sich auf strRngName im Rest des Codes.
Sie müssen möglicherweise Code schreiben, der einen Bereich mit mehreren Bereichen behandelt, die dies tut:
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) (Zeigt externe Adresse, vollständige Anschrift) : -)
Warum nicht einfach zurückgeben den Arbeitsblatt-Namen mit Adresse = cell.Worksheet.Name dann können Sie die Adresse wieder auf wie diese verketten Adresse = cell.Worksheet.Name & "!" & 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
Für verwirrtes altes Ich eine Reihe
.Adresse(Falsch, Falsch, , Wahr)
scheint im Format TheSheet!B4:K9 zu geben
Wenn dies nicht der Fall ist, warum dann die Kriterien?Vermeiden Sie Str-Funktionen
wird wahrscheinlich nur weniger als eine Millisekunde dauern und 153 bereits verbrauchte Elektronen verbrauchen
etwa 0,3 Mikrosekunden
RaAdd=mid(RaAdd,instr(raadd,"]") +1)
oder
'ungefähr 1,7 Mikrosekunden
RaAdd= split(radd,"]")(1)
[Bearbeiten auf 2009-04-21]
Als Micah darauf hingewiesen, dies funktioniert nur, wenn Sie genannt haben, dass
bestimmter Bereich (daher .Name anyone?) Ja, oops!
[/ edit]
Ein wenig spät, um die Partei, ich weiß, aber falls jemand anderes dies fängt in einer Google-Suche (wie ich gerade), können Sie auch versuchen, die folgenden:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
Dies sollte die vollständige Adresse zurückkehren, so etwas wie "= Sheet1! $ A $ 1".
Sie nicht das Gleichheitszeichen Angenommen, Sie möchten, können Sie es mit einem Ersetzen-Funktion abzustreifen:
address = Replace(address, "=", "")