• ベストアンサー

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

  • t_n_t
  • お礼率80% (34/42)

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

  • ベストアンサー
  • 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

  • access VBAでのファイル読み込みとその保存方法

    昨日も質問させていただいたVBA初心者です。 いろいろ調べましたが解決しなかったので、 またまた質問させていただきます。 ファイルを読み込んで、それを別ファイルに保存したいのですが、 下記ですと、1行のみ保存されるだけでした。 この方法ですと、すべて保存されるはずと書かれていたのですが。 全くどこが悪いのか分かりません、よろしくお願いします。 Private Sub cmd_Click() On Error GoTo Err_cmd_Click Dim ReadFileName As String Dim Contents As String Dim WriteFileName As String ReadFileName = "P:\dl_engine\logs1\service\20020223" ' ファイルを読み込む Open ReadFileName For Input As #1 Input #1, Contents Close #1 WriteFileName = "C:\Contents\data\Melody.csv" ' ファイルに保存 Open WriteFileName For Output As #2 Write #2, Contents Close #2 '正常終了 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

  • Access VBAで行ラベルが定義されていないというエラーが出ます

    VBA初心者です。 下記のソースで行ラベルを定義しているつもりなのですが、 なぜか行ラベルが定義されていませんというコンパイルエラーがでます。 よろしくお願いします。 Private Sub cmd_Click() On Error GoTo Err_cmd_Click <---ここ Dim inp As String Dim cnt As Integer inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動 For cnt = 1 To 31 'インポート・フルパス名作成 If (cnt) < 9 Then strImportFileNameM = "M:\PdxLog\KabeKaKinA" & inp & "0" & cnt + 1 & ".csv" DoCmd.TransferText acImportDelim, , "KabeDownLoad", strImportFileNameM, False Else strImportFileNameM = "M:\PdxLog\KabeKaKinA" & inp & cnt + 1 & ".csv" DoCmd.TransferText acImportDelim, , "KabeDownLoad", strImportFileNameM, False End If Next cnt '正常終了 Exit_cmd_Click: End Sub 'エラー処理 Err_cmd_Click: Beep Select Case Err.Number Case Else MsgBox Err.Number & ":" & Err.Description End Select Resume Next End Sub

  • VBAでCSVファイルを読み込もうとしていますが、

    VBAでCSVファイルを読み込もうとしていますが、 「ファイルが見つかりません」とエラーが表示されます。 どのように対処していいのかわかりません。 教えてくください。 Sub readCsv() Dim csvFile As String Dim ch As Integer Dim csvStr As String Dim str() As String Dim i As Integer Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) targetFolder = oFolder.Items.Item.Path Set fso = CreateObject("Scripting.FileSystemObject") Set fileList = fso.GetFolder(targetFolder).Files For Each file In fileList csvFile = file.Name ch = FreeFile Open csvFile For Input As #ch i = 1 Do While Not EOF(1) Line Input #ch, csvStr Close #ch str = Split(csvStr, ",") Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop Next End Sub

  • アクセス2007VBAのクエリのエキスポート

    お世話になります。 以下の様にアクセス2007のクエリを エクセルにエクスポートのVBAを作成したところ うまく動作しません。 どこか構文が間違ってるのでしょうか? Private Sub トグル2_Click() Dim acc1 As String Dim exce1 As Variant acc1 = "q_有給付与後" ecxe1 = "G:\MOCF05602\大信\エクスポートテスト.xlsx" DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel12Xml, acc1, exce1, True MsgBox "エクスポート完了★" End Sub

  • ACCESS エクスポート ダイアログ ファイル名取得

    ACCESS2003で作成したデータをダイアログで指定したファイル名でエクスポートしたいのですが、上手くできません。 ダイアログが開きその指定したフォルダーにあるエクセルファイルを選択すれば、正常にエキスポートできるのですが、 開いたダイアログにファイル名を入力すると、それ以降動かなくなります。 基本的なことが間違っているのでしょうか?? 詳しい方教えてください。下記にコードした内容を書きました。 よろしくお願いします。 Private Sub cmbTransExcel_Click() On Error GoTo Err_cmbTransExcel_Click Dim fileSaveName As Variant Set dlg = Application.FileDialog(msoFileDialogOpen) With dlg .Title = "チェック" .ButtonName = "エキスポート" .InitialFileName = "C:\Program Files\DATA\" .InitialView = msoFileDialogViewList .AllowMultiSelect = False .Filters.Clear .Filters.Add "xls", "*.xls" End With With dlg If .Show = -1 Then For Each vntPath In dlg.SelectedItems strPath = vntPath Next Else Set dlg = Nothing Exit Sub End If End With Set dlg = Nothing Dim strac As String Dim varxls As Variant Dim strmsg As String strac = "Q_チェック" 'Accessファイルを指定します。 varxls = strPath 'エクセルファイルを指定します。 strmsg = strac & " を、Excelファイルへ出力します。" & Chr(13) & _ "出力先は" & varxls & "、 シート名は" & strac & "です。" & _ Chr(13) & "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, strac, varxls, True MsgBox "EXCELの出力が正常終了しました。", vbInformation, "処理終了" End If Exit_cmbTransExcel_click: Exit Sub Err_cmbTransExcel_Click: MsgBox "EXCELの出力が異常終了しました。", vbCritical, "エラー!" Resume Exit_cmbTransExcel_click End Sub

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • access2000のVBAのことで教えてください。

    プログラム初心者でプログラム作った方がいきなり辞めてしまって困ってます。 市販の本とか見ても解りませんし、質問の仕方も良くわかりませんが 教えてください。 マクロの項目には何も無くマウスクリック時のイベントプロシージャでボタンを作ってるようです。 下記のプログラムですがクエリどこの命令文なるのですか? Private Sub 顧客名検索_Click() On Error GoTo Err_顧客名検索_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = \"F_顧客名検索\" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_顧客名検索_Click: Exit Sub Err_顧客名検索_Click: MsgBox Err.Description Resume Exit_顧客名検索_Click End Sub

  • アクセスにて検索フォームを作りたい

    お世話になります。 アクセス初心者です。 会社名検索フォームに会社名を入力して表示コマンドをクリックすると 会社フォームの入力した会社が表示されるようにしたいのです。 現在は、表示コマンドをクリックすると会社フォームが開きます。 どの会社名を打ち込んでもNo.1のレコードしか開きません。 つまり会社フォームが開く という指示をしているだけです。 コードなど全く分かりません。 ただ、本を見て真似て下記の通り入力してみました。 間違っているor足りない ということはわかっていますが、 どう入力すれば良いのかわかりません。 教えて下さい。よろしくお願いいたします。 Private Sub cmd表示_Click() On Error GoTo Err_cmd表示_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "会社フォーム" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_cmd表示_Click: Exit Sub Err_cmd表示_Click: MsgBox Err.Description Resume Exit_cmd表示_Click End Sub

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • AccessのVBAに関しての質問です。

    クエリで抽出したファイルをCSVで出力させ、出力したファイル名を「連番&ファイル名」の形にしたく 下記のコードを使用しました。 6ファイルは出力は成功したのですが、7ファイル目を出力しようとしたところ、「#6:オーバーフロウしました。」とエラーがでてきてしまいます。 原因やここのコードを変えれば直るというのが、お分かりになる方がいればご教示頂けますでしょうか。 初心者ですのでコードも書いて頂けると非常に助かります。 Private Sub コマンド4_Click() On Error GoTo ErrorTrap Dim varAccess As Variant Dim varCPass As Variant Dim strmsg As String varAccess = "ASN抽出" Dim FolderPass As String Dim FileName As String Dim CheckCount As Integer FolderPass = "C:¥Users¥エクスポート¥" FileName = "_STORE_ASN_TRN.csv" CheckCount = 0 Do Until Dir(FolderPass & FileName) = "" CheckCount = CheckCount + 1 FileName = Format(CheckCount, Len(CStr(CheckCount)) + 1) & "_STORE_ASN_TRN" & ".csv" Loop varTextPass = FolderPass & FileName strmsg = "csvファイルへ出力します。" & Chr(13) & _ "出力先は" & varTextPass & "です。" & _ "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferText acExportDelim, , varAccess, varTextPass, False MsgBox "データ出力は、正常に完了しました。" End If Exit Sub ErrorTrap: If Err.Number = 3044 Then ' MsgBox "パス指定が誤っています。", vbCritical Else MsgBox "予期せぬエラーが発生しました。(#" & Err.Number & " : " & Err.Description & ")", vbCritical End If End Sub

専門家に質問してみよう