OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.246784
  • 閲覧数1419
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 80% (34/42)

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
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル13

ベストアンサー率 68% (791/1163)

内容を見ると、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

お礼率 80% (34/42)

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

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 26% (267/1014)

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

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

まぁ、どうするかは、臨機応変に・・・
補足コメント
t_n_t

お礼率 80% (34/42)

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

  • 回答No.2
レベル14

ベストアンサー率 51% (1179/2272)

こんにちは。maruru01です。 質問文からすると、30個のCSVファイルの内容を1つのファイル(WriteFileName)に読み込むということでしょうか。 その場合、最初の30個のファイルの構成はどうなっていて、それをどのような構成でWriteFileNameに書き出すのでしょうか。 最初の30個のファイルの各行を、そのままWriteFileNameに1行ずつ書き出すのでしょうか。それとも ...続きを読む
こんにちは。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

お礼率 80% (34/42)

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

> 質問文からすると、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:54
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ