(XP+VB6)
時刻、温度・・・・などのデータをCSVファイルとして書き込みエクセルで出力したいのですが時刻などを "13:11:05, 13.5, 1022.2, 135, 4.8" のようにCSVに書き出すと時刻が上手く表示されません。 確か昔はPRNでダブルコーテーションで囲んだりしたのを思い出してやってみているのですがだめなので現在は "13_11_05 " などとやっています。 これを何とか正しくエクセル上で 13:11:05 と表示したいのでよろしくお願いします。
当方の環境
VB6.0 SP6
Office 2003 Professional
Windows XP Professional SP2
において、
即席でプログラム作ってみましたが当方では問題なく表示されますが・・・・
以下、即席サンプルです。エラー処理などは実装してません。
Private Sub Command1_Click()
Dim objFso As Object
Dim objFile As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile("D:\Test.csv", 8, -2)
objFile.Write "13:11:05, 13.5, 1022.2, 135, 4.8"
objFile.Close
Set objFile = Nothing
Set objFso = Nothing
Dim objExcel As Object
Set objExcel = CreateObject("Excel.Application")
objExcel.Application.Visible = True
objExcel.Application.Workbooks.Open FileName:="D:\Test.csv"
objExcel.Application.DisplayAlerts = False
objExcel.Application.Quit
Set objExcel = Nothing
MsgBox "終わり"
End Sub
的が外れているかも・・・違う?
あ、一つ忘れてました。
WorkbookをOpenしているところでbreakして止めないと
閉じてEXCELファイルが見えません。
モーヲタ様 レスをありがとうございました。
早速コードを拝借してコピペして試しましたら上手く行きました。そして試しにそれまでやっている方法でもOKでした。
上手く行かなかったものを取り出してみると時刻をタイマーで1/100秒単位で取り、文字列を作って記録するようになっておりました。 具体的には
"13:11:05.35, 13.5, 1022.2, 135, 4.8"
のようになっておりました。これをご教示いただいたコードに入れて試してみたらやはりおかしな表示となってしまいました。 質問が不十分な内容で申し訳ありませんでしたがよろしくお願いします。
なるほど・・・確かにおかしな表示されますね。
んじゃ、これでどうですか?即席でまたまた改造しました。
※エラー処理はいつものように書いてません。あしからず。
Option Explicit
Private Sub Command1_Click()
Dim objFso As Object
Dim objFile As Object
Dim lngCnt As Long
Dim strReadLine As String
Dim strFields() As String
Dim i As Integer
On Error Resume Next
Kill "D:\Test.csv" '念の為削除
On Error GoTo 0
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile("D:\Test.csv", 8, -2)
objFile.Write "13:11:05.35, 13.5, 1022.2, 135, 4.8"
objFile.Close
Set objFile = Nothing
Set objFso = Nothing
Dim objExcel As Object
Set objExcel = CreateObject("Excel.Application")
objExcel.Application.Visible = True
objExcel.Application.Workbooks.Add
With objExcel
.Cells.Select
.Selection.NumberFormatLocal = "@"
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile("D:\Test.csv")
lngCnt = 0
Do While Not objFile.AtEndOfStream
strReadLine = objFile.ReadLine
strFields = Split(strReadLine, ",")
For i = LBound(strFields) To UBound(strFields) Step 1
strFields(i) = Trim$(strFields(i))
Select Case i
Case 0:
.Range("A1").Select
.ActiveCell.FormulaR1C1 = strFields(i)
Case 1:
.Range("B1").Select
.ActiveCell.FormulaR1C1 = strFields(i)
Case 2:
.Range("C1").Select
.ActiveCell.FormulaR1C1 = strFields(i)
Case 3:
.Range("D1").Select
.ActiveCell.FormulaR1C1 = strFields(i)
Case 4:
.Range("E1").Select
.ActiveCell.FormulaR1C1 = strFields(i)
End Select
Next i
lngCnt = lngCnt + 1
Loop
objFile.Close
Set objFile = Nothing: Set objFso = Nothing
.Application.DisplayAlerts = False
.Application.Quit
End With
Set objExcel = Nothing
MsgBox "終わり"
End Sub
Application.Quitの所でブレイクして見てみてね。
モーヲタ様 大変お手数をお掛けして全コードまで頂き恐縮です。 テストの結果は指示通り表示することができました。 これで現在の目的は達成できたのですが今後の発展を考えて次のことが知りたいと思います。
1.どうして、というかこの技のキーポイントは何か。 何をどうすればこうなる、という理屈などありましたら教えてください (.Selection.NumberFormatLocal = "@" あたりに何か秘密があるのでしょうか?)
2.現在は自分のPCでエクセルを起動するので問題ありませんが、もしもCSVファイルを他に配布したときに他のエクセルで正しく表示できるようにするようなCSV側での改善策は考えられるでしょうか。
解決のチェックを入れてありますができましたら宜しくお願いします。
>1.どうして、というかこの技のキーポイントは何か。 何をどうすればこうなる、という理屈などありましたら教えてください
>(.Selection.NumberFormatLocal = "@" あたりに何か秘密があるのでしょうか?)
その通りです。NumberFormatLocal = "@"はセルを文字列セルに
変換せよという命令です。そうすることにより、入力された値のまま
セルに表示してくれるようになります。
>2.現在は自分のPCでエクセルを起動するので問題ありませんが、
>もしもCSVファイルを他に配布したときに他のエクセルで正しく表示
>できるようにするようなCSV側での改善策は考えられるでしょうか。
無いような気がします。
CSVは単なるテキストファイルのカンマ区切りにすぎないので。
よって、相手のEXCELのバージョンがいくつなのかを前もって知っておくか、
制限を付けて「EXCEL 2000以上でないと対応していません」などと
するべきでしょう。表示がおかしくなるのはEXCEL側の問題
だと思われます(勝手にというか、セルの形式により変化する模様)。
よって、上記の様な制限を付けて正常動作するプログラムにすれば
問題ないと思います。
モーヲタ様 色々とありがとうございます。
@などの約束事は勉強してみます。
CSVファイルのままだと各種あるEXCEL側で予期できない表示をする可能性があるようですので注意します。
今下記のように1/100計測の時刻にカッコを付けたら所定の表示ができるようなので便宜的にこの手も使ってみようかと思います。
(13:25:35.25),3,5,7
こんなに詳しくご教示いただき本当にありがとうございました。
ツイート | ![]() |