私たち、来世もオタクがいいね。

私たち、来世もオタクがいいね。

オタクは死んでも治らないということを日々綴っていく日記です。

Excelマクロのススメ

普段は痛々しいオタクなネタばっか書いてますが、これでも一応職業はSE。
というわけで、たまにはマジメな日記でも書いてみようかと。
まぁ、正直SEといっても、ろくにプログラムも書けないようなエセSEですが、
そんな私でも、唯一できると言えるのが「Excelマクロ」です。
でも、考えようによってはC言語Javaなんかより、よっぽど役に立つ言語。
うまく使えば、普段の生活でも役に立てる魔法の言語なのです。
今日は普段の生活に役立てた例を交えて、Excelマクロの良さを伝えるお話。
ただし、無駄に長いだけで大した面白みもないので、それでも良い方だけ先にお進みください。(w


事の発端は、このブログの上のメニューにもある私が10年前に書いていたHTML日記。
このHTML日記なんですが、如何せん後先考えずに何となく書き連ねていたこともあって、
まぁ見づらい上に、リンクも貼りづらい作りになっているんです。
このブログを書いているときも、よく過去の日記にリンクを貼ったりしたいと思うんですが、
このHTML日記の構造上、それがうまくできないという問題を抱えていました。
というわけで、現状の問題点とその対策方法を整理してみる。

# 問題点 対策方法
1 日付欄に「年」が表示されていないため、パッと見でいつのことだかわからない。 日付欄に「年」を表示。(ついでに数字は半角に)
2 月単位に1ファイルのため、日ごとの記事にピンポイントでリンクが貼れない。 日ごとの記事にNAME属性を付けたAタグを入れる。


ちなみに、日記ファイルは、本体は「diary.html」、それ以外は「d_YY-M.html」というネーミング。
それを踏まえて、例えば「d_00-4.html」ならば、以下のような修正が必要となります。

(※上略)
<FONT SIZE=6><B>4月30日(日)</B></FONT><BR>
<BR>
 マリンメッセにコミケ襲撃。コミケについてはさして特筆することはなし。<BR>
 一つ言えることは、使ったお金は入場料だけということくらいか・・・。<BR>
(※中略)
<HR>
<FONT SIZE=6><B>4月27日(木)</B></FONT><BR>
<BR>
 今日はゼミあったんで、サークル休んだ。<BR>
 ちゅーか、今日のこと誰も教えてくれない。電話くらいあっても良いと思うんだけどな〜。<BR>
(※下略)

↓修正後

(※上略)
<A NAME="20000430"><FONT SIZE=6><B>2000年4月30日(日)</B></FONT><BR></A>
<BR>
 マリンメッセにコミケ襲撃。コミケについてはさして特筆することはなし。<BR>
 一つ言えることは、使ったお金は入場料だけということくらいか・・・。<BR>
(※中略)
<HR>
<A NAME="20000427"><FONT SIZE=6><B>2000年4月27日(木)</B></FONT><BR></A>
<BR>
 今日はゼミあったんで、サークル休んだ。<BR>
 ちゅーか、今日のこと誰も教えてくれない。電話くらいあっても良いと思うんだけどな〜。<BR>
(※下略)


基本的には、私のHTML日記は全て上記のような法則で書かれているので、
ここまでくれば、あとはこの変換を行うようなマクロを組めば良いだけ。
というわけで、30分くらいでささっと作ったへっぽこマクロを公開してみる。(w

Sub Diary_Conv()
    Dim intFIn, intFOut As Integer
    Dim strRec As String
    Dim strFileName As String
    Dim lngStPt, lngEdPt As Long
    Dim strYear, strMonth, strDay As String

    '先頭のファイル名の取得
    strFileName = Dir(ThisWorkbook.Path & "\diary\", vbNormal)
    
    'ファイルが見つからなくなるまで繰り返す
    Do While strFileName <> vbNullString
        
        '入力ファイルをOPEN
        intFIn = FreeFile
        Open ThisWorkbook.Path & "\diary\" & strFileName For Input As #intFIn
        
        '出力ファイルをOPEN
        intFOut = FreeFile
        Open ThisWorkbook.Path & "\output\" & strFileName For Output As #intFOut
        
        '年を取得
        If InStr(1, strFileName, "diary") > 0 Then
            strYear = "2003"
        Else
            strYear = Mid(strFileName, 3, 2)
            If Left(strYear, 1) = "9" Then
                strYear = "19" & strYear
            Else
                strYear = "20" & strYear
            End If
        End If
        
        'ファイルのEOFまで繰り返す
        Do Until EOF(intFIn)
            
            '改行までをレコードとして読み込む
            Line Input #intFIn, strRec
            
            '日付タイトルの部分の場合のみレコードを編集
            If InStr(1, strRec, "<FONT SIZE=6><B>") > 0 And _
                    InStr(1, strRec, "月") > 0 And InStr(1, strRec, "日") > 0 Then
                
                '月を取得
                lngStPt = InStr(1, strRec, "<B>") + 3
                lngEdPt = InStr(1, strRec, "月") - 1
                strMonth = Format(StrConv(Mid(strRec, lngStPt, lngEdPt - lngStPt + 1), vbNarrow), "00")
                
                '日を取得
                lngStPt = InStr(1, strRec, "月") + 1
                lngEdPt = InStr(1, strRec, "日") - 1
                strDay = Format(StrConv(Mid(strRec, lngStPt, lngEdPt - lngStPt + 1), vbNarrow), "00")
                
                '半角に変換(「〜」は除く)
                strRec = Replace(StrConv(strRec, vbNarrow), "~", "〜")
                
                '年を挿入
                strRec = Replace(strRec, "<FONT SIZE=6><B>", "<FONT SIZE=6><B>" & strYear & "年")
                
                'NAME属性をYYYYMMDDとしたAタグを挿入
                strRec = "<A NAME=" & Chr(34) & strYear & strMonth & strDay & Chr(34) & ">" & strRec & "</A>"
            End If
        
            'レコードを出力
            Print #intFOut, strRec
        Loop
        
        'ファイルをCLOSE
        Close #intFIn
        Close #intFOut
        
        '次のファイル名を取得
        strFileName = Dir()
    Loop

End Sub


というわけで、いまいち伝わったかどうかはわかりませんが、大幅な作業の効率化が図れました。
だって、38個もあるファイルに対して、仮に全て手作業で修正を行ったらどうなると思います?
…私なら、絶対やりません。(w
ちなみに、ココに載せたへっぽこマクロのソースは、別に他で好きに使っても構いませんが、
ダメ出しやバグ等の文句は受け付けませんのでご了承ください。(w