![]()
mixiの日記を一気に印刷するための、ExcelマクロやらVBSやら
山本ゆうごです。ご近所のお友達から、mixiの日記を一括印刷できないかという相談があり、一気に印刷してみようとするとなかなかそういうツールがない。mixiのデータのバックアップとかはあるのに、一気に印刷ができない。
ということで次のように手順を考えました。
- 印刷すべきURLをリスト化
- URLのリストに従って一括で印刷
1に関してはさほど難しいことではない。mixiで言えば、日記一覧のページから「続きを読む」というテキストノードがあるリンクを抽出すればよい。ここもページングがあるけど、次のページにナビゲートするのは、「次へ」というテキストノードがあるリンクをたどればうよい。
この作業はブックマークレットでやりました。
次へをたどるブックマークレット
javascript:(function(){var%20eles%20=%20document.getElementsByTagName(%22A%22);for(var%20i=0;i<eles.length;i++){if(eles[i].innerText.match(/^次|^つぎ/)){location=eles[i].href;}}})()
そして、「続きを読む」のアンカーを抽出してクリップボードに入れるブックマークレット
javascript:(function(){var buff="";var%20eles%20=%20document.getElementsByTagName(%22A%22);for(var%20i=0;i<eles.length;i++){if(eles[i].innerText.match(/^続き/)){buff+=eles[i].href+"\n";}}window.clipboardData.setData("text",buff);})()
クリップボードオブジェクトを使っているのでIE限定です。さらにIE7からセキュリティが厳しくなったので、クリップボードアクセスの際にはアラートがでます。作業を効率よくするために一時的にセキュリティのレベルのカスタマイズでアラートは消す設定にしました。まぁこれでURLのリストができます。URLのリストは、テキストファイルかエクセルにでもペーストしておきます。
ココまでは他にもスクレイピングの手法で方法はありそうです。
ところがこの後の「一気に印刷」がなかなかない。Windowsでは、ドキュメントファイルやショートカットをプリンタアイコンにドロップすると一気に印刷してくれるという機能があるのですが、ダイアログがでるかどうかはアプリによる。そしてIEの場合はダイアログがでるので、大量のダイアログをOKしなくちゃいけないということがわかりこれはボツ。
次に、IEをオートメーションで操作して印刷するという方法。IEのメソッドにPrintは無かったのだけれど、ExecWBメソッドであれこれできることがわかったのでこれで実践。
まずはエクセルマクロが一番IDEが充実しているのでここで検証。Excel2003で参照設定に、Microsoft Internet Controlsを入れて次のコードでできました。A列にURLをずらずら書いていると、ダイアログなしで一気に印刷してくれます。
Option Explicit
Sub printall()
Dim i As Integer
Dim ie As InternetExplorer
Set ie = New InternetExplorer
ie.Visible = True
i = 1
'A列にURLがずらずらと入っている前提
Do Until Cells(i, 1) = ""
ie.Navigate Cells(i, 1)
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
ie.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 3
i = i + 1
Loop
End Sub
エクセルも2007になってたりするので、ちと心配。なので、WSHのVBS単体でも動くサンプルも作成。次のソースを「printall.vbs」とかって名前で保存して起動すると、一気に標準のプリンタに印刷してくれます。
Option Explicit
Const READYSTATE_COMPLETE = 4
Const OLECMDID_PRINT = 6
Const OLECMDEXECOPT_DONTPROMPTUSER = 2Dim urls
Dim url
'ここにカンマ区切りで印刷したいurlをずらずらと書きます
urls = Split("http://mtl.recruit.co.jp/,http://mtl.recruit.co.jp/2008/12/post_5.html",",")Dim ie
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = TrueFor Each url In urls
ie.Navigate url
Do Until ie.ReadyState = READYSTATE_COMPLETE
WScript.Sleep 100
Loop
ie.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 3
Next
久しぶりに、Windowsべったりのゴリゴリのソリューションをやってみました。魔界の仮面弁士さんのお世話にもなりました。
ここで分かったのは、ネットにあればいつでも引き出せるというものの、「印刷」という引き出し方式は結構苦労するということ。オフラインやアーカイブという用途で印刷するというソリューションはニーズがありそうです。
ブラウザで直接開くのではなく、Acrobat(有料版の方)の機能で直接PDFにする機能があったような記憶もあるのですが、普通のブラウザでないと、JavaScriptやFlashが描画できないと印刷のイメージがちがっちゃうなぁということで、IEの自動操縦がよろしいかと。
あと、別の解としては、「全部手作業」でもいいっちゃぁいい。印刷時間の方がボトルネックなので。

コメント (1)
subimitできないんです。
Sub ie_Forms_DataSET() 'データセットのテスト
Dim objIE As Object 'IEオブジェクト参照用
'IEを起動する
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定したURLを開く
objIE.Navigate "https://wwwi.mbrace.or.jp/mb2ninsyouservlet"
'ページが表示される 完了を待つ
While objIE.ReadyState > 4 'READYSTATE_COMPLETE = 4
While objIE.Busy = True
DoEvents '特に何もしないで.Busyの状態が変わるまで待つ
Wend
Wend
'データをセットする
'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する
objIE.Document.Forms(0).Item("uid").Value = "○○○○"
objIE.Document.Forms(0).Item("np").Value = "○○○○"
'フォーム(0番目)を .Submit(送信・投稿) する
objIE.Document.Forms(0).Submit '送信処理
End Sub
---------------------------------------------------
HTMLソースの頭の部分が
・、・ソ。シ・ヘ・テ・ネナ・シイァセレイ靂フ