セルのコメントを編集する(3) ユーザーフォーム編-1
前回までは InputBox関数を使ってセルのコメント編集を行いました。複数行に対応はしましたが、その方法は区切り文字を使うというちょっとまどろっこしいものでした。もう少し編集画面をなんとか出来ないかと思ったのがこの記事を作るきっかけです。
入力ダイアログにユーザーフォームを使う
ユーザーフォームの作り込み
早速作っていきます。Visual Basic Editorのプロジェクトウィンドウ、個人用マクロブック(PERSONAL.XLSB)で右クリックから挿入>ユーザーフォームを選びます。
UserForm1が作られました。
ツールボックスを表示させます。
テキストボックスを配置します。
ボタンを配置します。
オブジェクト名を変更する
プロパティウィンドウでオブジェクト名を分かりやすい名前に変更します。オブジェクト名はコード入力でも使います。ここでは以下のようにしました。
- ユーザーフォーム:UF_EditComment
- テキストボックス:TB_EditComment
- コマンドボタン:Btn_EditCommentOK
オブジェクトのプロパティを設定する
オブジェクトのプロパティはある程度はプロパティウィンドウでも設定できますし、コード記述で設定することも可能です。ここでは以下のようプロパティウィンドウで設定しました。
ユーザーフォーム
プロパティ | 内容 |
---|---|
(オブジェクト名) | UF_EditComment |
Caption | コメント編集 |
- Caption : 表示される名称
テキストボックス
プロパティ | 内容 |
---|---|
(オブジェクト名) | TB_EditComment |
MultiLine | True |
WordWrap | False |
EnterKeyBehavior | True |
ScrollBars | fmScrollBarsBoth |
IMEMode | fmIMEModeHiragana |
TabIndex | 0 |
- MultiLine : テキストボックスを複数行対応させるか (True/False)
- WordWrap : テキストボックスの右端で自動改行させるか (True/False)
- EnterKeyBehavior : Enterキーを押したときにテキストボックス内で改行するか (True/False)
- ScrollBars : fmScrollBarsBoth=縦横のスクロールバーを有効にする
- IMEMode : fmIMEModeHiragana=テキストボックスで自動的にIMEをひらがなモードにする
- TabIndex : TABキーを押したときにフォーカスが移動する順番 (0, 1, 2, ……)
コマンドボタン
プロパティ | 内容 |
---|---|
(オブジェクト名) | Btn_EditCommentOK |
Caption | OK |
TabIndex | 1 |
標準モジュールのコード
まず標準モジュールにコードを書きます。(2017.10.31追記あり)
Sub EditComment() ' ** ユーザーフォーム版コメント編集 ** If TypeName(ActiveCell.Comment) = "Comment" Then ' ** コメントがある場合 Dim BoolCommentVisible As Boolean ' ** 既存コメントの表示状態を記憶 BoolCommentVisible = ActiveCell.Comment.Visible ' ** 既存コメントが非表示なら表示させる If BoolCommentVisible = False Then ActiveCell.Comment.Visible = True End If ' ** ユーザーフォームをモーダルで表示 ** UF_EditComment.Show (vbModal) ' ** 既存コメントの状態を回復 If BoolCommentVisible = False Then ActiveCell.Comment.Visible = False End If Else MsgBox "コメントがありません。", vbOKOnly + vbExclamation End If End Sub
ここでは対象セルのコメントの有無を判定して、あればユーザーフォーム:UF_EditCommentをモーダルで表示するよう指示しています。
(2017.10.31追記)また、コメントが表示状態でないとエラーになるため、コメントが非表示状態の場合はユーザーフォームを表示させる前にコメントを表示状態にしています。フォームが閉じられるとコメントを非表示状態に戻します。(追記ここまで)
- Modal (モーダル) : フォーカスをユーザーフォームのみに当て、エクセルのメイン画面に当てない
- Modeless (モードレス) : フォーカスをユーザーフォームとエクセルのメイン画面の両方に当てる
例としては、セルの書式設定ウィンドウがモーダル、検索/置換ウィンドウがモードレスです。
起動テスト
マクロ:EditCommentの起動テストをしてみます。
セルにコメントがある場合、このようにユーザーフォームが表示されます。
テキストボックスに文字を入力して挙動を確認して下さい。
- テキストボックス内で改行できるか?
- EnterでフォーカスがOKに飛んでしまわないか?
- テキストボックスの右端で自動改行されてしまわないか?
- 横スクロールバーが出てくるか?
- 縦スクロールバーが出てくるか?
また、TABキーの挙動も確認して下さい。
- TABを押すたびにテキストボックスとOKボタンにフォーカスが移動するか?
なお、この状態でOKボタンを押しても何の反応もありません。これはユーザーフォームのコードを入力していないからです。右上の×ボタンでフォームを閉じることだけが出来ます。フォームを閉じて次に進みます。
ユーザーフォーム(UF_EditComment)のコード
ユーザーフォームのコードウィンドウを表示させます。
ユーザーフォームの初期化
ユーザーフォームの初期化は決まり文句です。ユーザーフォームを開いたときに処理しておきたい内容を記します。
Private Sub UserForm_Initialize() End Sub
オブジェクトのプロパティをプロパティウィンドウで設定しなかった場合はユーザーフォームの初期化の中でプロパティを記述する必要があります。ここではプロパティウィンドウで設定済みなのでコードはありません。
今回は必要な処理は下記になります。
- 現在のセルを記憶させる
- 既存のコメントをテキストボックスに表示する
Private StrActiveCell As String ' ** ユーザーフォームの初期化 ' ** ユーザーフォームの初期化 ** Private Sub UserForm_Initialize() ' ** 現在のセルを記憶 ** StrActiveCell = ActiveCell.Address ' ** 既存のコメントをテキストボックスに表示 ** TB_EditComment.Text = ActiveCell.Comment.Text End Sub
OKボタンを押したときの処理
次に、OKボタンを押したときの処理を書きます。
Private StrComment As String Private Sub Btn_EditCommentOK_Click() ' ** OKボタンを押したときの挙動 ' ** テキストボックスの内容を変数に代入 StrComment = TB_EditComment.Text ' ** 編集内容が空白ならキャンセルとみなしてフォームを閉じる If StrComment = "" Then Unload UF_EditComment Exit Sub End If ' **セルのコメント内容を上書きする With Range(StrActiveCell) With .Comment .Shape.Select True .Text Text:=StrComment End With .Activate End With ' **フォームを閉じる Unload UF_EditComment End Sub
完成したマクロの動作を確認する
完成しました。