2005年12月07日 水曜日

Excel VBA Hacks (3)

なんでもかんでもExcel症候群」なんて言う_刺激的な_タイトルを付けるとなんだかそれだけでアクセスする人がいるのと、シリーズ化してみても良いかもしれないということで、タイトル変更。本シリーズではVBAとWindowsの標準的な環境における機能だけを使ったExcelおよびOfficeの使いこなしを深めていきたいと思う。
そんなわけで第3弾。テキストデータをさわっているといろいろ考えさせてくれるのが文字コード周辺の問題となる。通常Unixではnkfやらiconvやらを使ってコード変換をするのであるが、Windowsではどうするかというと、たいていの記事ではnkfをDLL化したフリーのライブラリnkf.dllを使うのが常道である。が、これもいちいちインストールしないと使えないので、めんどくさい。(めんどくさくないよと言う人は以下の記事を読む必要はない。ただ数十人のPCにいちいちマクロ以外のプログラムやライブラリを導入しつつ、自分がそのバージョンの管理もしなきゃならないという事態に陥れば、考えるところもあるだろう。)
いろいろWindowsのドキュメントをひもといていけば、だいたいの場合でやっぱりnkf32.dllもいらないと言う結論に落ち着いた。とりあえず文字コード変換して取り込むと言う関数も書いてみよう。方法としてはUnixのファイルをバイナリでもらってきて、以下の関数で取り込み。文字列を返すので、前回の関数を使って配列にすればよろしい。
以下ソースを示す。Microsoft Data Access Components (MDAC) のStreamオブジェクトを使うというのが処理のポイント。ソースを見れば何となく何をやっているか分かるだろう。詳しくは分かりにくいけどMDACのドキュメントをMSDNの中から探って欲しい。

Function KconvInput(Encode As String, FileName As String) As String
    Dim Stream As Object
    Set Stream = CreateObject("ADODB.Stream")
    Stream.Open
    ' いろいろ設定
    ' Charsetはシステムで使える物でないとエラーが発生する(チェックはしてない)
    With Stream
        .Type = 2                   ' adTypeText テキストデータ
        .Charset = Encode           ' 入力ファイルのエンコード
        .LineSeparator = -1         ' adCRLF 改行文字はDOS形式改行
    End With
    Stream.LoadFromFile FileName
    KconvInput = Stream.ReadText()
    Stream.Close
    Set Stream = Nothing
End Function

次のネタは何だろう。リクエストを受け付けると大変なことになるのだけど、ネタは募集します。(あと97回くらいやればVBA Hacksとか書けるのかなあ、オライリーさん。)