普段は痛々しいオタクなネタばっか書いてますが、これでも一応職業は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