Excel VBA ユーザフォームを使ってセルのコメントを良い感じに更新できるようにしたい
2022/6/23
タイトルの通りです。とは言っても、分かり辛いですね。説明していきます。
私の葛藤
Excelを使っていてコメント機能を使うことがあると思います。
こんな感じです。最初に一発登録して終わりなら良いのですが、追記したくなることがあります。そんな時に、右クリックして、コメントを編集を押して、この小さい黄色い枠の中を編集する必要があります。
この黄色い枠、やっかいで、ちょっと違うところをクリックしちゃうとフォーカスが外れて編集モードが終わってしまいます。大きさは変えられるといっても、そもそもが小さくて扱い辛いです。
やりたいこと
それはズバリ、あたかもメモ帳で編集しているかのような操作性でコメントを更新するです。
やりたいことを簡単に設計してみます。
- コメントを新規追加または追記したいセルを選択
- ボタンを押す(マクロを発動させる)
- ユーザフォームが表示され、コメントボックスに記載したいコメントを記載できる。この時、すでにコメントがある場合はそのコメントがコメントボックスに記載済みとなっており、追記したい場合はそこに追記する。これはセルのコメントがメモ帳で開けているようなUIをイメージ。
- コメント追記後、「Save」ボタンを押すと更新でき、「Cancel」ボタンを押すとキャンセルする。
こんな感じです。
メインのコード
メインのコードです。セルを選択した状態でマクロ発動させるためのものです。
Sub open_comment()
Dim comment As String
With ActiveCell
If TypeName(.comment) = "Comment" Then
comment = ActiveCell.comment.text
Else
comment = ""
End If
End With
comment_form.comment_box.Value = comment
comment_form.Show
End Sub
ユーザフォーム
ユーザフォームはこんな感じにしました。
ユーザフォームのボタン用コード
各ボタン(Save、Cancel、等)用のコードです。
Private Sub add_today_Click()
Dim temp_text As String
Dim today As String
today = Format(Date, "yyyy/mm/dd")
temp_text = comment_form.comment_box.Value + vbCrLf + today
comment_form.comment_box.Value = temp_text
End Sub
Private Sub cancel_Click()
Unload Me
End Sub
Private Sub save_Click()
ActiveCell.ClearComments
ActiveCell.AddComment (comment_form.comment_box.Value)
Unload Me
End Sub
ユーザフォームのパーツのプロパティ
ユーザフォームに配置したボタン(SAVEやCANCEL)のプロパティも掲載しておきます。基本的にはレイアウトやフォント等好みによるところが多いと思いますが、「オブジェクト名」と「Caption」は重要です。
「オブジェクト名」については実際にVBAでコーディングする際に必要な名前となります。VBAではこのオブジェクト名を指定することで、値の引き渡しや制御を行います。
「Caption」については、実際にユーザが目にする文字列になります。例えば、「SAVE」でなく「保存」と見せたければ、「保存」とします。この時、オブジェクト名には影響しませんので、コードを変更せずに見た目だけ変更したいという際にもこのCaptionを変更することになります。
下記のコードで実行しようとするとcomment_formのところで修飾子が不正ですと出ます
何か設定が間違っていますでしょうか?
Sub open_comment()
Dim comment As String
With ActiveCell
If TypeName(.comment) = “Comment” Then
comment = ActiveCell.comment.text
Else
comment = “”
End If
End With
comment_form.comment_box.Value = comment
comment_form.Show
End Sub
レンさん
コメントありがとうございます。(多忙ゆえ気付くのが遅れてしまいました)
本件いかがですか?
作ったのが前のことでうろ覚えで申し訳ないのですが、フォーム自体にも定義が必要かと。
例えば、
comment_form.comment_box.Value
とは、comment_formという名のフォームの、comment_boxという名のテキストボックスの、Value(値)なので。
この辺、記事の中に書けていませんでしたね。。。お手数おかけしました。