• ベストアンサー

Access VBAで読み込んだ配列をcsvファイルにエクスポート 

VBA初心者です。 Access VBAで読み込んだ配列をcsvファイルにエクスポートしているのですが、 配列が1列ずつではなく1行ずつエクスポートされてしまいます。 どこが悪いかは大体予想がつくのですが、どうすればいいか分かりません。 また、複数のファイルを読み込んで1つのファイルにエクスポートするため、 いちいち「55:ファイルは既に開かれています」と表示されます。 これもどうにかならないでしょうか? よろしくお願いします。 Private Sub cmd_Click() On Error GoTo Err_cmd_Click Dim strArg() As String Dim Contents As String Dim ReadFileName As String Dim WriteFileName As String Dim i As Integer Dim inp As Long Dim cnt As Integer Dim temp As String '1行のデータの仮置き inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動 For cnt = 0 To 30 ReadFileName = "P:\dl_engine\logs1\service\" & inp + cnt ' ファイル読込 Open ReadFileName For Input As #1 Do Until EOF(1) Line Input #1, temp Contents = Contents & temp & vbCrLf Loop Close #1 strArg = Split(Contents, " ") ' スペースで分割 WriteFileName = "C:\Contents\ザ★スクリーン\auDownLoadLog.csv" ' ファイル保存 Open WriteFileName For Output As #2 For i = 0 To UBound(strArg) Print #2, strArg(i) Next i Next cnt '正常終了 Exit_cmd_Click: Exit Sub 'エラー処理 Err_cmd_Click: Beep Select Case Err.Number Case Else MsgBox Err.Number & ":" & Err.Description End Select Resume Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

内容を見ると、Access2000以上と思いますが、動かす環境が無いため、机上デバッグです。 LineInputしたtempをSplitしているので、tempがデータの行単位でこれをカンマ表示すると解釈しました。 うまくいけば、Excelに読み込める。これが目的? Access2000なら、Splitしたら『,』を使ってJoinできなかった?(Excel2000か?) 手を加えてみました。動くかな???(止まったらごめんなさい) ↓ Private Sub cmd_Click()   On Error GoTo Err_cmd_Click   Dim strArg() As String   Dim Contents As String   Dim ReadFileName As String   Dim WriteFileName As String   Dim i As Integer   Dim inp As Long   Dim cnt As Integer   Dim temp As String '1行のデータの仮置き   inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動   '============ 保存ファイルは1つのように見える。最初に宣言 =========   WriteFileName = "C:\Contents\ザ★スクリーン\auDownLoadLog.csv"   '保存ファイルを開く   Open WriteFileName For Output As #2   '===================================================================   For cnt = 0 To 30     ReadFileName = "P:\dl_engine\logs1\service\" & inp + cnt     ' ファイル読込     Open ReadFileName For Input As #1     Do Until EOF(1)       Line Input #1, temp       strArg = Split(temp, " ") ' スペースで分割       '====== CSVファイルなのでカンマで分けた文字列にする =================       'CSVなのにカンマがない。カンマを付加する箇所を付けてみた。       'Access2000? ならJoin関数がある?当方、Access97のためよく分からず       'tempにスペースがない場合があるのか       temp = strArg(0)       For i = 1 To UBound(strArg)         temp = temp & "," & strArg(i)       Next i       '====================================================================       Contents = Contents & temp & vbCrLf     Loop     Close #1     '========= 1ファイル分のデータを書く ================     '========= ContentsにvbCrLfがあるので改行しない=======     Print #2, Contents;     '========= Contentsをクリア ==========================     Contents = ""     '=====================================================   Next cnt   '======= ファイルを閉じる ===   Close   '============================ '正常終了 Exit_cmd_Click:   Exit Sub 'エラー処理 Err_cmd_Click:   Beep   Select Case Err.Number     Case Else       MsgBox Err.Number & ":" & Err.Description   End Select   Resume Next End Sub

t_n_t
質問者

お礼

さっそく試したところ、一発で動きました。 大変たすかりました。一昨日からVBAと格闘してまして、 頭を悩ませており、ここでお世話になってます。 本当にありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 質問文からすると、30個のCSVファイルの内容を1つのファイル(WriteFileName)に読み込むということでしょうか。 その場合、最初の30個のファイルの構成はどうなっていて、それをどのような構成でWriteFileNameに書き出すのでしょうか。 最初の30個のファイルの各行を、そのままWriteFileNameに1行ずつ書き出すのでしょうか。それとも1行の中のカンマで区切られたいくつかのデータを、WriteFileNameでは1行ずつばらして書き出したいのでしょうか。 また、30個のファイルのデータは順番につなげて書き出すのでしょうか。 質問の方法だと、Contentsにファイルの内容をそのまま、まるごと書き出します。(カンマとかダブルクォーテーションもそのまま) したがって、Contentsを配列変数にして、Contents(0)からContents(29)までをつなげて(AllContentsとする)、書き出すファイルに一度に Print #2, AllContents とすれば、30個のファイルをそのまま縦につなげた形になります。 それからエラーの件ですか、cntのForループの中に Open WriteFileName For Output As #2 という文があるのが原因ですので、Forループの外(一番前)でOpenし、Forループの外(一番後ろ)でCloseして下さい。 なお、このエラーはファイル番号2がすでに開かれているのに、また開こうとしたためのエラーで、このようなことが起こらないように、FreeFile関数でファイル番号を取得します。 FreeFile関数は、使用されていないファイル番号を自動的に探して返す関数で、使い方は、 Dim fileNum As Integer fileNum = FreeFile Open WriteFileName For Output As #fileNum という感じです。 ただし、今回の場合はおそらくOutPut用のファイルは1つ開くだけでしょうが。 補足をお願いします。 では。

t_n_t
質問者

補足

うまく質問が出来ていませんで申し訳ないです。 また、よろしくお願いします。 > 質問文からすると、30個のCSVファイルの内容を1つのファイル(WriteFileName)に読み込むということでしょうか。 そうです、20020301~20020331というファイルを読み込みます。 > 1行の中のカンマで区切られたいくつかのデータを、WriteFileNameでは1行ずつばらして書き出したいのでしょうか。 また、30個のファイルのデータは順番につなげて書き出すのでしょうか。 30個のファイルの1行のなかの半角スペースで区切られたデータをばらして ファイルの順番通りに出力したいのです。 1行の中身がABCとすると、現状では A B C とこれの繰り返しとなっています。 これをA B C(各セル)に出力したいのですが。 よろしくお願いします。

すると、全ての回答が全文表示されます。
  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

>Print #2, strArg(i) のところを、 Print #2, strArg(i);          ↑セミコロン (行送りは「Print #2,」で)にするか、 strTmp = strArg(i) & strArg(i+1) & ...(なんたら) と、一旦、1行分の文字列にしてから書き込んだり・・・ で、解決するとは思いますが、 CSVって、結構いろいろあるので、AccessVBAならテンポラリのテーブルをつくって、そいつをエクスポートしてやると、あとあと便利ですよ。 まぁ、どうするかは、臨機応変に・・・

t_n_t
質問者

補足

うまく質問ができていませんでした。 これだと配列が1行分にされてしまいます。 一旦、1行のものを配列に分割にしているので、現状ですと A B C というふうに配列が1行ごとに出力されてしまいます。 そうではなく、 ABC・・・というふうに各列ごとに出力したいのです。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう