#既に種々の回答が付いていますが、お示しのコードの「図」を拝見して考えられることを少し。
●1)先ず、「p=array.indexof(str,"い")」のところが赤くなっていますが、これはコンパイルエラーですよね。
「array」という言葉は予約語(Array 関数)であるため、変数としては使えないはずです。
試しに、「Dim array as Object」などと書こうとすると、「array」の部分が選択された状態で、「コンパイルエラー: 修正候補: 識別子」と表示されます。
http://officetanaka.net/excel/vba/error/compilation_error/error_3.htm
●2)次に、「indexof」という関数自体についてですが、
Sub Macro1()
Dim myAL As Object
Set myAL = CreateObject("System.Collections.ArrayList")
For i = 1 To 3
myAL.Add Mid("あいう", i, 1)
Next i
p = myAL.indexof("い", 0) + 1
MsgBox p & "番目"
End Sub
みたいな使い方なら動かすことはできなくはありません。
しかし、pucho3338 さんがお示しのコード
p = indexof(str, "い")
に書かれているような、第1引数が「配列」、第2引数が「配列の要素」となるっているものが、どの言語の [IndexOf メソッド] なのかが判りかねます(言語によって引数の数や種類が異なる)。
http://social.msdn.microsoft.com/Search/ja-JP?query=indexof&ac=4
しかも、次行には、
p = array.indexof(str, "い")
というように、関数の前にオブジェクト(array)が配置されていますが、(1)で書きましたように、この行も動かないはずです。
この2行を拝見しただけでも、まともに動くコードとは思えませんので、これは、「友人に頼まれ修正」する前のコードではなくて、pucho3338 さんご自身が、修正時点でつまづかれたところだけを抜き書きされたコードではないかと存じますが、いかがでしょうか?
●3)この「コンパイルエラー: Sub または Function が定義されていません。」エラーが出ないようにするためには、下記のいずれかの処置がされている必要があるかと存じます。
・何かのライブラリに参照設定を施す。
・[CreateObject 関数] で ActiveX オブジェクトへの参照を作成する。
・別途、下記のようなユーザー定義関数が定義されている。
Function indexof(myArr, element)
For i = 0 To UBound(myArr)
If myArr(i) = element Then Exit For
Next
indexof = i + 1
End Function
●4)しかし、
p = array.indexof(str, "い")
という書き方から見ると、求める「p」は「2」ではないかと存じますが、その「答え」が欲しいだけでしたら、わざわざ関数を作らなくても、
p = Application.Match("い", str, 0)
でイケルかと存じますが、実は、「IndexOf メソッド」だけではなくて、「Sort メソッド」や「Contains メソッド」などが使いたいというようなことでしたら、
http://social.msdn.microsoft.com/Search/ja-JP?query=arraylist&refinement=108%2C117&ac=4
に検索された「ArrayList クラス」を使うことになろうかと存じます。
VBAだから、DOT NET の関数やオブジェクトは使えません。
与えられた文字列配列の中から参照文字列を検索して、要素位置を返す関数を作ってください。
Private Function ArraySearch(arrStr() as string, refStr as String) As integer
Dim posL As Integer
Dim posU As Integer
Dim pos As Integer
posL = LBound(arrStr)
posU = UBound(arrStr)
ArraySearch = -1
For pos = posL To posU
If arrStr(pos) = refStr Then
ArraySearch = pos
End If
Next pos
End Function
※テキストエディタ上で書いたので、ステートメントや関数が間違っているかも知れません。
お礼
回答ありがとうございます。 説明不足でした、すみません。 私が p = array.indexof(str, "い") で欲しかった値は str の中にある "い"の番号(何番目)です。 For文やIfを使えば割り出せるんですが、なんとか1文で出来ないか、できるはず!って思った為質問しました。 もともと.Netでの開発をしていたので「できるはず!」って思ったのかもしれません。 DOUGLAS_さんの p = Application.Match("い", str, 0)で欲しかった答えが出ました。 Application.Matchという方法があるなんて知りませんでした。 ベストアンサーにさせていただきます。