• 締切済み

VBAでJavaのように関数の引数に関数を渡す方法

やりたいことは、テキストファイルを読み込んで「一行ずつ何か処理」をさせたいです。 この、「一行ずつ何か処理」の部分を引数に渡し、関数の中身で「ファイルを1行ずつ読み込む」部分を実装する方法はないでしょうか。 <イメージ> Function ReadFile(path As String, eachFunc As Fcuntion)  Set fso = CreateObject("Scripting.FileSystemObject")  Set tso = fso.OpenTextFile(path)  Do Until tso.AtEndOfStream   Call eachFunc(tso.ReadLine)  Loop End Function 予め一行ずつ読み込む処理を作っておきモジュールとして使いたいです。 よろしくお願いします。

みんなの回答

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.4

こんにちは x = ReadFile("ファイルパス") のファイルパスの部分にテキストファイルへのフルパスに変更すれば動くと 思いますよ。 但し、処理の部分は先頭の項目だけイミディエイトウィンドウに表示しているので テキストファイルはCSVにしておいて下さい。 後の方の回答は処理用にファンクションを名前で引き渡してますけど、ダメですか?

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんにちは 「一行ずつ何か処理」が必ず「一行ずつ」で、「何か処理」の部分だけ関数名 で、指定するなら、簡易的に、 Dim v As Variant Sub test()   Dim x As Variant   x = ReadFile("ファイルパス", "eachFunc") End Sub Function ReadFile(path As String, fName As String) As Variant   Dim fso As Object   Dim tso As Object   Set fso = CreateObject("Scripting.FileSystemObject")   Set tso = fso.OpenTextFile(path)   Do Until tso.AtEndOfStream     v = tso.ReadLine     Application.Run fName   Loop End Function Function eachFunc()   Debug.Print Split(v, ",")(0) End Function なんて、ダメですよね・・・

oilon11
質問者

補足

「何か処理」の部分は予め作っておくのではなく、都度、変えたいのです。

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.2

ご希望の通りそのままの記述はVBAでは無理ですが、クラスを使って似たようなことは可能です。 詳しくは以下を。 http://qiita.com/rai_suta/items/c07b22130b302682b729

oilon11
質問者

補足

コールバックできる関数名が予め決まってしまいますよね。 Javaのようにはできないのでしょうか。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは そのイメージではダメなのですか? Sub test()   Dim x As Variant   x = ReadFile("ファイルパス") End Sub Function ReadFile(path As String) As Variant   Dim fso As Object   Dim tso As Object   Set fso = CreateObject("Scripting.FileSystemObject")   Set tso = fso.OpenTextFile(path)   Do Until tso.AtEndOfStream     Call eachFunc(tso.ReadLine)   Loop End Function Sub eachFunc(v As Variant)   '取り敢えず   Debug.Print Split(v, ",")(0)   '実際の処理 End Sub

oilon11
質問者

補足

・・・。 動かせますか?

関連するQ&A