category name  »  page title date

HTMLでメッセージ

HTML や CSS で記述したメッセージを画面に表示することができれば、いろいろと嬉しいことがあります。フォントや色を変えたり、行間を調整したり、画像を途中にはさんだり、それこそ自由自在。
WebBrowser という便利なコントロールがありました。これを用いると、それを実現できるだけでなく、うまく使えばファイルのドラッグ&ドロップを受け取ることができます。
それで、やってみました。

下の図は、フォルダをドラッグ&ドロップすると、フォルダ内のすべての画像とその情報のリストをウェブページとして書き出す(その一部が最後の図です)という、なんでこんなのを VBA でやったんだと言われかねない、壮大なシステムの例です。
一連のプロセスにあわせて、結果の報告や、次のアクションの指示などのメッセージが表示されているのと、表示エリアにフォルダをドロップすることができる、という点に着目してください。グレイの面が、WebBowser の画面です。

ここでは、単純化して WebBrowser を使ったメッセージの表示と、あわせてフォルダまたはファイルのドラッグ&ドロップによるパスの取得の部分を紹介します。

WebBrowser は、IE7 対応らしく、崩れやすいので注意。バージョンアップさせる方法はあるらしい。また、このコントロールはデフォルトではでてこないので、ツールボックスを右クリックして探し出す必要があります。このあたりのことは、丁寧に解説されたサイトがあるので、ググってみてください。

ShowHTML

ユーザーフォームは、RegisterForm という名前で用意し、中に WebBrowser コントロールを1個だけ配置してあります。
WebBrowser_BeforeNavigate2 イベントを受けて、指定されたメッセージURLの内容を表示したり、それがメッセージ用のURLでなければ、SourcePath にドロップされたフォルダまたはファイルのフルパスを格納してついでにそれを表示します。それだけです。

ユーザーフォーム         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() の実行結果です。