先週末、このサイト・インストラクターのネタ帳のカテゴリーを構成し直しました。
このサイトをMovable Typeで運用し始めて以来、
http://www.relief.jp/itnote/archives/cat_3.php
といった形で、カテゴリーアーカイブを作っていました。
(上記のURLはWord関連記事の一覧のものでした。)
私がMovable Typeを使い始めた頃は、カテゴリーを階層化できなかったこともあって、個別記事と同じフォルダに、「cat_」というプレフィックスを付けたphpファイルをカテゴリーアーカイブにしていたのです。
しかし、最近はさすがにデメリットのほうが大きくなってきたので、先週末に思い切ってカテゴリーを再構成しました。
例えば、Wordのカテゴリーアーカイブは
http://www.relief.jp/itnote/Word/
というURLに変更しました。
その変更作業は、Movable Typeでテンプレートを修正して行えばいいのですが、問題は古いほうのURLへのアクセスをどうするかです。
調べてみると、PHPファイルで個別に301リダイレクトをできることがわかりました。
ですが、インストラクターのネタ帳のカテゴリーは70以上も存在しています。
さすがに70個以上のPHPファイルを手作業で作るのは無謀です。
そのためのExcelマクロをVBA(Visual Basic for Applications)で作成しましたので、ご紹介しておきます。
Windows上で何等かのファイル処理をする場合、最近はFileSystemObjectを利用することが多いはずですが、折角Excelマクロにするのだから、FileSystemObjectを使わないレガシーな方法で、今回はマクロを作ってみました。
Sub ファイルを作成する_301リダイレクト用PHP()
Const TMPLT = "template_301redirect.txt"
Dim me_path As String
Dim cat_old As String
Dim cat_new As String
Dim buf As String
Dim i As Long
Dim msg As String
msg = "アクティブシートを元にして"
msg = msg & "301リダイレクト用ファイルを作成しますか?"
If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
' テンプレートの読み込み
me_path = ThisWorkbook.Path & "\"
Open me_path & TMPLT For Input As #1
' アクティブシートの2行目からリストの最後までループ処理
For i = 2 To Range("A1").End(xlDown).Row
cat_old = Cells(i, 1).Value '元のカテゴリファイル名
cat_new = Cells(i, 2).Value '新しいカテゴリーのURL
' 読み込み開始位置をテンプレートの先頭に移動
Seek #1, 1
' ファイルを作成
Open me_path & cat_old For Output As #2
' 文字列を置換しながら書き込み
Do Until EOF(1)
Line Input #1, buf
buf = Replace(buf, "★", cat_new)
Print #2, buf
Loop
' 作成したファイルを閉じる
Close #2
Next i
Close #1
End Sub
上記のマクロを実行すると、マクロの書かれているExcelファイルのあるフォルダに、アクティブシートのA列に書かれている名前のテキストファイルが一気に作成されます。
A列には「cat_3.php」という元のカテゴリーアーカイブのPHPファイルの名前、B列には「http://www.relief.jp/itnote/Word/」という新しいカテゴリーアーカイブのURLが入力しておいてください。
元のカテゴリー用PHPファイル | 新しいカテゴリーのURL |
---|---|
cat_3.php | http://www.relief.jp/itnote/Word/ |
cat_4.php | http://www.relief.jp/itnote/Excel/ |
↑のような感じで。
元にするテンプレートファイルは、以下のような書式で、Excelファイルと同じフォルダにtemplate_301redirect.txtという名前で作成しておいてください。
<?php
header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: ★" );
? >
この「★」の部分をアクティブシートのB列に書かれている文字列に置換しながら、ファイルをどんどん作っていきます。
テンプレートの読み込みを行う、
me_path = ThisWorkbook.Path & "\"
Open me_path & TMPLT For Input As #1
ファイルの作成をする、
Open me_path & cat_old For Output As #2
ファイルに書き込みをする、
Do Until EOF(1)
Line Input #1, buf
buf = Replace(buf, "★", cat_new)
Print #2, buf
といったあたりの処理は、Excel MVPの大先輩・田中亨さんのサイトの「テキストファイルを操作する」を読んでいただくほうが、理解が早いでしょう。
読み込み開始位置をテンプレートファイルの先頭に移動する
Seek #1, 1
という部分については、同じく田中さんのサイトの「Seekステートメント」を、是非ご確認ください。
実行確認を
msg = "アクティブシートを元にして"
msg = msg & "301リダイレクト用ファイルを作成しますか?"
If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
と最初にやってはいますが、あとはエラー処理など一切入れていませんので、上記のマクロを実務で利用される場合、しっかりテストをして、必要なエラー処理などを追加して、くれぐれも自己責任でお願いします。
Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » 301リダイレクト用PHPファイルを作成するExcelマクロ