セルへのコメント

コメントをVBAでつけてみます。

Dim rng As Range
Set rng = ActiveSheet.Range("A1")
rng.AddComment "Comment2"

これだけでコメントがつきます。
ところがここには罠があります。
一度実行した後、もう一度実行すると「アプリケーション定義またはオブジェクト定義のエラーです」という日本語としてもおかしいエラーメッセージがでます。

エラーメッセージが使い物にならないのはいつものことなので放っておいて、なぜエラーになるかと考えると、既にコメントがあるのに、更にAddCommentしたからエラーになったのだと推察されます。

既にコメントがあり、それを変更するには

rng.Comment.Text "Comment2"

と書きます。Textだからといってプロパティと思い込んではダメで、これはメソッドです。
プロパティだと思って代入しようとして

rng.Comment.Text = "Comment2"

と書くと「定数には値を代入できません」というまたもおかしなメッセージが出ます。(定数ではないだろう)
一方でメソッドのはずなのですが、これはなぜか値を持っています。

s = rng.Comment.Text

と言う風になぜか文字列変数としての値をもっているのです。
本当に意味不明です。こうするならばプロパティにすれば良いのにとしか思えません。(メソッドとしても引数はひとつしかと取らないのですから)

ここで.Commentは既にコメントがついていないとエラーになります。
これらのことから、コメントがあるかどうかを気遣って(判定して)処理しないとダメだということです(判定方法は後述します)。

ついでに関連の記述をいくつか示しておきます。

rng.Comment.Visible = True
rng.Comment.Shape.Width = 100
rng.Comment.Shape.Height = 20

一つ目は「コメントの表示/非表示」に相当します。Trueなら表示、Falseなら非表示。
二つ目でコメント表示枠の幅を設定できます。
三つ目で同じく高さを設定できます。

さて、コメントがあるかないかで処理を分ける必要があります。
コメントありなしをTrue/Falseを返すプロパティがありそうなものですが違います。

TypeName(rng.Comment)

という風にして.Commentのタイプを文字列判定しなければならないのです。
コメントがあると”Comment”、ないと”Nothing”という文字列を返すからです。

最後にコメントの削除はというと

rng.Comment.Delete

です。これもコメントがないとエラーになります。

常に1からコメントを入れるのでならば、一旦コメントを削除してから(もちろんコメントがないとエラーになるのでコメントの有無を確認してから削除)、AddCommentをした方が処理は楽かもしれません。

Dim rng As Range
Set rng = ActiveSheet.Range("A1")
If TypeName(rng.Comment) = "Comment" Then rng.Comment.Delete
rng.AddComment "Comment2"
rng.Comment.Shape.Width = 100
rng.Comment.Shape.Height = 20
rng.Comment.Visible = True

このように、まずは既にあるコメントを削除しても良いのであればClearCommentsを使って

Dim rng As Range
Set rng = ActiveSheet.Range("A1")
rng.ClearComments
rng.AddComment "Comment2"
rng.Comment.Shape.Width = 100
rng.Comment.Shape.Height = 20
rng.Comment.Visible = True

としても同じ結果になります(判定文が不要になります)。
ClearCommentsはコメントがなくてもエラーにはならず、コメントがあればコメントを削除してくれます(Comment.Deleteはコメントがないとエラーになる)。

-