Excel VBA で、ブック名ではなくワークシート名を含む範囲のアドレスを取得するにはどうすればよいですか?
質問
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, "=", "")