2017-08-17 16 views
0

基本的にVLOOKUPを実行しようとしていますが、セルの内容が長すぎて処理するにはVLOOKUPが処理できません。従って私は定義された範囲全体を検索するために、このVBAスクリプトを使用しますExcel - VBAで範囲を検索

Function betterSearch(searchCell, Range As String) 

     For Each cell In Range 
      If cell.Value = searchCell.Value Then 
        betterSearch = "Match" 
        Exit For 
      End If 
      betterSearch = "No match" 
     Next 

End Function 

機能は、(例えば)と呼ばれている:=betterSearch(B33;'Master'!C:C)

しかし、私は単一の出力を得ることができません。私はクロスアイになっています、私は何の間違いをしていますか?

+3

「Range as String」は「Range as Range」ではありませんか? – dwirony

+2

変数は、既存のメソッドと同じ名前であってはなりません。 'betterSearch(searchCell、Range As Source)'が良いでしょう。 –

答えて

1

私は何が間違っているのですか?

いくつか。

  • パラメータRangeStringとして宣言され、それがRangeオブジェクトであるかのように明確に使用されています。それはAs Rangeと宣言されるべきです。
  • Rangeの名前はGlobal.Rangeで、これは問題ではない場合があります(の場合は)。既存の宣言をより広い範囲で隠す/隠すことは、一般的には悪い考えです。
  • この関数は暗黙的にPublicです。明示的にそうであればより良い。
  • パラメータは暗黙のうちにByRefに渡されますが、正当な理由はありません。彼らはByValを渡す必要があります。
  • パラメータsearchCellは暗黙的にVariantですが、あたかもそれがRangeオブジェクトであるかのように使用されます。それはAs Rangeと宣言してください。
  • 関数は暗黙的にVariantを返しますが、実際にはStringを返します。戻り値のタイプには、署名にAs Stringを指定する必要があります。
  • ローカル変数cellは宣言されていません。つまり、オンザフライで暗黙的にVariantです。明示的に宣言してください、As Range
  • 宣言されていない変数でコンパイルされたコードにはOption Explicitが指定されていません。つまり、VBAは喜んでコンパイルして任意の入力ミスを実行します。愚かな恥ずかしい問題を避けるために、すべての単一モジュール、の先頭にOption Explicitと指定し、はすべての変数を宣言します。
  • "No Match"戻り値は、すべての反復で不必要に再割り当てされます。
  • 関数名はcamelCaseですが、すべての単一のVBAタイプライブラリのパブリックメンバーは一貫してPascalCaseです。
  • インデントが一貫していません。

Rubberduck(私が管理しているオープンソースのVBEアドインプロジェクト)は、静的コード分析でこれらの点のほとんどを取り上げていました。

Option Explicit 

Public Function BetterSearch(ByVal searchCell As Range, ByVal source As Range) As String 
    Dim cell As Range 
    For Each cell In source 
     If cell.Value = searchCell.Value Then 
      BetterSearch = "Match" 
      Exit Function 
     End If 
    Next 
    BetterSearch = "No match" 
End Function 

それはBooleanではなく、「魔法の文字列を」返した場合IMO機能がはるかに有用であろう。見つかった場合はTrue、見つからない場合はFalse

+0

ありがとうございました。私はあなたのコメントのほとんどを理解していますが、私は次の奇妙なことに遭遇します。ソース範囲がsearchCellと同じワークシート上にある場合は機能しますが、範囲が異なるワークシート上にある場合は#VALUE!を返します。エラー? – Tampert

+0

GAH、typo/copy + pasteエラー...「For Each Cell In Source」 - 固定でなければなりません。 –

+0

それは私がキャッチ;)しかし、それはちょうどワークシートを越えて動作しません? – Tampert

関連する問題