2017-08-13 10 views
0

私はUDF上で作業し、ユーザーは "sheet1!A1:C8"のように範囲を入力します。 VBAで範囲のアドレスはどこにありますか?

は、私は次のように記述します。ここでは

Function RelativeSearch(Search, rng As Range, Row, Column) 
    MsgBox rng.Address 

MsgBoxには、私だけA1を与える:C8。 「シート1」はどのように入手できますか?

文字列としてrngを作成しようとしましたが、後でコード内でrng.findを使用する必要があるため、動作しません。

誰もが範囲からシートを取得する方法を知っていますか?

+1

を質問がある...なぜあなたはどのようなシートである知っておく必要があります言及されている?よく書かれたUDFがその情報を知る必要がある本当の理由を考えることはできません - あなたは 'Range'オブジェクトとして' rng'を使うことができなければなりません。存在する。 – YowE3K

+0

@ YowE3Kどのシートを見るべきかを知るために必要です。 UDFは、検索針、検索範囲、列と行のオフセットを要求します。私は範囲内の針を見つけ、列をオフセットして範囲を操作します。だから基本的には、それが一致する場所からシート内で上下左右に動くことができるので、少し柔軟性のある "vlookup"です。アドレスをオフセットすることは問題ではありませんが、シートは、シート5と一致したことを意味するアドレスとシート1からの戻り値で運ばれないためです。 – Andreas

+0

私はまだここで答えを見る時間がなかった、明日それを行うだろうが、両方が正しいように見える。あなたがた両方に感謝します。 – Andreas

答えて

2

RangeオブジェクトがWorksheetプロパティを持つ操作を行うことができます:

rng.Worksheet.Nameは、あなたがやりたいだろう。

またAddress性はそう、External引数を有する:

rng.Address(External:=True)

は、全範囲のアドレス、例えば、[Book1]Sheet1!$D$28をもたらします。

1

Sheetへの参照を取得するには、rng.Parentを使用してください。 具体的なケースでは、rng.Parent.Nameを探しています。

だから、そう、

MsgBox rng.Parent.Name & "!" & rng.Address 
1

これはあなたが質問した質問に対する回答ではありませんが、質問する必要はありません。

あなたは、rng内、Searchとして渡された値を見つけようとし、その後、とColumnによって相殺いくつかによって得られた値を返している場合は、上にあるものワークシートrng知る必要はありません。

Excelの式(おそらく細胞シート4 D6で!):

=RelativeSearch("b",Sheet1!A1:A6,3,2) 

コード範囲A1検索します:値のシート1におけるA6「b」を、次いで3行未満であるセルから値を返すと2列右:

Function RelativeSearch(Search, rng As Range, Row, Column) 
    Dim r As Range 
    Set r = rng.Find(What:=Search, LookIn:=xlValues, LookAt:=xlWhole) 
    If r Is Nothing Then 
     RelativeSearch = CVErr(xlErrNA) 
    Else 
     RelativeSearch = r.Offset(Row, Column).Value 
    End If 
End Function 

(あなたはそれが VLOOKUPの構文と一致するようにしたい場合は、 r.Offset(Row, Column)ではなく r.Offset(Row - 1, Column - 1)を使用する必要があります。)

関連する問題