14歳の自分に衝撃の事実を告げてください

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/04/04 15:52

こんにちは。

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つ開くだけでしょうが。
補足をお願いします。
では。

この回答への補足

うまく質問が出来ていませんで申し訳ないです。
また、よろしくお願いします。

> 質問文からすると、30個のCSVファイルの内容を1つのファイル(WriteFileName)に読み込むということでしょうか。
そうです、20020301~20020331というファイルを読み込みます。

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

補足日時:2002/04/04 13:56
    • good
    • 0

>Print #2, strArg(i)


のところを、
Print #2, strArg(i);
         ↑セミコロン
(行送りは「Print #2,」で)にするか、
strTmp = strArg(i) & strArg(i+1) & ...(なんたら)
と、一旦、1行分の文字列にしてから書き込んだり・・・
で、解決するとは思いますが、

CSVって、結構いろいろあるので、AccessVBAならテンポラリのテーブルをつくって、そいつをエクスポートしてやると、あとあと便利ですよ。

まぁ、どうするかは、臨機応変に・・・

この回答への補足

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

補足日時:2002/04/04 12:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報