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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q\_vti_pvt\service.lckが開けないため、書き込めません。

新旧二つのパソコンがLANでつないであります。

新:XP+officeXP(FRONTPAGEなし)
旧:98SE+office2000(FRONTPAGEあり)

これまで旧でweb作成をしていたのですが、旧の外付けだったHDを新に接続しました。

「MyWeb」もこのHDにあります。そこで、旧から新の外付けであるこのHDの「MyWeb」にあるwebを開こうとしたら、タイトルのようなエラーメッセージが出て開けません。

新の方からはこのwebは開けます。

また、LANによるファイルの共有は問題なく出来ます。

XP用のFRONTPAGEを購入せずに、旧でそのままweb作成をしたいのですが、このエラーを解決する方法はあるのでしょうか?

面倒なお尋ねで申し訳ありませんが、よろしくご教示下さい。

Aベストアンサー

以下のサイトが参考になればよいのですが・・・

参考URL:http://support.microsoft.com/kb/303255/ja

QAccessVBAで「dim dbs as database」がエラーになる

済みませんが、非常に基本的なことを聞かせていただきたいと思います。

AccessのVBAで関数を実行すると、いきなりエラーになりました。
dim dbs as database の文でエラーになり、「コンパイルエラー ユーザ定義型が定義されていません」というエラーメッセージが出ました。
databaseが定義されているような感じです。

どうすれば宜しいでしょうか?

Aベストアンサー

こんにちは。maruru01です。

VBEの画面のメニューの[ツール]→[参照設定]で、

「Microsoft DAO X.X Object Library」(X.Xはバージョン)

の項目にチェックが入っていますか?

ちなみに、DatabaseオブジェクトはDAOしかないのでいいですが、Recordsetオブジェクトなどは、ADOとDAOの両方にあるので、

Dim rs As DAO.Recordset

のように、どちらかを明確に記述しないといけません。
統一的で分かりやすいコーディングのためには、Databaseオブジェクトも、

Dim dbs As DAO.Database

のように記述するように心がけましょう。

Q変数の宣言の名称を教えてください。(Dim i As Long)

Dim i As Longについて

「dim」→?
「i」→変数名
「As」→?
「Long」→変数の型

というように、dimとAsがなんと言えばいいのかわかりません。
アドバイスよろしくお願いします。

Aベストアンサー

>「i」→変数名
という形と合わせるのなら、以下のような感じでしょうか?
(意味についてのご質問ではないと受け取りました)

Dim・・・ステートメント
     変数の(型)宣言に用いる
AS・・・・キーワード
     変数や関数の型を示したり、フォルダ(やファイル)名を
     示したりするのに用いる

Q文字列の入っているString値、何も入力されていないString値、Null値の全てを表示されるには?

access2003です。
フォーム1とクエリ1とテーブル1があります。
クエリ1の「テーブル1の番号フィールド」の抽出条件に
「Like "*" & [Forms]![フォーム1]![番号テキスト] & "*"」と入力しています。

フォーム1の番号テキストに「1」を入力しコマンドホ゛タンを押すと
「1」を含むレコードを表示され

フォーム1の番号テキストに「*」を入力しコマンドホ゛タンを押すと
何かしらの文字列が入力されているレコート゛が表示されます。

しかし
テーブル1番号フィールドには、
Null値と何も入力されていないString値(""←が入っている)も含まれています。
(見た目は空白どちらも空白です)
(String値がある理由はADOを使って何も入力されてない値もまとめてレコードに追加している為)

ここで質問なのですが

フォーム1のコマンドホ゛タンを押したときに
文字列の入っているString値、何も入力されていないString値、Null値の全てを表示されるには
どうすればいいのでしょうか?

よろしくお願い致します。

access2003です。
フォーム1とクエリ1とテーブル1があります。
クエリ1の「テーブル1の番号フィールド」の抽出条件に
「Like "*" & [Forms]![フォーム1]![番号テキスト] & "*"」と入力しています。

フォーム1の番号テキストに「1」を入力しコマンドホ゛タンを押すと
「1」を含むレコードを表示され

フォーム1の番号テキストに「*」を入力しコマンドホ゛タンを押すと
何かしらの文字列が入力されているレコート゛が表示されます。

しかし
テーブル1番号フィールドには、
Null値と何も入力...続きを読む

Aベストアンサー

> 何も入力されていないString値、Null値
は、
Len(Nz([フィールド名],"")) = 0 で得られます。

全てということであれば、
Len(Nz([フィールド名],"")) >= 0 になると思います。

Q実行時エラー'-2147467259(80004005)':

エクセルからADOでアクセスに繋ごうとしたときに
実行時エラー'-2147467259(80004005)':
マシン'マシン名'のユーザー'Admin'がデータベースを開けない状態、またはロックできない状態にしています。

というエラーが出てしまいます。

書いているコードは以下です。

Public cn As ADOdb.Connection
Set cn = New ADOdb.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"



test.mdb自体はテーブルもクエリもフォームも何も開いていない状態です。
一度アクセスを終了させて再起動させればうまくできるのですが、何が原因でこのメッセージが出るのでしょうか?
もしわかれば教えてください。
よろしくお願いします。

Aベストアンサー

Accessで、test.mdbを開いた状態(テーブルも、クエリも、フォームも何も開かない状態)で、ExcelからADOで接続しようとすると、
「-2147467259"は既に使用されているので、使用できませんでした。」
というエラーが再現されました。(当方Office2000Pro)
そういうものなのでしょう。
何をなさりたいのですか?
AccessからExcelを起動して、データの移し替えをしたり、レポート代わりに印刷させたりという方法ではダメなのでしょうか?
何をしたいかという、切り口で質問をされてはいかがですか。


人気Q&Aランキング

おすすめ情報