category name  »  page title date

ヘルプメッセージ

ワークシートあるいはユーザーフォームの各所にヘルプボタンを配置して、そこをクリックすれば該当するヘルプメッセージが表示される、というようにしたいことがあります。よくあります。
こうしておけば、余計なマニュアルを作らずに済む、かもしれないし、1週間後、1カ月後の自分自身も安心できます。

たとえば、左図のごとし。「?」マークがワークシートに配置したヘルプボタンで、それぞれ「アプリ情報」などというように赤字で示したシェイプ名をつけてあります。すべての「?」ボタンには、同じ ShowHelpMessage というマクロを登録してあります。このマクロは、ボタンのシェイプ名に応じたメッセージを表示します。
これらのボタンは、当該ブック内にあれば、どのワークシートにあってもかまいません。

実は、後で示す ShowHelpMessage にはオプションとはいえ引数があるので、そのままではマクロとして登録できません。一度引数を消しておいて、登録した後で元にもどせばうまくいきます。だましのテクですね。

こんな感じでメッセージを表示したいと思います。
これは、「連絡方法」のボタンをクリックした時の表示内容、というイメージ。
ユーザーが管理者の場合には、この図のようにキャプションに「(編集ができます)」と表示されて、右下にアップデイトのためのボタンが配置されます。この時、表示されたテキストを自由に編集することができます。
ユーザーが管理者以外であれば、テキストの編集は受け付けないように、アップデイトのボタンも表示されないようにしておきましょう。

このユーザーフォームとして用意したのは、左のようなものです。
HelpForm という名前をつけました。配置したコントロールはHelpTextBox と UpdateButtonImage のふたつだけ(赤字でコントロール名を書いておきました)。HelpTextBox は、プロパティ WordWrap、MultiLine、EnterKeyBehavier  を True に、ScrollBars を fmScrollBarsVertical にセットしておきます。

ユーザーフォームにもたせるコードは、以下のようなもの。UpdateButtonImage をクリックした場合のメッセージ更新マクロの呼び出しが主なものです。表示された時に、メッセージのスクロール位置が従前のままとなっているのをもとにもどすステートメントをいれておきました。

ユーザーフォーム         HelpForm

Private Sub UpdateButtonImage_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
      UpdateHelpMessage
End Sub
'----- 開始時に、スクロール位置を0としておく
Private Sub UserForm_Activate()
      HelpTextBox.SelStart = 0
End Sub


表示するヘルプメッセージの一覧表をつくっておきます。
ここでは、Help という名称のワークシートを用意して、こんな感じの一覧表を作成しました。表の始まりがわかるように、表の左上のセルの直上のセルに MessageListTop という名前をつけてあります。左上のセルに直接名前をつけると、挿入削除などの操作を行うたびに混乱してしまいます。

ここでは、さきの?ボタンに対応して、3組のメッセージを用意しました。MessageListTop の列の下にあるのが、各ボタンのシェイプ名に対応した検索キーの文字列です。それぞれの右の列に、そのボタンで表示すべきメッセージの内容を記載してあります。
このメッセージの内容は、(管理者であれば)HelpForm を使って編集することもできます。

さて、以下が各ボタン(またはユーザーフォーム上のコントロール)が呼び出す ShowHelpMessage の本体です。
押されたボタンに応じたメッセージを検索し、管理者かどうかに応じたフォームの形式を設定し、表示します。
ユーザーフォームから呼ぶ場合は、Application.Caller は効きませんので、検索キーを引数としてつけて呼ぶことになります。
管理者かどうかの判定は、ここだけの問題ではなく、システム全体にかかわる機能でしょうから、実際には別の Module に書くべきものですが、とりあえずここに含めました。Get Property の形で参照することにしていますので、適宜工夫してください。

標準モジュール        ShowHelpMessage

'----- メッセージ一覧表の記載されたシート名および
'TopLeft セルの直上セルの名前
Private Const helpSheetName = "Help"
Private Const messageList = "MessageListTop"
'----- メッセージの該当セル
Private helpMessageCell As Range
'----- HelpForm およびボタンエリアの高さ
Private Const formHeight = 250
Private Const buttonAreaHeight = 20
'----- 管理者かどうかのフラグ
Public Property Get IamAdmin()
      IamAdmin = True
      
      'ここでは、とりあえず True を返すようにしている
      '実際には、ここで何かを参照してユーザーが管理者であるかどうか
      'を判定し、その結果を返すようにする
      
      'たとえば、システムフォルダー内に管理者用ファイルを用意し
      'その有無を確認するなど・・・・・
      'あるいは、パスコードの入力を要求して、成否を確認するなど・・・
      
End Property
'----- ヘルプメッセージの表示
'WorkSheet 上のボタンから呼ぶ場合は、ボタン名を参照キーとするので helpName は不要
'UserForm から呼ぶ場合は、helpName を参照キーとして指定する
Public Sub ShowHelpMessage(Optional helpName As String = "")
Dim msg, helpArea, modeSw
      modeSw = vbModal
      'WorkSheet から呼んだ場合
      If helpName = "" Then helpName = Application.Caller: modeSw = vbModeless
      On Error GoTo errExit
      '一覧から適合するメッセージを選択
      Set helpArea = _
        ThisWorkbook.Worksheets(helpSheetName).Range(messageList).Offset(1, 0).CurrentRegion
      Set helpMessageCell = _
        helpArea.Columns(1).Find(what:=helpName, lookat:=xlWhole, MatchCase:=False).Offset(0, 1)
      msg = helpMessageCell.Value
      'フォームの高さなどを調節して、メッセージを表示
      With HelpForm
            .Height = formHeight - buttonAreaHeight
            .UpdateButtonImage.Visible = IamAdmin
            .HelpTextBox.Locked = Not IamAdmin
            If IamAdmin Then
                  .Height = formHeight
                  helpName = helpName & "     (編集ができます)"
            End If
            .HelpTextBox.Value = msg
            .Caption = helpName
            .Show modeSw
      End With
errExit:
End Sub
'更新ボタンがクリックされた場合の処理
Public Sub UpdateHelpMessage()
      helpMessageCell.Value = HelpForm.HelpTextBox.Value
End Sub