• 締切済み

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/4282)
回答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

  • VBAで2変数の差分を取る方法  その2

    前回はありがとうございました。 まだ最終までは行ってないのですが、Wendyさんfumufumuさんに教えていただいたマクロともうまく動きます。 fumufumuさんの変数bufなんですが、この中身をシートに一行ずつ入れるにはどうするのでしょう。 Msgboxでは行ごとに綺麗に表示されす。 OpenAsTextStreamで開きReadAllで読み込んだbufの中身は配列になっているのでしょうか。 Splitで色々やってみたんですが、旨くいかいなです。 ---------------------------------------------------- Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(TXT).OpenAsTextStream .Skip size buf = .ReadAll .Close End With Set fso = Nothing MsgBox buf ------------------------------------------------------ fumufumuさんのDim fso As New FileSystemObjectでは動かなかったので Set fsoにするなど一部変えてあります。

  • VBS 改行無しのファイル抽出方法

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ path = "a.txt" Set FSO = WScript.CreateObject( "Scripting.FileSystemObject" ) '全行読み込み処理 (改行を1行単位として) Set f = FSO.OpenTextFile( path ) Do Until f.AtEndOfStream line = f.ReadLine() i_line = f.Line - 1 Loop WScript.Echo "全件数= " & i_line '最終行-5読み込み処理 Set f = FSO.OpenTextFile( path ) For i=1 To i_line - 6 f.SkipLine Next LAST5 = f.ReadLine() MOJI = Mid(LAST5,20,5) WScript.Echo "文字 = " & MOJI コード------------------------------------------------------------------ 上記VBSの簡単な流れは・・・ (1)改行で1行とみなす a.txt を全行取得。 (2)全件数を表示 (3)最終行から5行前の行まで移動。 (4)(3)の行から20文字からの5文字を取得。 (5)5文字を表示。 とこんな感じです。 しかし、これだと改行有のファイルにのみ有効で 改行無には対応出来ません。 例えば120文字で1行とみなすファイルでも同様の 取得がしたいのです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • 【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割

    【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割 ■プログラム及びファイルに関する備考 .\test\     = 分割を行いたいファイルが格納されたディレクトリ Dir_FileList.txt = testディレクトリ内のファイルをリスト化したもの。           相対パスにて、1行ずつ改行して記述する。 ■やりたい事 Dir_FileList.txtという、.\test\内に配置されたファイルをリスト化したtxtを 1行ずつ読み込み、読みこんだファイルに対し、10行毎に分割処理を行いたいと思っています。 分割したファイルは、分割元のファイルが格納されたディレクトリと同じ、.\test\ディレクトリに作成し、 分割前の元ファイルを最後に削除するという処理をリストに書かれた全てのファイルに対して行いたいです。 下記のようにコーディングをしたのですが、 どうも「Do Until ( fILE1.AtEndOfStream )」のループ文の処理が行われていない?ようで、 testディレクトリ内部のファイルが分割されません。 色々試したのですが、VBScriptを触るのは初めてでなかなか上手くいきませんでした。 どこが間違っていて、どのように修正すれば動くようになるでしょうか? お手数ですが、ご教授をお願い致します。 ---------------------------------------- Option Explicit Dim flReadFSO, flReadFSO2, fFolder, fILE, flrSubFolder Set flReadFSO = CreateObject("Scripting.FileSystemObject") Set flReadFSO2 = WScript.CreateObject("Scripting.FileSystemObject") Set fFolder = flReadFSO2.GetFolder(".") Dim name1, fILE1 name1 = fFolder & "\Dir_FileList.txt" Set fILE1 = flReadFSO.OpenTextFile(name1) Dim oneLineTxt oneLineTxt ="" Dim FSO set FSO = WScript.CreateObject("Scripting.FileSystemObject") Do Until ( fILE1.AtEndOfStream ) oneLineTxt = fILE1.ReadLine WScript.Echo oneLineTxt arg = ".\test\test01.txt" set fin = FSO.OpenTextFile(arg, 1) fbn = FSO.GetBaseName(arg) fen = FSO.GetExtensionName(arg) nf=0 set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 Do While Not fin.AtEndOfStream fout.WriteLine fin.ReadLine nl=nl+1 if nl>9 then fout.Close nf=nf+1 if nf>9 then exit do set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 end if Loop fin.Close FSO.DeleteFile arg, True Loop fILE1.Close ----------------------------------------

  • VBSでテキストファイルを作成

    こんにちは。 set fso = createobject("Scripting.FileSystemObject") fso.createfolder("倉庫") を実行すると、実行したスクリプトが存在する場所に「倉庫」という名のフォルダが作成されます。 その倉庫というフォルダの中にテキストファイルを作成するにはどうすればよいでしょうか? set fso = createobject("Scripting.FileSystemObject") fso.createfolder("倉庫") set fo = fso.opentextfile(FILENAME) close.fo 相対的にファイルの場所を指定する方法がわかりません。 絶対パスでないとだめなのでしょうか?

  • [VBS] 動的配列について教えてください!

    VBS初心者です。 以下のように、リストを読み込んで動的配列に持たせたいです。 ----------------------------------------------------------------- GET_FILE = "sample.txt" SET objFs = CreateObject("Scripting.FileSystemObject") ' 動的配列セット Call Array_Set("AryVal",GET_FILE) ' 表示 For i = 0 To Ubound(AryVal) msgbox AryVal(i) Next ' 終了 WScript.Quit 0 Function Array_Set(AryName,ReadFile) Set strVal = objFs.OpenTextFile(ReadFile) ' 1行づつ処理 Do While strVal.AtEndOfStream <> True i = i + 1 ReDim Preserve AryName( i - 1 ) AryName( i - 1 ) = strVal.ReadLine Loop End Function ----------------------------------------------------------------- 見て頂くと分かるとおり、動的配列として持たせたい変数名を Functionの引数として渡しています。(当然のごとくエラー、、、) Functionの引数として渡した値に動的配列が格納される方法があれば教えてください。 よろしくお願いします。

  • ファイル内容書き換えでエラーが発生

    webサーバのosがWin2000IISで正常に動作しているASPがあるのですが、このほど、webサーバをXPで構築したところ、エラーとなります。Win2000とXPの違いなのか、わからないのですが、私がWin2000のころに設定したことをし忘れているためXPでエラーになっているのかもわかりません。下記記述でエラーとなります。(当然、c:\wwwcnt\cnt_mem.txtは存在します) Microsoft VBScript 実行時エラー (0x800A0046) 書き込みできません。 po001.asp, line 7 よろしくお願いいたします。 <% set fso = server.createobject("scripting.filesystemobject") set tso = fso.opentextfile("c:\wwwcnt\cnt_mem.txt",1,false) c_mem = tso.readline c_mem = c_mem + 1 tso.close set tso = fso.opentextfile("c:\wwwcnt\cnt_mem.txt",2,true) tso.writeline c_mem tso.close %>

  • FileSystemObject Win2008Server

    FileSystemObject Win2008Server 今までのWin2003ServerをWindows2008サーバーに更新しました。 Accessデータベース関係は今まで通り処理出来るのですが FileSystemObjectを使ったTextファイルからの読み込みや加工が 出来なくなりました。 VBScriptで社内DBを稼働させています。 サーバーや設定の事はあまり詳しくないのですが 何をチェックすればいいのか、ご指導お願いします。 (1)これはエラーになりません Set connectObj = Server.CreateObject("ADODB.Connection") ConnectObj.Open "xxx" 以下Accessの読み書き (2)この実行でエラーになります。 Set fso = Server.CreateObject("Scripting.FileSystemObject") set tso = fso.OpenTextFile(fp,1) この実行でエラーになります。 以下テキストファイルの処理 お手数ですが宜しくお願いします。

  • VB6.0 CreateObject以外のファイルI/O

    以前CreateObject("Scripting.FileSystemObject")を使用してファイルを読込む方法、一行ずつ書込む方法を教えていただいたのですが。 環境によってはウイルスチェックに引っかかってしまうようで、別な手段を取らなければならなくなりました。 読込み: Set objFso = CreateObject("Scripting.FileSystemObject") Set objTxtSt = objFso.OpenTextFile(strFilePass, 1) strData = CStr(objTxtSt.ReadAll()) 書込み: Set objFso = CreateObject("Scripting.FileSystemObject") Set objTxtSt = objFso.OpenTextFile(strFilePass, 2, False) Call objTxtSt.WriteLine(strData) 現在の処理は以上です。 上記と同じ処理をCreateObjectを使用せずに作成するにはどのようにすればよろしいでしょうか。

  • VBA:2つのCSVファイルを開きたいです。

    エクセル2010のVBAにてCSVファイルを開き結合させるプログラムを組もうとしているのですが、2つ目のCSVファイルを開こうとすると、何故かエラーが出てしまいます。 -------------------------------------------------------------------------------- 1つ目 Sub mobile_FileSearch(Path As String) 'test.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call mobile_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "test.csv" Then Workbooks.Open ("test.csv") End If Next File End Sub ---------------------------------------------------------------------------- 2つ目 Sub local_FileSearch(Path As String) 'bbb.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call local_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "bbb.csv" Then Workbooks.Open ("bbb.csv")'←ここでエラー End If Next File End Sub ------------------------------------------------------------------------ まったく同じプログラムで、csvファイル名だけ変えただけで実行時エラー1004が出てしまいます。 一体全体何が問題なのでしょうか?

  • VBAでtxtを読み込みxlsで保存したい

    C:\Documents and Settings\All Users\デスクトップ\sample.txt は次のようなデータになっています。 A B C 1,234 567,890 23,333 1,234 567,890 23,333 このデータをVBAを使ってExcelに読み込み、C:\Documents and Settings\All Users\デスクトップ\sample.xls として保存にしたいのですが、どのようなコードを書けばよいものでしょうか? sub test() Dim fso, f, ts Dim sline As String Set fso = CreateObject("scripting.filesystemobject") Set f = fso.getfile("C:\Documents and Settings\All Users\デスクトップ\sample.txt") Set ts = f.openastextstream(1) Do While ts.atendofstream <> True sline = sline & ts.readline & vbCrLf Loop ts.Close ' MsgBox sline End Sub ここまでいったのですが、slineをexcelにだすことができません。 教えていただけると助かります・。

専門家に質問してみよう