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

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

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

Excelマクロのススメ Part2

先日、自分のHTML日記のURLをLINEに貼り付けて、友人に公開しようとしたら、
文字化けて読めないことが発覚。
どうやら、文字エンコーディング指定を記載していなかったことが原因っぽい。
通常のブラウザだと、結構自動で判別してくれるから、顕在化しないんだけど、
LINEのブラウザはおバカっぽいな!
などと、LINEのせいにしつつも、HTMLのお作法的にはイマイチなので、
ちょっと修正してみることに。
で、せっかくなので、他に対応したかったことも含めて、
前に紹介したExcelマクロを少し改造して、対応してみます。


ただし、前回同様、無駄に長いだけで大した面白みもないので、それでも良い方だけ先にお進みください。(w


まずは、要求事項とその実現方法を整理してみる。

# 要求事項 実現方法
1 LINEのブラウザでも文字化けなく表示したい。 TITLEタグの下に文字エンコーディング指定のMETAタグを挿入する。
2 はてなブログっぽく、日付タイトルをクリックしたらその日の日記に飛びたい。 日付タイトルにHREF属性を付けたAタグを挿入する。
3 #2において、一部赤色のフォントがあるため、リンクの文字修飾はOFFにしたい。 Aタグにはstyle属性を付ける。


これを対応前と対応後の成果物イメージで記載すると、こんな感じ。

(※上略)
<HEAD>
<TITLE>ちょぉ不定期日記 2000/04</TITLE>
</HEAD>
(※中略)
<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>
(※下略)

↓修正後

(※上略)
<HEAD>
<TITLE>ちょぉ不定期日記 2000/04</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
</HEAD>
(※中略)
<A NAME="20000430" HREF="#20000430" style="color:white;text-decoration:none"><FONT SIZE=6><B>2000年4月30日(日)</B></FONT><BR></A>
<BR>
 マリンメッセにコミケ襲撃。コミケについてはさして特筆することはなし。<BR>
 一つ言えることは、使ったお金は入場料だけということくらいか・・・。<BR>
(※中略)
<HR>
<A NAME="20000427" HREF="#20000427" style="color:white;text-decoration:none"><FONT SIZE=6><B>2000年4月27日(木)</B></FONT><BR></A>
<BR>
 今日はゼミあったんで、サークル休んだ。<BR>
 ちゅーか、今日のこと誰も教えてくれない。電話くらいあっても良いと思うんだけどな〜。<BR>
(※下略)


で、これを実現するために、組んだマクロがこんな感じ。

Sub Diary_Conv2()
    Dim intFIn, intFOut As Integer
    Dim strRec As String
    Dim strFileName As String
    Dim lngStPt, lngEdPt As Long
    Dim strName, strColor As String

    '先頭のファイル名の取得
    strFileName = Dir(ThisWorkbook.Path & "\diary\", vbNormal)
    
    'ファイルが見つからなくなるまで繰り返す
    Do While strFileName <> vbNullString
        
        'HTMLファイル以外は読み飛ばす
        If InStr(1, strFileName, ".html") > 0 Then
        
            '入力ファイルをOPEN
            intFIn = FreeFile
            Open ThisWorkbook.Path & "\diary\" & strFileName For Input As #intFIn
            
            '出力ファイルをOPEN
            intFOut = FreeFile
            Open ThisWorkbook.Path & "\output\" & strFileName For Output As #intFOut
            
            'ファイルのEOFまで繰り返す
            Do Until EOF(intFIn)
                
                '改行までをレコードとして読み込む
                Line Input #intFIn, strRec
                
                '文字エンコーディング指定を追加
                If InStr(1, strRec, "</TITLE>") > 0 Then
                    strRec = strRec & vbCrLf & "<META http-equiv=" & Chr(34) & "Content-Type" & Chr(34) _
                        & " content=" & Chr(34) & "text/html; charset=Shift_JIS" & Chr(34) & " />"
                End If
                
                '日付タイトルの部分の場合のみレコードを編集
                If InStr(1, strRec, "<FONT SIZE=6><B>") > 0 And _
                        InStr(1, strRec, "年") > 0 And InStr(1, strRec, "月") > 0 Then
                    
                    'NAMEの値を取得
                    lngStPt = InStr(1, strRec, Chr(34))
                    lngEdPt = InStr(lngStPt + 1, strRec, Chr(34))
                    strName = Mid(strRec, lngStPt + 1, lngEdPt - lngStPt - 1)
                                        
                    'Colorの値を取得
                    lngStPt = InStr(1, strRec, "COLOR=") + 6
                    If lngStPt = 6 Then
                        strColor = "white"
                    Else
                        lngEdPt = InStr(lngStPt, strRec, ">") - 1
                        strColor = Mid(strRec, lngStPt, lngEdPt - lngStPt + 1)
                    End If
                    
                    'HREF属性を付与
                    strRec = Replace(strRec, "<A NAME=" & Chr(34) & strName & Chr(34), "<A NAME=" & Chr(34) & strName & Chr(34) & _
                                " HREF=" & Chr(34) & "#" & strName & Chr(34) & " style=" & Chr(34) & "color:" & strColor & ";text-decoration:none" & Chr(34))
                
                End If
            
                'レコードを出力
                Print #intFOut, strRec
            Loop
            
            'ファイルをCLOSE
            Close #intFIn
            Close #intFOut
            
        End If
        
        '次のファイル名を取得
        strFileName = Dir()
    Loop

End Sub


というわけで、無事にLINEのブラウザで参照が可能となりましたとさ。めでたしめでたし。(w
ちなみに、前回同様、ココに載せたへっぽこマクロのソースは、別に他で好きに使っても構いませんが、
ダメ出しやバグ等の文句は受け付けませんのでご了承ください。(w