1

VBA で関数を作成しましたが、これを呼び出す方法がわかりません。

Public Function FindTwoStrings(rng As Range, s1 As String, _
  s2 As String) As Integer
    'Application.Volatile
    If TypeName(rng) <> "Range" Then Exit Function
    Dim cell As Range
    Dim accumulator As Integer
    For Each cell In rng.Cells
        If (InStr(1, UCase(cell.Value), UCase(s1), _
          vbTextCompare) > 0) Or (InStr(1, UCase(cell.Value), _
          UCase(s2), vbTextCompare) > 0) Then _
          accumulator = Me.Cells(cell.Row, 5) + accumulator
    Next cell
End Function

セルでこの関数を呼び出すにはどうすればよいですか? 私はやろうとしまし=Find....たが、私の機能が見つかりません。不足している設定はありますか?

4

2 に答える 2

2

にユーザー定義関数を入れる必要がありますModules。フォームClasses、ワークシート、またはThisworkbook.

また、終了する前に関数の戻り値を設定する必要があります。そうしないと、常にデフォルト値の0.

ラインを再考する必要があるかもしれません

accumulator = Me.Cells(cell.Row, 5) + accumulator

UDF に渡されたもの以外にはアクセスできないためです。したがって、への参照Meは許可されません。

編集:コードが存在する非静的オブジェクトを参照するMeため、モジュール(UDFが存在する必要がある場所)でキーワード を使用してオブジェクトにアクセスすることはできませんが、モジュールは静的ですこれは非論理的です。Chris がコメントで指摘しているように、渡されなかったオブジェクトにアクセスすることは許可されていますが、キーワードを介してアクセスする代わりに、次のように明示的に参照する必要があります。MeMeMeThisWoorkBook.Sheets("sheetname").Cells(cell.row,5)

于 2013-04-08T19:43:45.820 に答える
0

いくつかのこと...

  1. Excel カスタム関数 (セルの数式で使用可能なキーワードとして表示される場所に作成しようとしている種類の関数) は、1 つのセルの値のみを変更できます。組み込みの Excel 関数 (=LEFT など) はすべて、それらが使用されているセルの値にのみ影響することに注意してください。

  2. Excel が探しているメソッド シグネチャは範囲です...例のように複数のパラメーターを受け入れるかどうかはわかりません。

  3. FindTwoStrings の値をどこにも設定しているようには見えません。これが、メソッドが返す値を知る方法です。

以下は、カンマで区切られた単一の文字列に範囲を連結するために私が書いた小さな関数の例です。=cvsRange( [ some range ]) で呼び出します

Function csvRange(myRange As Range)
    Dim csvRangeOutput As String
    For Each entry In myRange
      If Len(entry) > 0 Then
        csvRangeOutput = csvRangeOutput & entry.Value & ","
      End If
    Next
    If Len(csvRangeOutput) > 2 Then
         csvRange = Mid(csvRangeOutput, 1, Len(csvRangeOutput) - 1)
     Else
         csvRange = ""

      End If

End Function

HTH...

于 2013-04-08T19:47:25.383 に答える