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ワークシートのA1セルを参照するRange
という名前のrng
オブジェクトとともに、正確に「Sheet1!$ A $ 1」を返します。
このソリューションは、範囲全体のアドレスではなく、範囲の最初のセルのアドレスのみを返します( "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
.Address(, TRUE)(外部アドレス、完全なアドレスを表示):-)
私が作成したユーザー定義関数では、次のことがうまくいきました。セル範囲参照とワークシート名を文字列として連結し、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を参照します。