忍者ブログ

ブックの内容をUTF8でCSV出力するマクロ

2021年02月10日
仕事でエクセルファイルを取り込んで、テーブルを作ってCSVに出力するツールを作ることになった。

趣味プログラミングで作る分には1日でできる作業だけど、
詳細な仕様を詰めていくとなかなかこれが大変ということを改めて思い知らされた。

前にプログラマの人が「データインポートは大変だからやりたくない」と言ってたのがよーくわかった。

大変なことを整理してみた。

①仕様をきっちり決めて動作保証の範囲を決める必要がある。
②仕様書・設計書を作りレビューを受ける必要がる。
③動作保証の範囲できっちり動くツールを作る必要がある。
④動かない場合はなんで動かないか利用者に知らせる必要がある。
⑤ツールの試験を行い、仕様書・設計書と差異がないことを確認する必要がある。
⑥試験結果を報告書にまとめてレビューを受ける必要がある。
⑦仕様書・設計書・ツール動作・試験報告書で整合性を取る必要がある。
⑧改修が発生するたびに変更内容を管理し、①~⑦をやり直す必要がある。

ざっくりこんな感じ。仕事でやるプログラミングが10倍の工数とは言ったものだ。
システム開発となるとさらに10倍だとか。


データインポートの何がめんどいって、元データに何を入れられるかわからないから。

文字数制限、文字種制限、想定範囲内か、リストにある内容かなど、
考えられるあらゆるパターンに耐えるのがなかなかしんどい。。。

作りかけのツールは、シフトJISで出力していたけど、
試しに第四水準の文字「墱」を入れたら変換されず「?」に。。。

仕方なくUTF8で出力する仕様に変更。

毎度おなじみのofficeTanaka様のサイトで勉強して、
" "くくりのカンマ区切りCSV出力マクロを作ってみた。

参照サイト
Office TANAKA - ファイルの操作[UTF-8形式のテキストファイルに書き込む]


以下、ソース

Option Explicit
Sub writeCSV_utf8()
'http://officetanaka.net/excel/vba/file/file11.htm
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("シート")
Dim csvFile As String
csvFile = ActiveWorkbook.Path & "\data_utf8.csv"
Dim strLine As String
Dim i As Long, iEnd As Long
iEnd = 35
Dim j As Long, jEnd As Long
jEnd = 38
With CreateObject("ADODB.Stream")
    .Charset = "UTF-8"
    .Open
    
    For i = 15 To iEnd '行ループ
        strLine = ""
        For j = 3 To jEnd - 1 '列ループ(最終列は別処理)
            strLine = strLine & """" & ws.Cells(i, j).Value & ""","
        Next j
            strLine = strLine & """" & ws.Cells(i, jEnd).Value & """"
            .WriteText strLine, 1 ' 1を指定すると改行を入れる
    Next i
    .SaveToFile csvFile, 2 ' 2を指定すると強制上書き保存
    .Close
End With
MsgBox "data_utf8.csvに書き出しました"
End Sub

文字コードのメリットデメリットもちょっと勉強してみた。

シフトJIS
日本語の表示に特化していて、データ量を少なくすることができる。
対応していない文字が多い(第四水準文字はNGだった)。

UTF-8
ほとんど文字化けしないが、データ量がシフトJISの1.5倍くらいになる。

参照サイト
Shift-JISとUTF-8の違いとは | SIRIUSシリウス初心者入門 (homepage-tukuri.com)


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字