Excel VBA で、ブック名ではなくワークシート名を含む範囲のアドレスを取得するにはどうすればよいですか?

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

  •  02-07-2019
  •  | 
  •  

質問

Range オブジェクトがある場合、たとえばセルを参照しているとします。 A1 というワークシート上で Book1. 。だから私はその呼びかけを知っています Address() 単純なローカル参照を取得します。 $A$1. 。次のように呼ぶこともできることを知っています Address(External:=True) ワークブック名​​とワークシート名を含む参照を取得するには、次のようにします。 [Book1]Sheet1!$A$1.

私が望むのは、ブック名ではなく、シート名を含むアドレスを取得することです。本当は電話したくない 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)

編集:

最後の行を次のように変更します。

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

シート名にスペースやその他のおかしな文字が含まれていても機能するようにしたい場合。

他のヒント

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

ベンは正しいです。私もこれを行う方法が思いつきません。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, "]"))

Address() ワークシート関数はまさにそれを行います。経由では利用できないため、 Application.WorksheetFunction, 、を使用して解決策を思いつきました。 Evaluate() 方法。

このソリューションを使用すると、Excel でシート名内のスペースやその他のおかしな文字を処理できるようになり、以前の回答に比べて優れた利点があります。

例:

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

正確に「Sheet1!$A$1」を返します。 Range という名前のオブジェクト rng Sheet1 ワークシートの A1 セルを参照します。

この解決策は、範囲全体のアドレスではなく、範囲の最初のセルのアドレスのみを返します (「Sheet1!$A$1」と「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

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

例えば:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

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

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

複数の領域を含む範囲を処理するコードを記述する必要がある場合があります。これは次のようになります。

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)(外部アドレス、完全なアドレスを表示):-)

単にワークシート名を返すだけではどうでしょうかアドレス = セル.ワークシート.名前次に、このようにアドレスを連結して戻すことができますaddress = 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

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

.Address(False, False, , True)

TheSheet!B4:K9 という形式で与えられるようです

そうでない場合、その基準はなぜですか..Str 関数を避ける

おそらく所要時間は 1 ミリ秒未満で、すでに使用されている 153 個の電子を使用します。

約0.3マイクロ秒

RaAdd=mid(RaAdd,instr(raadd,"]") +1)

または

「約1.7マイクロ秒」

RaAdd= スプリット(radd,"]")(1)

[2009-04-21 編集]

Micah が指摘したように、これは名前を付けた場合にのみ機能します。
特定の範囲 (だから、誰か名前を付けてください?) はい、おっと!

[/編集]

パーティーには少し遅れましたが、他の誰かが Google 検索でこれを見つけた場合に備えて (私がやったように)、次のことを試してみることもできます。

Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name

これにより、「=Sheet1!$A$1」のような完全なアドレスが返されるはずです。

等号が不要な場合は、Replace 関数を使用して等号を削除できます。

address = Replace(address, "=", "")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top