• ベストアンサー

CSVファイルへの保存の際、データが途中で切れてしまいます。

はじめまして。初心者になりますが、よろしくお願いします。 visual basic 2008を使って、研究で数値シミュレーションを組んでいるのですが、 その値をcsv形式で出力した際に、値の終わりの方が消えてしまう現象が出てしまいます。 具体的には、(出力データ数,xの値,zの値)という形でファイルに書き込んでいくのですが、 出力データ数を1001個にした際、保存したファイルをExcelやメモ帳で開くと、 最後が、(991,0.111540025,0.2)といった形となってしまい。値の数が合わないのです。 他にも出力データ数の値を変えて試してみましたが、 出力データ数が101個の際には、実際保存されたのは97個 出力データ数が2001個の際には、実際保存されたのは1998個 出力データ数が5001個の際には、実際保存されたのは4988個 となります。 いずれも、途中は完全に保存されていて、最後の部分のみ保存されていない(途中で切られている)といった状況です。 デバッグで切られている部分も値が存在していることは確認できていますので、 おそらく保存する際の間違いだと思うのですが、原因がわかりません。 すみませんが、ご指導をお願いします。 (以下、保存のためのプログラムを記します) Private Sub RK_ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rk_ToolStripMenuItem.Click 'ルンゲクッタデータを保存するためのモジュール Dim myStream As Stream Dim saveFileDialog1 As New SaveFileDialog() Dim s As String = "" If save_flag = False Then MsgBox("Error!!" & vbLf & "データがありません。") Else saveFileDialog1.Filter = "csv files (*.csv)|*.csv|txt files (*.txt)|*.txt|All files (*.*)|*.*" saveFileDialog1.DefaultExt = "csv" saveFileDialog1.FilterIndex = 1 saveFileDialog1.RestoreDirectory = True saveFileDialog1.OverwritePrompt = True If saveFileDialog1.ShowDialog() = DialogResult.OK Then myStream = saveFileDialog1.OpenFile() Dim sw As StreamWriter = New streamWriter(myStream) If (myStream IsNot Nothing) Then For i As Integer = 0 To n s = t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString sw.WriteLine(s) Next i myStream.Close() MsgBox("ファイルへの書き込みが終了しました") End If End If End If End Sub

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.6

Flashを呼ぶとは StreamやStreamWriterのFlashメソッドを呼ぶということです Closeを実行する前に sw.Flash() myStream.Flash() などを挿入してみてください 投稿されているコード内容は実際に不具合の出るコードと同じなのでしょうか Try/Catchなどの例外処理などはされていませんか

lapis-amul
質問者

お礼

>>redfox63 様 ご指摘いただいたように sw.Flush() myStream.Flush() のどちらかを組み入れるだけで、最後までうまく保存できました。 どうやらバッファの情報がうまくファイルに送信されていなかったことがうまくいかなかった原因のようです。 それがなぜ起こったかは、まだよくわかっていないのですが、kunkun_129さんの方法でもうまくいったということからも考えると、ファイルの入力処理を頻繁にやりすぎたことも、その一つの原因かもしれません。 おかげで原因がわかり、解決もできましたので、回答を締め切らせていただきます。お手数おかけしました。 >投稿されているコード内容は実際に不具合の出るコードと同じなのでしょうか そのとおりでした。 >Try/Catchなどの例外処理などはされていませんか 例外処理は使っていませんでした。

その他の回答 (5)

回答No.5

ANo.4の回答で1行間違っていたので再度書き込みます。失礼しました。 ソースを見て感じた事と最後に解決へのヒントを述べたいと思います。 貴方のソースから見ると、 ファイルのOpen for 書き込み内容の処理 ファイルへの書き込処理 next ファイルのClose 大まかに上の様になっています。今回のサンプルプログラムは 書き込み内容の処理、ファイルへの書き込処理それぞれ1行づつの 単純なものなので、さほど問題もないが、それでも原因不明のバグ に悩まされるものです。ソースを見る限りなぜ書き込みがうまくいかない のか不思議です。 ただ言える事は、ソースがバグの出やすい構造になっている事です。 故に原因が、ファイルへの書き込みで起こっているのか、書き込み内容の 作成段階で間違っているのか、原因がつかみにくいです。 上の様なソースの書き方は、CPUのメモリの少なかった時代(10年前) のソースの書き方だとおもいます。 現在では、メモリは使いきれない位あるので下の様にコーディングする 事を進めます。そうする事によって、バグが発見し易くなります。 '--------------------------------------------------------------- ' 変数に書き込み内容をどんどんためていきます。 '--------------------------------------------------------------- s="" For i As Integer = 0 To n s += t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString ' <==== ここが間違っていた。 S+= の「+」が抜けていました。 Next i ' <========== '--------------------------------------------------------------- ' ファイルの書き込み '--------------------------------------------------------------- myStream = saveFileDialog1.OpenFile() Dim sw As StreamWriter = New streamWriter(myStream) sw.WriteLine(s) myStream.Close() 上の様にコーディングする事によって、利点は沢山あります。  (1).<==== のマークでブレークポイントを設けて変数Sの内容を    確認する事によって、今回の内容が、ファイルへの書き込みで起こっているのか、    書き込み内容の作成段階で間違っているのかはっきりする。  (2).今回は For と Next の間の行がわずか2行ですが、大きなプログラムだと    20行も30行もある時があります。    そうすると、ファイルへの書き込みとデータの作成が混在してどこでバグが    出ているのか判りにくい。分ける事によってバグが出にくくなります。  (3).ファイルはハードディスクを利用する為、出来るだけ、ファイルのOpenとClose は短時間で処理するのが理想です。ファイルをOpenしたら出来るだけ1行で    書き込み、直ぐにCloseする事によって、ハードディスク等の破損を防ぐ事が    できます。  (4).ファイルStreamに書き込むより、変数にデータを書き込むのがレスポンスが    格段に早い 以上、解決のヒントになれば幸いです。

lapis-amul
質問者

お礼

>>kunkun_129 様 わかりやすい丁寧な解説、どうもありがとうございました。 ご指摘の通り、変数への書き込みの後にファイルへの書き込みを行うと、確かにうまく書き込むことができました。 ファイルのOpenとCloseに関しては、できるだけ早く書き込むことがハードディスク的にも安全なのですね。初めて知りました。 バグを少なくするための考え方や、レスポンスの観点なども勉強になりました。本当にありがとうございました。 なお、redfox63様のご指摘(Stream.Flushメソッドを加えるだけ)でも、うまくいきましたことをご報告します。 (いただいたプログラムで s += t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString & vblf と変更しました)

回答No.4

ソースを見て感じた事と最後に解決へのヒントを述べたいと思います。 貴方のソースから見ると、 ファイルのOpen for 書き込み内容の処理 ファイルへの書き込処理 next ファイルのClose 大まかに上の様になっています。今回のサンプルプログラムは 書き込み内容の処理、ファイルへの書き込処理それぞれ1行づつの 単純なものなので、さほど問題もないが、それでも原因不明のバグ に悩まされるものです。ソースを見る限りなぜ書き込みがうまくいかない のか不思議です。 ただ言える事は、ソースがバグの出やすい構造になっている事です。 故に原因が、ファイルへの書き込みで起こっているのか、書き込み内容の 作成段階で間違っているのか、原因がつかみにくいです。 上の様なソースの書き方は、CPUのメモリの少なかった時代(10年前) のソースの書き方だとおもいます。 現在では、メモリは使いきれない位あるので下の様にコーディングする 事を進めます。そうする事によって、バグが発見し易くなります。 '--------------------------------------------------------------- ' 変数に書き込み内容をどんどんためていきます。 '--------------------------------------------------------------- s="" For i As Integer = 0 To n s = t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString Next i ' <========== '--------------------------------------------------------------- ' ファイルの書き込み '--------------------------------------------------------------- myStream = saveFileDialog1.OpenFile() Dim sw As StreamWriter = New streamWriter(myStream) sw.WriteLine(s) myStream.Close() 上の様にコーディングする事によって、利点は沢山あります。  (1).<==== のマークでブレークポイントを設けて変数Sの内容を    確認する事によって、今回の内容が、ファイルへの書き込みで起こっているのか、    書き込み内容の作成段階で間違っているのかはっきりする。  (2).今回は For と Next の間の行がわずか2行ですが、大きなプログラムだと    20行も30行もある時があります。    そうすると、ファイルへの書き込みとデータの作成が混在してどこでバグが    出ているのか判りにくい。分ける事によってバグが出にくくなります。  (3).ファイルはハードディスクを利用する為、出来るだけ、ファイルのOpenとClose は短時間で処理するのが理想です。ファイルをOpenしたら出来るだけ1行で    書き込み、直ぐにCloseする事によって、ハードディスク等の破損を防ぐ事が    できます。  (4).ファイルStreamに書き込むより、変数にデータを書き込むのがレスポンスが    格段に早い 以上、解決のヒントになれば幸いです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

書き込んでいる先はローカルドライブでしょうか? StreamやStreamWriterをCloseする前に Flashを呼んでみても一緒ですか

lapis-amul
質問者

補足

お手数をおかけしています。 >>書き込んでいる先はローカルドライブでしょうか? デスクトップやドキュメント内にcsvファイルとして保存させ、それをExcelやメモ帳で開いて確認しています。OSはvistaです。 >>StreamやStreamWriterをCloseする前に Flashを呼んでみても一緒ですか? 申し訳ありません。「Flashを呼ぶ」の部分がよくわかりませんでした。 下記サイトのように、あらかじめ用意しておいたswfファイルに、値を読み出すということでしょうか? http://www.crossdrive.net/tips/vb_each_swf

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.2

こんにちは。 机上ベースですが・・・ 1. StreamWriter に writeLine してもらって close してもらうのでは?? プログラムは、myStream に close を送っているように見えます。 2. New StreamWriter でインスタンスオブジェクトの生成にトライしていますが、myStream が Nothing か比較していますが、これも sw 変数に代入されたかどうかを検査したかったのでは??

lapis-amul
質問者

お礼

ご指摘ありがとうございました。

lapis-amul
質問者

補足

こんにちは。お手数をおかけしています。 初心者故の間違いをお許しください。 この部分のプログラムに関しては、msdnの以下のサイトのサンプルコードを基に設計したのです。 1.で指摘していただいた間違いには気付きませんでした。 2.に関してですが、おそらくsavefiledialogで代入されたファイル名(=mysteam)が 空欄でないかをチェックしているものと思っているのですが。(間違いかもしれません。) http://msdn.microsoft.com/ja-jp/library/system.windows.forms.savefiledialog.openfile.aspx http://msdn.microsoft.com/ja-jp/library/6ka1wd3w(VS.80).aspx 早速、以下のように修正したのですが、問題は解決されませんでした。 (上記サイトではUsingが使われていたので、それも試してみたのですが。) 間違いがありましたら、ご指摘ください。 (以下、修正されたプログラムを記します) Private Sub RK_ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rk_ToolStripMenuItem.Click 'ルンゲクッタデータを保存するためのモジュール Dim myStream As Stream Dim saveFileDialog1 As New SaveFileDialog() Dim s As String = "" If save_flag = False Then MsgBox("Error!!" & vbLf & "データがありません。") Else saveFileDialog1.Filter = "csv files (*.csv)|*.csv|txt files (*.txt)|*.txt|All files (*.*)|*.*" saveFileDialog1.DefaultExt = "csv" saveFileDialog1.FilterIndex = 1 saveFileDialog1.RestoreDirectory = True saveFileDialog1.OverwritePrompt = True If saveFileDialog1.ShowDialog() = DialogResult.OK Then myStream = saveFileDialog1.OpenFile() If (myStream IsNot Nothing) Then ' Code to write the stream goes here. Using sw As StreamWriter = New StreamWriter(myStream) For i As Integer = 0 To n s = t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString sw.WriteLine(s) Next i sw.Close() End Using MsgBox("ファイルへの書き込みが終了しました") myStream.Close() End If End If End If End Sub

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Forループの回数を制御する変数nはどこで宣言されているのでしょうか? モジュールの引数として渡されているようには見えません。 本当に「nは意図する回数の値」になっているのでしょうか? 定数とすることはできませんか? h

lapis-amul
質問者

補足

お手数おかけします。 ・nの定義について nはクラスの最初に宣言ステートメントで、他の変数と共に Dim n As Integer = 100 '区間の数 Dim t_temp(n), x_temp(n), z_temp(n) As Double と定義しています。 その後、nをコンボボックスの値を代入するために、あるボタンを押すと n = Val(combo_n.Text) ReDim t_temp(n), x_temp(n), z_temp(n) '要素数の変更に対応するため再定義 となるようにしています。 その後、t_temp(n), x_temp(n), z_temp(n)はある関数で計算されます。(値を見ると正しく計算されているようです。) ・nの値の確認 先ほどのプログラムの saveFileDialog1.OverwritePrompt = True の下に Debug.Print(n) Debug.Print(z_temp(n)) Debug.Print(z_temp(n - 1)) Debug.Print(z_temp(n - 2)) Debug.Print(z_temp(n - 3)) を入れて確認してみたところ、私が意図した値となっていました。 しかし、保存すると、数が少なくなってしまいます。 また、先ほどのプログラムでnの部分を定数にしてみたのですが、 同じ結果となりました。

関連するQ&A

  • 【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

    添付図のような、Excel2003で作成した表内のデータを CSVで保存するマクロを作成したのですが、 図のように、CSVファイルに「""」で値が囲まれた状態で、 保存されてしまいます。 下記にマクロを記載しますので、 どうすれば文字列が「""」で囲まれずに、 カンマ区切りだけのデータで出力されるのか、 ご存知の方おられましたら、ご教示お願い致します。 Sub csv保存() Dim フォルダ名 As String Dim パス名 As String Dim ファイル名 As String Dim データ As Variant Dim 行数 As Long, 列数 As Integer Dim i As Integer, j As Long, k As Long ファイル名 = "test.csv" フォルダ名 = "csv" パス名 = ActiveWorkbook.Path & "\" & _ フォルダ名 'csvフォルダが存在しなければ作成する If Dir(パス名, vbDirectory) = "" Then MkDir パス名 End If ChDir パス名 Open ファイル名 For Output As #1 For i = 1 To Worksheets.Count Worksheets(i).Activate Worksheets(i).Cells(1, 1).Select ActiveCell.CurrentRegion.Select 行数 = Selection.Rows.Count 列数 = Selection.Columns.Count For j = 1 To 行数 For k = 1 To 列数 - 1 データ = Selection.Cells(j, k) _ .Value Write #1, データ; Next k Write #1, Selection.Cells(j, 列数) _ .Value Next j Next i Close #1 End Sub

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • EXCEL→CSV形式で別ファイルに保存

    EXCELデータ内のある1つのシートのデータをそのまま別ファイル(CSV)に保存したいのですがうまくいかないので教えてください。 本を見ながらこのようなマクロを作ったところ、EXCEL(○○.xls)の指定したシート(keihi)のみをCSV形式で別フォルダ(C:\経費振替)に保存することができたんですが、 元のEXCELも、ファイル名称・形式がCSV(○○.xls→keihi.csv)に変わってしまいます。 エクセルのファイル名、形式は変えずにできる方法ってありますか?? Sub データはきだし() Dim Ret As String Dim Res As Integer Dim FolderName As String Set WK1 = Worksheets("1 依頼書") Set WK4 = Worksheets("keihi") FolderName = "C:\経費振替" Ret = Dir(FolderName, 16) If Ret = "" Then Res = MsgBox("DATA保管用フォルダを作成します。", vbYesNo) If Res = vbYes Then MkDir FolderName End If End If ' Dim Res2 As Integer Res2 = MsgBox("DATAを作成します。", vbYesNo) WK4.Select If Res2 = vbYes Then With WK4 .SaveAs Filename:=FolderName & "\keihi", FileFormat:=xlCSV ←多分ココが何か間違ってるのだと思うんですが。 End With

  • C#でのcsv保存

    今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします. int R,C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string[] cdata = new string[R]; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; for (int Gdata = 1; Gdata < R; Gdata++) { string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value); cdata[Gdata] = c; //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv"; //if (saveFileDialog1.ShowDialog() == DialogResult.OK) //{ // int cdata = Convert.ToInt16(c); // cdata.saveNewCSVdata(saveFileDialog1.FileName); //} } //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する if (sfd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //選択された名前で新しいファイルを作成し、 //読み書きアクセス許可でそのファイルを開く //既存のファイルが選択されたときはデータが消える恐れあり System.IO.Stream stream; stream = sfd.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream); sw.Write(cdata); //閉じる sw.Close(); stream.Close(); } }

  • デスクトップ上のCSVファイルの削除について

    いつもお世話になっております。 VBAでまた難問に詰まってしまいました。ご教授お願い致します。 別のフォルダに保存されているマクロを利用して、とあるデータを作成するのですが 途中でデスクトップ上に一回保存をしたCSVファイルを最後に削除する という動きをさせたいです。 下記のマクロだと、マクロとCSVファイルがデスクトップ上にあれば削除出来るのですが マクロは常にとあるフォルダに保管されており、使用する人間はバラバラです。 ※CSVファイルの他に3種類程データを作成するのですが  マクロを使った人が使っているPCのデスクトップ上に保管する事になっております。  上記の事から、Killステートメントでファイル指定が出来ない状態(不特定のデスクトップ)です。   Sub test() Dim myPath As String Dim i As String myPath = ThisWorkbook.Path & "\" i = "テストデータ.csv" If InStr(i, ".csv") = 0 Then i = i & ".csv" If Dir(myPath & i) <> "" Then Kill myPath & i Else End If End Sub 不特定のデスクトップ上にあるcsvファイルを削除する事は可能でしょうか? 以上、宜しくお願い致します。 環境 WindowsXP Excel2003

  • CSV出力に関して

    開発環境:Visual Basic 2008 教えて下さい。 あるホームページを参考に、CSV出力のプログラム(下記)を作成していますが、その際に、 どうやらデータは出力されているももの、ファイルを開いてもデータの中身が見れません。 メモ帳で開くとデータは存在しています。 何か記述漏れ等ありますでしょうか? 初歩的なトラブルで申し訳ありませんが、教えて下さい。 よろしくお願いします。 《記述内容》 Dim dt As DataTable = CType(G_DATA.DataSource, DataTable) '保存先のCSVファイルのパス Dim csvPath As String = "C:\test1.csv" 'CSVファイルに書き込むときに使うEncoding Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("Shift_JIS") '開く Dim sr As New System.IO.StreamWriter(csvPath, False, enc) Dim colCount As Integer = dt.Columns.Count Dim lastColIndex As Integer = colCount - 1 'ヘッダを書き込む Dim i As Integer For i = 0 To colCount - 1 'ヘッダの取得 Dim field As String = dt.Columns(i).Caption '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) 'レコードを書き込む Dim row As DataRow For Each row In dt.Rows For i = 0 To colCount - 1 'フィールドの取得 Dim field As String = row(i).ToString() '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) Next row '閉じる sr.Close()

  • ADOによるCSVファイルからのデータ取得

    EXCELVBAを用いて、ADODB.CONNECTIONによりデータを取得しようと思い、ネットで調べた プログラムを使ってみたのですが、途中のレコードまでしか取得できませんでした。 ちなみに、データを取得しようと思っているもとのCSVファイルのサイズは10GB超、レコード数は 800万行程度あります。 これが、数十MB程度のファイルだと問題なかったのですが、レコード数などに制限はあるのでしょうか。 ご教示いただけますと幸いです。 用いたマクロの構文は以下のとおりです。 Dim con As New ADODB.Connection Dim connectionString As String Dim csvFilePath As String Dim rs As ADODB.Recordset Dim colNo As Long Dim fileNumber As Long Dim Buffer As String 'CSVファイルが置かれているフォルダ csvFilePath = E:\ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvFilePath & ";" _ & "Extended Properties=""Text;HDR=NO;FMT=Delimited""" 'コネクションオープン con.Open connectionString 'ここでSQL文によりレコードを取得します。 Set rs = con.Execute("SELECT COUNT(*) FROM XXX.CSV") fileNumber = FreeFile Open OutputFolder & Application.PathSeparator & OutputFile For Output As #fileNumber Buffer = "" ’ヘッダーの出力 For colNo = 0 To rs.Fields.Count - 1 If Buffer <> "" Then Buffer = Buffer & "," End If Buffer = Buffer & rs.Fields(colNo).Name Next Print #fileNumber, Buffer ’データの出力 Do While rs.EOF = False Buffer = "" For colNo = 0 To rs.Fields.Count - 1 If Buffer <> "" Then Buffer = Buffer & "," End If Buffer = Buffer & rs.Fields(colNo).Value Next Print #fileNumber, Buffer '次のレコード rs.MoveNext Loop Close #fileNumber 'クローズ con.Close Set rs = Nothing Set con = Nothing End Sub

  • CSVファイルの読み込みVBA作成について

    初めまして。 色々インターネット等で検索して作成してみたのですが、 ここから先のプログラムが組めないので、 やり方を教えて頂けますと幸いです。 おそらくIf Elseで場合訳すると思うのですが、 上手くできてません。 下記、プログラムの概要です。 (1)フォルダを指定し、そのフォルダにある全てのCSVファイルを読み込む。 (2)CSVファイルを読み込む際には、「*.csv」の「*」部分をワークシート名とし、CSVファイルの内容をワークシートに書き込む。 例)「test.csv」の場合、ワークシート名は「test」になります。 (3)既にブックにワークシート名がある場合は上書き処理を行い、ない場合は新規に作成する。 例)既に「test」ワークシートがある場合は、内容の上書きを行います。 (4)ワークシートを追加する際は、今あるワークシートの最後に追加する。 下記に現在作ったプログラムを記載します --------------------------------- Sub csvRead() Dim FoldPath As String Dim f Dim ch1 As Long Dim r As Long Dim textLine As String Dim csvLine() As String Dim i As Long Dim FSO Dim folderSelect As Object Set folderSelect = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If Not folderSelect Is Nothing Then FoldPath = folderSelect.Self.Path 'フォルダ選択 End If Set FSO = CreateObject("Scripting.FileSystemObject") i = Worksheets.Count '現在のワークシート数を格納 For Each f In FSO.GetFolder(FoldPath).Files If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then ch1 = FreeFile Open f.Path For Input As #ch1 r = 1 Worksheets.Add after:=Worksheets(i) With ActiveSheet .Name = Left(f.Name, Len(f.Name) - 4) Do While Not EOF(ch1) Line Input #ch1, textLine If textLine <> "" Then csvLine() = Split(textLine, ",") .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine() End If r = r + 1 Loop End With i = i + 1 Close #ch1 End If Next End Sub

  • ACCESSのCSV出力に関して

    教えて下さい。 ACCESSであるテーブルのデータをCSV出力しようとして、以下のような記述をしました。 結果、問題なく出力されましたが、データだけでなく、項目も出力しようと考えています。 その際にはどのような記述をすれば良いでしょうか? 初歩的な質問で申し訳ありません。 教えて下さい。 《内容》 Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim stSQL As String Dim stTBL As String Dim myWSH As Object 'WScript Dim myDesktopPath As String Dim stPath As String 'フルパス Dim objFSO As Object 'FileSystemObject Dim fsoTS As Object 'TextStream Dim tmp As Variant 'データ Dim re As Variant 'データ件数 Dim stDocName As String Const ForAppending = 8 stTBL = "t_合算" 'テーブル名 '開始メッセージ stDocName = "「" & stTBL & ".CSV」 ファイルをデスクトップに作成します" If MsgBox(stDocName, vbYesNo) = vbNo Then Exit Sub 'デスクトップパス取得 Set myWSH = CreateObject("WScript.Shell") myDesktopPath = myWSH.SpecialFolders("Desktop") Set myWSH = Nothing 'フルパス stPath = myDesktopPath & "\" & stTBL & ".CSV" '読み取り専用でセット Set cnn = CurrentProject.Connection stSQL = "SELECT * FROM " & stTBL Set rst = cnn.Execute(stSQL) If rst.EOF Then stDocName = "出力するデータがありませんでした" Else '文字列データ格納 (全データ出力、カンマ区切り) tmp = rst.GetString(adClipString, , ",", vbNewLine) '出力 Set objFSO = CreateObject("Scripting.FileSystemObject") With objFSO If .FileExists(stPath) Then '既存ファイル削除 Call .DeleteFile(stPath) End If Set fsoTS = .OpenTextFile(stPath, ForAppending, True) '文字列一括書き出し fsoTS.WriteLine tmp re = fsoTS.Line - 2 End With Set fsoTS = Nothing: Set objFSO = Nothing stDocName = re & " 件の CSVデータを出力しました。" End If MsgBox stDocName, vbOKOnly

  • ExcelシートをCSVファイルにする

    Excel2000を使用してます。 Excelブックに3つのシートがあります。 シート1はメインシートとして「ボタン1」「ボタン2」が存在してます シート2はインプットデータ用シート シート3はアウトプットデータ用シートです シート1の「ボタン1」を押すとVBAが実行されシート2の情報を読み、 シート3に算出結果を出力する仕組みです。 次にシート1の「ボタン2」を押すとシート3の内容をCSVに出力したいのですが、 下記のロッジクではうまくいきません。 どこを修正すればよいのでしょうか? Sub CSV出力() Dim ONAME As String Dim しーと As Worksheet Dim 新しーと As Worksheet Dim PAS As String 'OUTパス名 PAS = ThisWorkbook.Path ONAME = PAS & "\" & "出力.CSV" '出力しーと Sheets("出力").Select Set しーと = ActiveSheet Set 新しーと = Worksheets.Add With 新しーと しーと.Copy .Move End With With ActiveWorkbook .SaveAs Filename:=ONAME, FileFormat:=xlCSV .Close False End With End Sub

専門家に質問してみよう