1. ホーム
  2. Blog
  3. mixiの日記を一気に印刷するための、ExcelマクロやらVBSやら

mixiの日記を一気に印刷するための、ExcelマクロやらVBSやら

山本 有悟

山本 有悟

技術

山本ゆうごです。ご近所のお友達から、mixiの日記を一括印刷できないかという相談があり、一気に印刷してみようとするとなかなかそういうツールがない。mixiのデータのバックアップとかはあるのに、一気に印刷ができない。

ということで次のように手順を考えました。

  1. 印刷すべきURLをリスト化
  2. 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 = 2

Dim 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 = True

For 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ソースの頭の部分が

・、・ソ。シ・ヘ・テ・ネナ・シイァセレイ靂フ

  • 投稿者: ひろ

トップへ戻る