2017-01-23 11 views
0

私は、結果を探しているすべてのセルをポーリングするよりもずっと速いので、 "Find"関数に基づいて結果を操作するためにUDFにVBAを使用しようとしています。UDFでVBAコードを検索するときにFindPreviousを使用できますか?

エラーを再現するための基本に戻ってきましたが、この部分には「オブジェクト変数またはブロック変数が設定されていません」エラーが表示されますSearchRange.FindPrevious.Address(行を停止してエラーを取得する、デバッグモードの外でエラーを返さずにUDFを終了する)

次のようなキッカーがあります:このようなシートでUDFを使用しようとするとエラーが発生します:=testfind("3206-1",E:E)ただし、ウィンドウのようにVBEのように:?testfind("3206-1",Range("E:E"))私は$E$15295の正しい結果がエラーなしで取得します。

コードは次のとおりです。

Function TestFind(FindString As String, SearchRange As Range) 
Dim ActiveAddress As Range 
Set ActiveAddress = SearchRange.Find(FindString) 
TestFind = SearchRange.FindPrevious.Address 
End Function 

はL42の変化に修正し、今では動作します:

Function TestFind(FindString As String, SearchRange As Range) 
Dim ActiveAddress As Range 
Set ActiveAddress = SearchRange.Find(FindString) 
TestFind = SearchRange.Find(FindString, , , , , xlPrevious).Address 
End Function 
+0

...あなたはおそらく 'Eを配置する必要がされていますか?イミディエイトウインドウのクエリがどのように '' E:E "'を持っているかに注目してください。 – BruceWayne

+0

@ダンこの機能は大丈夫です。このエラーは、 'FindString'が範囲内に見つからない場合にのみ発生します。したがって、 'Error Handler'を使用してください。 'Sub'から' Function'を呼び出してください。 – harun24hr

+0

ありがとうございますが、それは範囲を予期しており、デバッグウィンドウは二重引用符を使用しているため、VBAで範囲が指定されている方法です。 –

答えて

1

EDIT1:

このコード

TestFind = SearchRange.FindPrevious.Address 

これは、以前に示唆した:あなたはダンが経験したものとして、ワークシート関数としてそれを使用するとき

TestFind = SearchRange.FindPrevious(ActiveAddress).Address 

は動作しません。
以下は質問に直接答えるのではなく、代わりの方法です。

代替:FindメソッドのSearchDirection引数を変更してください。

Function TestFind2(FindString As String, SearchRange As Range) 
    Dim ActiveAddress As Range 
    Set ActiveAddress = SearchRange.Find(FindString, , , , , xlPrevious) 
    TestFind2 = ActiveAddress.Address 
End Function 

注:エラーハンドラを追加して、一致するものが見つからないトラップを検出する必要があります。オリジナルの式から呼び出すときに引用符でE`:

どのようにテストするには:

Sub marine() 
    Debug.Print TestFind(4, [A:A]) 
End Sub 
+0

同じエラー。構文上のエラーがあると、イミディエイトウィンドウで呼び出されたときにも機能しなくなります。 –

+0

@DanDonoghue本当に?ちょうどテストされ、それは私の最後に動作します。 – L42

+0

あなたの編集は完全に動作します:)。助けてくれてありがとう。 –

関連する問題