CSVに時刻を書き込みエクセルで正しく表示する方法

解決


とらサン  2007-01-30 03:32:07  No: 97773

(XP+VB6)
時刻、温度・・・・などのデータをCSVファイルとして書き込みエクセルで出力したいのですが時刻などを  "13:11:05, 13.5, 1022.2, 135, 4.8"  のようにCSVに書き出すと時刻が上手く表示されません。  確か昔はPRNでダブルコーテーションで囲んだりしたのを思い出してやってみているのですがだめなので現在は "13_11_05 " などとやっています。  これを何とか正しくエクセル上で 13:11:05  と表示したいのでよろしくお願いします。


モーヲタ  2007-01-30 08:32:55  No: 97774

当方の環境
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

的が外れているかも・・・違う?


モーヲタ  2007-01-30 08:34:42  No: 97775

あ、一つ忘れてました。
WorkbookをOpenしているところでbreakして止めないと
閉じてEXCELファイルが見えません。


とらサン  2007-01-30 22:53:11  No: 97776

モーヲタ様  レスをありがとうございました。
早速コードを拝借してコピペして試しましたら上手く行きました。そして試しにそれまでやっている方法でもOKでした。

上手く行かなかったものを取り出してみると時刻をタイマーで1/100秒単位で取り、文字列を作って記録するようになっておりました。  具体的には

 "13:11:05.35, 13.5, 1022.2, 135, 4.8"

のようになっておりました。これをご教示いただいたコードに入れて試してみたらやはりおかしな表示となってしまいました。  質問が不十分な内容で申し訳ありませんでしたがよろしくお願いします。


モーヲタ  2007-01-31 06:09:28  No: 97777

なるほど・・・確かにおかしな表示されますね。
んじゃ、これでどうですか?即席でまたまた改造しました。
※エラー処理はいつものように書いてません。あしからず。

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の所でブレイクして見てみてね。


とらサン  2007-02-01 03:15:00  No: 97778

モーヲタ様  大変お手数をお掛けして全コードまで頂き恐縮です。  テストの結果は指示通り表示することができました。  これで現在の目的は達成できたのですが今後の発展を考えて次のことが知りたいと思います。

1.どうして、というかこの技のキーポイントは何か。  何をどうすればこうなる、という理屈などありましたら教えてください  (.Selection.NumberFormatLocal = "@"  あたりに何か秘密があるのでしょうか?)

2.現在は自分のPCでエクセルを起動するので問題ありませんが、もしもCSVファイルを他に配布したときに他のエクセルで正しく表示できるようにするようなCSV側での改善策は考えられるでしょうか。

解決のチェックを入れてありますができましたら宜しくお願いします。


モーヲタ  2007-02-01 05:48:26  No: 97779

>1.どうして、というかこの技のキーポイントは何か。  何をどうすればこうなる、という理屈などありましたら教えてください
>(.Selection.NumberFormatLocal = "@"  あたりに何か秘密があるのでしょうか?)
その通りです。NumberFormatLocal = "@"はセルを文字列セルに
変換せよという命令です。そうすることにより、入力された値のまま
セルに表示してくれるようになります。

>2.現在は自分のPCでエクセルを起動するので問題ありませんが、
>もしもCSVファイルを他に配布したときに他のエクセルで正しく表示
>できるようにするようなCSV側での改善策は考えられるでしょうか。
無いような気がします。
CSVは単なるテキストファイルのカンマ区切りにすぎないので。
よって、相手のEXCELのバージョンがいくつなのかを前もって知っておくか、
制限を付けて「EXCEL 2000以上でないと対応していません」などと
するべきでしょう。表示がおかしくなるのはEXCEL側の問題
だと思われます(勝手にというか、セルの形式により変化する模様)。
よって、上記の様な制限を付けて正常動作するプログラムにすれば
問題ないと思います。


とらサン  2007-02-03 04:02:12  No: 97780

モーヲタ様  色々とありがとうございます。
@などの約束事は勉強してみます。

CSVファイルのままだと各種あるEXCEL側で予期できない表示をする可能性があるようですので注意します。

今下記のように1/100計測の時刻にカッコを付けたら所定の表示ができるようなので便宜的にこの手も使ってみようかと思います。
(13:25:35.25),3,5,7
こんなに詳しくご教示いただき本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加