Wie erhalte ich in Excel VBA die Adresse eines Bereichs einschließlich des Arbeitsblattnamens, jedoch nicht des Arbeitsmappennamens?

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

  •  02-07-2019
  •  | 
  •  

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?

War es hilfreich?

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, "=", "")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top