ワークシートあるいはユーザーフォームの各所にヘルプボタンを配置して、そこをクリックすれば該当するヘルプメッセージが表示される、というようにしたいことがあります。よくあります。
こうしておけば、余計なマニュアルを作らずに済む、かもしれないし、1週間後、1カ月後の自分自身も安心できます。
ユーザーフォームにもたせるコードは、以下のようなもの。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 という名前をつけてあります。左上のセルに直接名前をつけると、挿入削除などの操作を行うたびに混乱してしまいます。
さて、以下が各ボタン(またはユーザーフォーム上のコントロール)が呼び出す 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