web-dev-qa-db-ja.com

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

Rangeオブジェクトがある場合、たとえば、_A1_というワークシート上のセル_Book1_を参照するとします。したがって、Address()を呼び出すと、単純なローカル参照_$A$1_が取得されることがわかります。ワークブック名​​とワークシート名を含む参照を取得するために、Address(External:=True)として呼び出すこともできます:_[Book1]Sheet1!$A$1_。

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

37
Micah

私が考えることができる唯一の方法は、次のようにワークシート名とセル参照を連結することです。

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) 

シート名にスペースやその他の変な文字が含まれている場合でも機能させたい場合。

51
Ben Hoffstein
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, "]"))
4
theo

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

3
raph82

複数の領域を含む範囲を処理するコードを作成する必要がある場合がありますが、これは次のとおりです。

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
HarveyFrench

.Address(, TRUE)(外部アドレス、完全なアドレスを表示):-)

0
ArnonK

私が作成したユーザー定義関数では、次のことがうまくいきました。セル範囲参照とワークシート名を文字列として連結し、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を参照します。

0
Jeff