例えば、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)
に変更します。シート名にスペースやその他の変な文字があっても動作するようにしたい場合。
Split(cell.address(External:=True), "]")(1)
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。
複数の領域を持つ範囲を処理するコードを記述する必要がある場合があります。
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
私が作成したユーザー定義関数で、次のことがうまくいったことがわかりました。 セル範囲のリファレンスとワークシート名を文字列として連結し、評価ステートメントで使用しました(Sumproductで評価を使用していました)。
例:
Function SumRange(RangeName as range)
Dim strCellRef, strSheetName, strRngName As String
strCellRef = RangeName.Address
strSheetName = RangeName.Worksheet.Name & "!"
strRngName = strSheetName & strCellRef
次に、残りのコードでstrRngNameを参照します。
混乱した古い私のために範囲。
。Address(False、False、、True)。
TheSheetの形式で提供しているようです。!B4:K9。
そうでない場合、基準はなぜですか。 .. Strファンクトンを避けてください。
おそらくミリ秒未満しかかかりませんし、すでに使用されている153個の電子を使用します。
約0.3マイクロ秒。
RaAdd = mid(RaAdd、instr(raadd、 "]")+1)。
または。
約1.7マイクロ秒。
RaAdd = split(radd、 "]")(1)。
[2009-04-21編集]
Micah が指摘したように、これはその<br>; 特定の範囲(だから.Name anyone?) そう、おっと!</i>;
[/編集]
ちょっと遅ればせながら、グーグル検索でこれを見つけた人がいるかもしれないので(私がそうだったように)、以下の方法も試してみてください:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
これは完全なアドレスを返すはずで、"=Sheet1!$A$1"のようなものです。
等号が不要な場合は、Replace関数で等号を取り除くことができます:
address = Replace(address, "=", "")