CSVファイルの改列について

タグの編集
投稿者 Ara  (社会人) 投稿日時 2013/12/5 08:59:16
VB6を使用しております。始めての投稿となります。
うまく伝わらない部分もあるかもしれませんが宜しくお願い致します。

現在、CSVファイルへデータを書き出したいと思っています。
以下に例を挙げます。
書き出す内容としてはエクセルでCSVファイルを開いた際に、A列へ縦に0から4まで。
その後、隣のB列へ5から9までを書き出したいと思っています。

a = 0

For i = 0 to 4
a = a & Str$(i) & vbCrLf

Next i

'☆

b = 0

For j = 5 to 9
b = b & Str$(j) & vbCrLf

Next j

上記までのデータをa & bと繋げて書き込むと、A列へ縦に0から9までの
数字が書き込まれることは確認済。aとbの間で改列したいので、☆の部分で
a & ","として改列、或いは最後にa & "," & bとして書き込むと、
4の右下に5がずれて(B列6行目)、6から9まではまたA列へ戻ってしまいます。

結果として、0の隣に5を入れたいのに入らない。かつ、6から9についても
B列へ移動しないので、2つの問題が解決できていない状況です。

お手数をお掛け致しますが、何か解決策等ございますでしょうか。
ご教示、宜しくお願い致します。
投稿者 るきお  (社会人) 投稿日時 2013/12/5 09:11:30
たぶん、このようなCSVファイルになれば目的は達成できるのですよね?
0,5
1,6
2,7
3,8
4,9


だから、プログラムからはこのようなCSVファイルを作成すればよく、
そのためにはたとえば、次のようになると思います。

For i = 0 To 4
    a = a & i & "," & (i + 5) & vbCrLf
Next i

これで a をCSVファイルに書き込めば上記のようになる(はず)なので、
Excelで開けばA列、B列に並んで見えるのではないでしょうか。

※動作確認していません。




投稿者 Ara  (社会人) 投稿日時 2013/12/5 09:36:18
ご回答ありがとうございました。確かに、
0,5
1,6
2,7
3,8
4,9
となれば目的は達成されます。
ただ、私の質問の仕方がやはり悪かったようで、
aはaでの処理、bはbでの処理と分かれる必要があります。
うまく伝えられず、申し訳ございません。

①最初の処理で、aの変数に縦に0から4までの数値が格納される。
②次の処理で、bにも縦に5から9までの数値が格納される。
その後、①と②を合わせて
0,5
1,6
2,7
3,8
4,9
として書き出したい、というのが目的となります。

ちなみに、この作業を行単位でやれば(行の場合はvbCrLfではなくカンマ区切り)、
問題ないことは確認できております。ただ、データが長くなる可能性がある為、
列単位で同じことができないか、というところで本問題へぶつかっております。
列単位では、このような書き出し等は、やはり難しいのでしょうか。。。
投稿者 shu  (社会人) 投稿日時 2013/12/5 11:55:27
1つのファイルで希望の動作をさせるには
毎回ファイル全体を書き換える必要があります。

効率をよくするにはa,b毎にファイルを分けることも
考えた方がよいかもしれません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2013/12/5 11:59:06
> a = 0
> For i = 0 to 4
>   a = a & Str$(i) & vbCrLf

これだと、数字の前に空白が入り、さらに先頭に 0 が追加されますよ。

すなわち、
「0↵1↵2↵3↵4↵」や
「0↵1↵2↵3↵4」ではなく、
「0 0↵ 1↵ 2↵ 3↵ 4↵」にってしまう
…ということです。(↵は改行と思ってください)


> 書き出す内容としてはエクセルでCSVファイルを開いた際に、A列へ縦に0から4まで。
> その後、隣のB列へ5から9までを書き出したいと思っています。
こんな方法は如何でしょうか。


Const adInteger = 3     '整数型を表す定数 

Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")

'最初に、列情報を定義する 
rs.Fields.Append "A列", adInteger
rs.Fields.Append "B列", adInteger

'処理開始 
rs.Open

'まずは A 列に値をセット 
For i = 0 To 4
    If rs.EOF Then
        rs.AddNew "A列", i
    Else
        rs.Collect("A列") = i
    End If
    rs.MoveNext
Next
If Not rs.BOF Then rs.MoveFirst     '先頭に戻す 


'B 列に値をセット 
For j = 5 To 9
    If rs.EOF Then
        rs.AddNew "B列", j
    Else
        rs.Collect("B列") = j
    End If
    rs.MoveNext
Next j
If Not rs.BOF Then rs.MoveFirst     '先頭に戻す 
    
    
'結果をCSVな文字列として取り出す 
csv = rs.GetString(RowDelimeter:=vbCrLf, ColumnDelimeter:=",", NullExpr:="")
    
'一応確認 
Debug.Print csv
MsgBox csv, vbInformation


'並び替えもできる。 
If Not rs.BOF Then rs.MoveFirst     '先頭に戻す 
rs.Sort = "B列 DESC, A列 ASC"   'B列の降順 
csv = rs.GetString(RowDelimeter:=vbCrLf, ColumnDelimeter:=",", NullExpr:="")
MsgBox csv, vbInformation, "ORDER BY B DESC, A"
rs.Sort = ""


'絞り込みもできる。 
If Not rs.BOF Then rs.MoveFirst     '先頭に戻す 
rs.Filter = "A列 >= 1 AND B列 <= 7"
csv = rs.GetString(RowDelimeter:=vbCrLf, ColumnDelimeter:=",", NullExpr:="")
MsgBox csv, vbInformation, "WHERE A>=1 AND B<=7"
rs.Filter = ""


rs.Close    '閉じる 
投稿者 Ara  (社会人) 投稿日時 2013/12/5 13:27:02
アドバイス・ご回答ありがとうございました。
始めての質問にも関わらず、たくさんのご回答があり大変参考になりました。
またこのような機会があった際には宜しくお願い致します。