- 締切済み
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 予め一行ずつ読み込む処理を作っておきモジュールとして使いたいです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは x = ReadFile("ファイルパス") のファイルパスの部分にテキストファイルへのフルパスに変更すれば動くと 思いますよ。 但し、処理の部分は先頭の項目だけイミディエイトウィンドウに表示しているので テキストファイルはCSVにしておいて下さい。 後の方の回答は処理用にファンクションを名前で引き渡してますけど、ダメですか?
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 「一行ずつ何か処理」が必ず「一行ずつ」で、「何か処理」の部分だけ関数名 で、指定するなら、簡易的に、 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 なんて、ダメですよね・・・
- kawais070
- ベストアンサー率52% (2242/4283)
ご希望の通りそのままの記述はVBAでは無理ですが、クラスを使って似たようなことは可能です。 詳しくは以下を。 http://qiita.com/rai_suta/items/c07b22130b302682b729
補足
コールバックできる関数名が予め決まってしまいますよね。 Javaのようにはできないのでしょうか。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは そのイメージではダメなのですか? 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
補足
・・・。 動かせますか?
補足
「何か処理」の部分は予め作っておくのではなく、都度、変えたいのです。