日本語入力ソフトとVBAの覚え書き

・各種日本語入力ソフトの辞書解説 ・ちょっと楽になるWord/Excel VBA集 ・ボーダーブレイク用語辞書

セルのコメントを編集する(3) ユーザーフォーム編-1


f:id:dz_dzone:20170814233145j:plain

前回までは InputBox関数を使ってセルのコメント編集を行いました。複数行に対応はしましたが、その方法は区切り文字を使うというちょっとまどろっこしいものでした。もう少し編集画面をなんとか出来ないかと思ったのがこの記事を作るきっかけです。

入力ダイアログにユーザーフォームを使う

ユーザーフォームの作り込み

早速作っていきます。Visual Basic Editorのプロジェクトウィンドウ、個人用マクロブック(PERSONAL.XLSB)で右クリックから挿入>ユーザーフォームを選びます。

f:id:dz_dzone:20171025095913j:plain

UserForm1が作られました。

f:id:dz_dzone:20171025100048j:plain

ツールボックスを表示させます。

f:id:dz_dzone:20171025140309j:plain

テキストボックスを配置します。

f:id:dz_dzone:20171025140322j:plain

f:id:dz_dzone:20171025140334j:plain

ボタンを配置します。

f:id:dz_dzone:20171025140343j:plain

f:id:dz_dzone:20171025140354j:plain

オブジェクト名を変更する

プロパティウィンドウでオブジェクト名を分かりやすい名前に変更します。オブジェクト名はコード入力でも使います。ここでは以下のようにしました。

  • ユーザーフォーム: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

f:id:dz_dzone:20171027091032j:plain

標準モジュールのコード

まず標準モジュールにコードを書きます。(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の起動テストをしてみます。

セルにコメントがある場合、このようにユーザーフォームが表示されます。
f:id:dz_dzone:20171027094416j:plain

テキストボックスに文字を入力して挙動を確認して下さい。

  • テキストボックス内で改行できるか?
  • EnterでフォーカスがOKに飛んでしまわないか?
  • テキストボックスの右端で自動改行されてしまわないか?
  • 横スクロールバーが出てくるか?
  • 縦スクロールバーが出てくるか?

また、TABキーの挙動も確認して下さい。

  • TABを押すたびにテキストボックスとOKボタンにフォーカスが移動するか?

なお、この状態でOKボタンを押しても何の反応もありません。これはユーザーフォームのコードを入力していないからです。右上の×ボタンでフォームを閉じることだけが出来ます。フォームを閉じて次に進みます。

ユーザーフォーム(UF_EditComment)のコード

ユーザーフォームのコードウィンドウを表示させます。
f:id:dz_dzone:20171027095905j:plain

ユーザーフォームの初期化

ユーザーフォームの初期化は決まり文句です。ユーザーフォームを開いたときに処理しておきたい内容を記します。

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

完成したマクロの動作を確認する

f:id:dz_dzone:20171027114949j:plain

f:id:dz_dzone:20171027115002j:plain

f:id:dz_dzone:20171027115014j:plain

完成しました。

次回:もう少し便利にいろいろ改造してみる

次回は、このユーザーフォームを元にもう少し便利に改造していきたいと思います。


以上。

にほんブログ村 IT技術ブログ VBAへ←記事を気に入って頂けたらポチッとしてもらえると励みになります。