エクセルVBAで、ワークブック名ではなく、ワークシート名を含む範囲のアドレスを取得するには?

例えば、Rangeオブジェクトがあり、それがBook1というワークシートのセルA1を参照しているとします。 そこで、Address()を呼び出せば、単純なローカル参照が得られることがわかる:$A$1. また、Address(External:=True)として呼び出すことで、ワークブック名とワークシート名を含む参照を取得することもできます。

私が欲しいのは、ブック名ではなくシート名を含むアドレスを取得することです。 Address(External:=True)を呼び出したり、文字列関数でワークブック名を取り除いたりしたくありません。 Sheet1!$A$1を取得するために、範囲内で呼び出すことはできますか?

ソリューション

私が思いつく唯一の方法は、以下のようにワークシート名とセル参照を連結することである:

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:

最後の行を :

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 

に変更します。シート名にスペースやその他の変な文字があっても動作するようにしたい場合。

解説 (1)
Split(cell.address(External:=True), "]")(1)
解説 (3)

ベンの言う通りだ。私もこの方法は思いつきません。Benが推奨している方法か、ワークブック名を削除する以下の方法をお勧めします。

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, "]"))
解説 (0)

Address()ワークシート関数はまさにそれを行います。 Application.WorksheetFunctionでは利用できないため、 Evaluate()メソッドを使用したソリューションを考案しました。

このソリューションでは、Excelでシート名のスペースやその他の面白い文字を処理できます。これは、以前の回答よりも優れた利点です。

例:

Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
    rng.Worksheet.Name & """)")

正確に「Sheet1。!$ A $ 1 "、Sheet1ワークシートのA1セルを参照する「rng」という名前の「範囲」オブジェクト。

このソリューションは、範囲全体の最初のセルのアドレスのみを返し、範囲全体のアドレスは返しません( "Sheet1。!$ A $ 1 "vs" Sheet1。!$ A $ 1:$ B $ 2 ")。 だから私はそれをカスタム関数で使用します:

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

Address()ワークシート機能の完全なドキュメントは、Office Webサイトで入手できます。https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

解説 (1)

複数の領域を持つ範囲を処理するコードを記述する必要がある場合があります。

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
解説 (0)
rngYourRange.Address(,,,TRUE)

外部アドレス、完全なアドレスを表示します。

解説 (1)

私が作成したユーザー定義関数で、次のことがうまくいったことがわかりました。 セル範囲のリファレンスとワークシート名を文字列として連結し、評価ステートメントで使用しました(Sumproductで評価を使用していました)。

例:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

strCellRef = RangeName.Address                 
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef        

次に、残りのコードでstrRngNameを参照します。

解説 (0)

混乱した古い私のために範囲。

。Address(False、False、、True)。

TheSheetの形式で提供しているようです。!B4:K9。

そうでない場合、基準はなぜですか。 .. Strファンクトンを避けてください。

おそらくミリ秒未満しかかかりませんし、すでに使用されている153個の電子を使用します。

約0.3マイクロ秒。

RaAdd = mid(RaAdd、instr(raadd、 "]")+1)。

または。

約1.7マイクロ秒。

RaAdd = split(radd、 "]")(1)。

解説 (0)

ワークシートの名前を返すだけではどうですか。 アドレス= cell.Worksheet.Name 。 次に、このようにアドレスを連結できます。 アドレス= cell.Worksheet.Name& "。!"& cell.Address

解説 (1)
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
解説 (1)

[2009-04-21編集]

    Micah が指摘したように、これはその

解説 (2)