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
No.1
- 回答日時:
>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・・・というふうに各列ごとに出力したいのです。
よろしくお願いします。
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つ開くだけでしょうが。
補足をお願いします。
では。
この回答への補足
うまく質問が出来ていませんで申し訳ないです。
また、よろしくお願いします。
> 質問文からすると、30個のCSVファイルの内容を1つのファイル(WriteFileName)に読み込むということでしょうか。
そうです、20020301~20020331というファイルを読み込みます。
> 1行の中のカンマで区切られたいくつかのデータを、WriteFileNameでは1行ずつばらして書き出したいのでしょうか。
また、30個のファイルのデータは順番につなげて書き出すのでしょうか。
30個のファイルの1行のなかの半角スペースで区切られたデータをばらして
ファイルの順番通りに出力したいのです。
1行の中身がABCとすると、現状では
A
B
C
とこれの繰り返しとなっています。
これをA B C(各セル)に出力したいのですが。
よろしくお願いします。
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
さっそく試したところ、一発で動きました。
大変たすかりました。一昨日からVBAと格闘してまして、
頭を悩ませており、ここでお世話になってます。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
Access 1レコードずつcsvで出力したい
その他(データベース)
-
YES/NO型の値
Excel(エクセル)
-
-
4
パラメータが少なすぎます。1を指定して下さい。""
Excel(エクセル)
-
5
レコードセットにnullの場合
Visual Basic(VBA)
-
6
Accessのテーブル、クエリをCSV形式でエクスポートしたい
Access(アクセス)
-
7
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
-
8
AccessでSQL結果を直接csvに書き出すには?
Word(ワード)
-
9
VBAでCSVファイルの特定行を書き換える方法はあるのでしょうか?
その他(プログラミング・Web制作)
-
10
Accessのテーブルからcsv出力する際に一部のフィールドを除いて出力したい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
共有フォルダに誰が何にアクセ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
tmpファイル なぜできる?削除...
-
Access VBA を利用して、フォル...
-
excelを共有ファイルにすると行...
-
複数ファイルのデータの統合に...
-
【アクセス】「ほかのユーザー...
-
月が変わったら自動でシートが...
-
JSONファイルの置き場所について
-
大量のCSVデータを行列の変換を...
-
mdbファイル フォームを開くと...
-
AccessVBAで作成したExcelファ...
-
HttpWebRequestのレスポンスを...
-
【VBA】異なる行だけを抜き出す...
-
VBAでCSVファイルが使用中かど...
-
(Excelマクロ)datファイルをエ...
-
iniファイル内の行を削除する方法
-
MATLABで波形を一周期ごとに区...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共有フォルダに誰が何にアクセ...
-
【Excel】[Expression.Error] ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
VBAでCSVファイルが使用中かど...
-
月が変わったら自動でシートが...
-
tmpファイル なぜできる?削除...
-
AccessVBAで作成したExcelファ...
-
Access VBA を利用して、フォル...
-
(Excelマクロ)datファイルをエ...
-
事務の派遣で働いています。多...
-
Excel VBA 処理後データが重た...
-
excelを共有ファイルにすると行...
-
【アクセス】「ほかのユーザー...
-
XMLデータを変換し印刷する方法
-
CSVの項目行を削除して一つのフ...
-
mdbファイル フォームを開くと...
-
社内Excel共有ブックでの保存ト...
-
ファイルの途中に文字列を挿入
-
拡張子が「cda」のファイルを聞...
おすすめ情報