お世話になっています。
VB6.0+JET4.0で簡単なアプリケーションを作成しています。
CSVにSQLで取得したレコードセットの内容を吐かせているのですが、
数値の末尾が"0"になってしまう項目があります。
DBにはちゃんと末尾には0以外のデータも格納されているのに
CSVに吐くと末尾だけ0になってしまいます。
15桁ある数値項目にだけこの現象がおこっているようです。(他は大丈夫でした)
要因は何でしょうか?
また解決策はございますでしょうか?
質問したものです。
よくよく検証してみると、
EXCELでこのcsvを閲覧した際にのみ、この現象がおこっているようです。
テキストエディタでオープンすると問題ありませんでした。
う〜む。VB側ではどうしもようもないのか。。。
>>要因は何でしょうか?
エクセルが勝手に編集を行っている。
>>また解決策はございますでしょうか?
そもそも、CSVファイルをExcelで見たときに・・・。
という考え方をどうにかしないといけないと思います。
CSVの最後が,,,,,,,,,,,,,,というようにすべてNULLなどのファイルを開いて、何もせずにCSV保存した後に、テキストエディタで開いてみてください。
あぁ〜、excelのCSV管理ってこの程度なんだと良くわかります。
>>う〜む。VB側ではどうしもようもないのか。。。
VB側というより、Excelの問題です。データは正しいのならば・・・。
>>EXCELでこのcsvを閲覧した際にのみ、この現象がおこっているようです。
デジタルデータとしてCSVファイルが、正しく出力されているのであるならば、
あとは、CSVファイルを読み込むアプリが編集を行っている
と思うの正常な考え方です。
CSVを出力し、EXCELで表示させる必要がある仕様の場合、
数値項目も文字列として扱って出力する。等の方法もあります。
が、個人的にCSVファイルを除いてみたという程度ならば、
そのまま捨て置くことです。
さささんの言うと降り、CSVファイルをエクセルで開いて編集というのは
プログラマ的にはNGと思います。
さささん いなさん
ありがとうございます。お二人のおっしゃるとおりでございます。
>CSVを出力し、EXCELで表示させる必要がある仕様の場合、
>数値項目も文字列として扱って出力する。等の方法もあります
ただ、この方法をお教えいただけないでしょうか。
どうしてもcsvをEXCELで加工する必要があるようで、
このまま捨て置くわけにもいかず、弱ってます。。。
以下に現状のソースを記載いたします。
何卒、ご教授いただきますようお願いいたします。
Private Sub Command1_Click()
'csv出力
Dim s3cn_ado
Dim dsn As String
Dim sql As String
Dim fnm As String
Dim mds As Boolean
Dim RS As Variant
Dim fno As Integer
Dim rec As String
Dim i As Integer
Dim dummy As Variant
Dim s As String
Dim FNOW As String
Set RS = Nothing
FNOW = Format(Now, "YYYYMMDD")
dsn = cn
'SQL
sql = "select * from TBLJIO"
fnm = "I:\Report\レポート" & FNOW & ".csv"
mds = True
'Commandオブジェクトを作成
Set cmdMaster = New ADODB.Command
cmdMaster.ActiveConnection = cn
cmdMaster.CommandText = sql
'実行
Set RS = New ADODB.Recordset
Set RS = cmdMaster.Execute
'CSVに加工
fno = FreeFile
Open fnm For Output As fno Len = 32000
If mds Then
For i = 0 To RS.Fields.Count - 1
rec = rec & Chr(&H22) & RS(i).Name & Chr(&H22) & ","
Next
Print #fno, Left(rec, Len(rec) - 1)
End If
Do Until RS.EOF
rec = ""
For i = 0 To RS.Fields.Count - 1
dummy = RS(i)
If IsNull(dummy) Then
s = ""
Else
s = dummy
End If
rec = rec & Chr(&H22) & RTrim(s) & Chr(&H22) & ","
Next
Print #fno, Left(rec, Len(rec) - 1)
RS.movenext
Loop
Close fno
RS.Close
Set RS = Nothing
Unload Me
End Sub
出力した結果に対し
"(=ダブルクオーテーション)でくくると、
CSV的には囲まれたフィールドを一つの項目として認識します。
〜〜〜,"123,456,789,012,345","345",〜〜〜略
CSVの項目として,(=カンマ)も利用できます。
ただし、ささ さんの指摘の通り、
最後に何も項目が入っていない項目があると、
,,,,,,,を,"","","","","","","","","","",と出力しても
Excelから保存した場合、
これらの項目はカットしてしまう(=うまく変換できない)ので
最後にダミーの内容を入れ、強制的に書き出す方法が必要かと思います。
例えば
,,,,,,,を,"","","","","","","","","","",と出力するのではなく
,,,,,,,を,"","","","","","","","","","","Dummy"と出力する等
でも、こうゆうケースがありうるのならば・・・。ですが
いなさん
Chr(&H22)は ダブルコーテーションですよ
皆様ありがとうございます。
なんとか、EXCELで開いた際に数字の末尾が0に置き換わるのを
防ぐプログラムはないでしょうか?
CSV吐き出す際になんとかしたいのですが。(VB側で)
すいませんが、何卒お願いいたします。
csvをダブルクリックしてExcelで開くのではなく、Excelを起動してから、
[データ]-[外部データの取り込み]を使って読み込むよう、運用で回避しては如何でしょう。
csvデータには「書式」情報が無いため、ダブルクリックでのExcel起動では、
"00001"という文字列が「1」という数値に置き換わるなどの弊害がありますが、
外部データの取込であれば、ウィザードで書式を指定できるので、
データを正しく読み込む事ができます。
# ダブルクリックでの起動だと、A1セルに「ID」と書かれた.csvを、
# .slkと誤認してしまうという問題もありますし。
> CSV吐き出す際になんとかしたいのですが。(VB側で)
Excel側の見た目を優先するのですか?
CSVなら、データを優先した方が良いと思いますが。。。
もし、どうしても「ダブルクリックで起動したい」「Excelでの見た目を整えたい」
という事であれば、それらのデータを、
"=""1234567890""","=""123456789012345678901234567890"""
"=""1234567890""","=""123456789012345678901234567890"""
"=""1234567890""","=""123456789012345678901234567890"""
のように吐き出す、という手があります。
この場合、「="1234…"」という「文字列を返す数式」として認識されるので、
見た目上の桁落ちを無くす事ができるかと。
# もし、CSV形式に拘らないのであれば、書式付き(SYLKファイル等)の
# Excelデータとして吐き出すのも手かと。