Excel VBA ユーザフォームを使ってセルのコメントを良い感じに更新できるようにしたい

タイトルの通りです。とは言っても、分かり辛いですね。説明していきます。

私の葛藤

Excelを使っていてコメント機能を使うことがあると思います。

こんな感じです。最初に一発登録して終わりなら良いのですが、追記したくなることがあります。そんな時に、右クリックして、コメントを編集を押して、この小さい黄色い枠の中を編集する必要があります。

この黄色い枠、やっかいで、ちょっと違うところをクリックしちゃうとフォーカスが外れて編集モードが終わってしまいます。大きさは変えられるといっても、そもそもが小さくて扱い辛いです。

やりたいこと

それはズバリ、あたかもメモ帳で編集しているかのような操作性でコメントを更新するです。

やりたいことを簡単に設計してみます。

  1. コメントを新規追加または追記したいセルを選択
  2. ボタンを押す(マクロを発動させる)
  3. ユーザフォームが表示され、コメントボックスに記載したいコメントを記載できる。この時、すでにコメントがある場合はそのコメントがコメントボックスに記載済みとなっており、追記したい場合はそこに追記する。これはセルのコメントがメモ帳で開けているようなUIをイメージ。
  4. コメント追記後、「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を変更することになります。

テキストボックス

SAVEボタン

CANCELボタン

add_todayボタン

よっさん
  • よっさん
  • 当サイトの管理人。ニューヨークの大学を飛び級で卒業。その後某日系IT企業でグローバル案件に携わる。マレーシアに1.5年赴任した経験を持つ。バイリンガルITエンジニアとしていかに楽に稼ぐか日々考えている。

2件のコメント

  • 下記のコードで実行しようとすると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(値)なので。

      この辺、記事の中に書けていませんでしたね。。。お手数おかけしました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です