HTML や CSS で記述したメッセージを画面に表示することができれば、いろいろと嬉しいことがあります。フォントや色を変えたり、行間を調整したり、画像を途中にはさんだり、それこそ自由自在。
WebBrowser という便利なコントロールがありました。これを用いると、それを実現できるだけでなく、うまく使えばファイルのドラッグ&ドロップを受け取ることができます。
それで、やってみました。
下の図は、フォルダをドラッグ&ドロップすると、フォルダ内のすべての画像とその情報のリストをウェブページとして書き出す(その一部が最後の図です)という、なんでこんなのを VBA でやったんだと言われかねない、壮大なシステムの例です。
一連のプロセスにあわせて、結果の報告や、次のアクションの指示などのメッセージが表示されているのと、表示エリアにフォルダをドロップすることができる、という点に着目してください。グレイの面が、WebBowser の画面です。
ここでは、単純化して WebBrowser を使ったメッセージの表示と、あわせてフォルダまたはファイルのドラッグ&ドロップによるパスの取得の部分を紹介します。
WebBrowser は、IE7 対応らしく、崩れやすいので注意。バージョンアップさせる方法はあるらしい。また、このコントロールはデフォルトではでてこないので、ツールボックスを右クリックして探し出す必要があります。このあたりのことは、丁寧に解説されたサイトがあるので、ググってみてください。
ユーザーフォーム RegisterForm
'----- Drag&Drop イベント Private Sub WebBrowser_BeforeNavigate2( _ ByVal pDisp As Object, _ url As Variant, _ Flags As Variant, _ TargetFrameName As Variant, _ PostData As Variant, _ Headers As Variant, _ Cancel As Boolean _ ) 'メッセージ表示の臨時ファイルなら、ここで終わり If isMessage(url) Then Cancel = False: Exit Sub 'そうでなければ、パスを登録して、それを表示する SourcePath = url & "" ShowHTML "ドロップされたフォルダまたはファイルのパスは" & vbCrLf _ & SourcePath & vbCrLf & " です。" Cancel = True End Sub '--- 表示するメッセージのファイルかどうか Private Function isMessage(url As Variant) As Boolean isMessage = (Dir(url) = MessageFileName) End Function
こうしておいて、標準モジュールに ShowHTML() を作ります。
HTML 用のテンプレートは、msgTag と cssText に分けて、もっとも単純なものを用意しておきました。*0 や *1 といったワイルドカードをはさんでいます。通常はこの程度で十分と思いますが、ここはいくらでも拡張の余地があります。
標準モジュール ShowHTML()
'----- Drag&Drop されたフォルダまたはファイルのパス
Public SourcePath
'----- 表示する HTML 臨時ファイルのファイル名
Public Const MessageFileName = "tempHtmlMessage.html"
'----- テンプレートの設定
Private Const msgTag = "<html><head><style>*0</style></head>" & _
"<body><p>*1</p></body></html>"
Private Const cssText = "p{font-size:12px; line-height:18px; width:100%;} " & _
"body{background:#eeeeee;}"
'----- メッセージのHTMLファイルを作成して表示
Public Sub ShowHTML(msg)
Dim text, messageFilePath
'msg をテンプレートに入れ込む
text = Replace(msgTag, "*0", cssText)
text = Replace(text, "*1", Replace(msg, vbCrLf, "<br>"))
'それを臨時ファイルに入れて、WebBrowser に投げ込む
messageFilePath = ThisWorkbook.Path & "\" & MessageFileName
Open messageFilePath For Output As #1
Print #1, text
Close #1
RegisterForm.WebBrowser.Navigate messageFilePath
DoEvents
'臨時ファイルを捨てる
Kill messageFilePath
End Sub
Public Sub ShowHTMLDemo()
ShowHTML "ここへフォルダかファイルを" & vbCrLf & "ドロップしてください。"
With RegisterForm
With .WebBrowser
.Silent = True
.RegisterAsDropTarget = True
End With
.Show vbModeless
End With
End Sub
これで、ドロップされたフォルダまたはファイルのパスが、SourcePath に格納されると同時に画面に表示されます。
ドロップされたパスを使って何をするのか、その途中でここにどんなメッセージを表示するのかは、あなた次第です。
以下は、ShowHTMLDemo() の実行結果です。