[作って]セルの数式をコメント表示するマクロ


【2025年9月】

人前でExcelを操作しているとき、私はよくセル内の数式をコメント(メモ)で表示します。

ご覧になった方から「今どうやったんですか?」「それ何ですか?」などと、今までに数え切れないほど質問されてきました。これは、自作のアドインです。かなり昔に作りました[*1(下記参照)]。

上図のように、セルの数式をコメントで表示するマクロです。ただ表示するだけなら、意外と簡単なんですけど、関数名だけ文字の色を変えたり、表示する位置を記憶して前回と同じ位置に表示したり、コメント枠の大きさを変更できたりと、本物はけっこう多機能ですw 私の「VBAアドイン活用」セミナーに参加された方には、お土産として差し上げているのですけど、これ、きっとAIで作れますよね。ちなみに、表示しているのは旧コメント機能です。今はメモという名称に変わりました。

セルに入力されている数式を、Excelのメモ機能で表示するVBAのコードを作って
ExcelのVBAで、セルに入力されている数式をそのセルのメモ(コメント)として表示するには、
以下のようなVBAコードを使うことができます。

Sub ShowFormulasInComments()
    Dim cell As Range
    For Each cell In ActiveSheet.UsedRange
        If cell.HasFormula Then
            cell.ClearComments
            cell.AddComment Text:="数式: " & cell.Formula
        End If
    Next cell
End Sub
このコードは、アクティブなシートのすべてのセルを調べて、数式が入力されているセルに
その数式内容をメモとして表示します。既存のメモは消去されます。必要に応じて、
範囲を変更したり、コメントの内容を調整してください。

ああ、プロンプトが雑すぎました。そういうことじゃ、ないんです。もう一度。

アクティブセルに入力されている数式を、アクティブセルにExcelのメモ機能として追加して、画面上に表示するVBAのコードを作って
Sub ShowActiveCellFormulaInComment()
    Dim cell As Range
    Set cell = ActiveCell
    If cell.HasFormula Then
        cell.ClearComments
        cell.AddComment Text:="数式: " & cell.Formula
        cell.Comment.Visible = True
    Else
        MsgBox "アクティブセルに数式は入力されていません。"
    End If
End Sub
このコードは、アクティブセルに数式が入力されている場合、その数式をメモ(コメント)
として追加し、画面上に表示します。マクロ有効ブックで実行してください。

とりあえず、できましたね。では、本物に近づけていきましょう。

アクティブセルに入力されている数式だけを、アクティブセルにExcelのメモ機能として追加して、画面上に表示するVBAのコードを作って。メモ内の文字サイズを24ポイントにして、メモ枠の大きさを自動調整して。
Sub AddFormulaAsComment()
    Dim c As Range
    Set c = ActiveCell
    Dim f As String
    f = c.Formula
    If f <> "" Then
        ' 既存のコメントを削除
        On Error Resume Next
        c.Comment.Delete
        On Error GoTo 0
        ' 数式をコメントとして追加
        c.AddComment Text:=f
        ' フォントサイズを24ポイントに設定
        With c.Comment.Shape.TextFrame.Characters.Font
            .Size = 24
        End With
        ' コメント枠の大きさを自動調整
        c.Comment.Shape.TextFrame.AutoSize = True
    End If
End Sub

おお、なかなかいいじゃないですか。なんか似てきました。表示位置も指定してみましょう。ちなみに、本物と同じ仕様にします。

アクティブセルに入力されている数式だけを、アクティブセルにExcelのメモ機能として追加して、画面上に表示するVBAのコードを作って。メモ内の文字サイズを24ポイントにして、メモ枠の大きさを自動調整して。メモ枠の上位置を、アクティブセルの上位置から30ポイント下に下げて。メモは常に表示されるようにして。
Sub AddFormulaAsNoteAndShow()
    Dim c As Range
    Set c = ActiveCell
    Dim f As String
    f = c.Formula
    If f <> "" Then
        ' 既存のメモ(Note)を削除
        On Error Resume Next
        c.Note.Delete
        On Error GoTo 0
        ' 数式をメモとして追加
        c.AddNote Text:=f
        ' フォントサイズを24ポイントに設定
        With c.Note.Shape.TextFrame2.TextRange.Font
            .Size = 24
        End With
        ' メモ枠の大きさを自動調整
        c.Note.Shape.TextFrame2.AutoSize = msoTrue
        ' メモ枠の位置を調整(上端をセルの上端から30ポイント下へ)
        With c.Note.Shape
            .Top = c.Top + 30
            .Left = c.Left
        End With
        ' メモを常に表示
        c.Note.Visible = True
    End If
End Sub

おや、エラーになってしまいました。ひとつ前のコードは正常に動作したのに。原因は明らかです。セル(Rangeオブジェクト)に、AddNoteなんてコマンドはありません。ひとつ前のコードでは、正しくAddComment使ってたのにな。何か、勘違いしたのでしょうか。手で直してもいいですけど、AIに告げて修正してもらいましょう。

提示されたコードを実行したら「c.AddNote Text:=f」の行でエラーになりました。エラーを修正してください。
ご指摘ありがとうございます。VBAでは「AddNote」は存在しません。従来の「メモ」は
「AddComment」で追加します(※「コメント」と表示されますが、従来の「メモ」機能です)。
また、コメントの常時表示・位置調整・フォントサイズ設定も下記のように修正できます。

Sub AddFormulaAsCommentAndShow()
    Dim c As Range
    Set c = ActiveCell
    Dim f As String
    f = c.Formula
    If f <> "" Then
        ' 既存のコメントを削除
        On Error Resume Next
        c.Comment.Delete
        On Error GoTo 0
        ' 数式をコメントとして追加
        c.AddComment Text:=f
        ' フォントサイズを24ポイントに設定
        With c.Comment.Shape.TextFrame.Characters.Font
            .Size = 24
        End With
        ' コメント枠の大きさを自動調整
        c.Comment.Shape.TextFrame.AutoSize = True
        ' コメント枠の位置を調整(セルの上端から30ポイント下へ)
        With c.Comment.Shape
            .Top = c.Top + 30
            .Left = c.Left
        End With
        ' コメントを常に表示
        c.Comment.Visible = True
    End If
End Sub

自分の間違いを素直に認めて、ただちに修正してくれるのは好感が持てますね。どこぞの"数式担当"さんとは大違いです。メモ枠の左位置も調整してもらいます。

アクティブセルに入力されている数式だけを、アクティブセルにExcelのメモ機能として追加して、画面上に表示するVBAのコードを作って。メモ内の文字サイズを24ポイントにして、メモ枠の大きさを自動調整して。メモ枠の上位置を、アクティブセルの上位置から30ポイント下に下げて。メモ枠の左位置を、アクティブセルの右位置から12ポイント右に移動して。メモは常に表示されるようにして。
Sub AddFormulaAsCommentAndShow_CustomPosition()
    Dim c As Range
    Set c = ActiveCell
    Dim f As String
    f = c.Formula
    If f <> "" Then
        ' 既存のコメントを削除
        On Error Resume Next
        c.Comment.Delete
        On Error GoTo 0
        ' 数式をコメントとして追加
        c.AddComment Text:=f
        ' フォントサイズを24ポイントに設定
        With c.Comment.Shape.TextFrame.Characters.Font
            .Size = 24
        End With
        ' コメント枠の大きさを自動調整
        c.Comment.Shape.TextFrame.AutoSize = True
        ' コメント枠の位置を調整
        With c.Comment.Shape
            .Top = c.Top + 30
            .Left = c.Left + c.Width + 12
        End With
        ' コメントを常に表示
        c.Comment.Visible = True
    End If
End Sub

できましたね。本物とそっくりです。普通に使うのでしたら、これで充分なのでは?では最後に、私が悩んだ「数式文字列の中で、関数名だけ青色にする」部分も聞いてみましょう。これ、できたら相当すごいです。でも、たぶんやってくれるでしょう。期待します。現在はSUM関数しか使っていませんので、もしかすると"SUM"という文字列を限定してくるかもなので、IF関数も追加します。

アクティブセルに入力されている数式だけを、アクティブセルにExcelのメモ機能として追加して、画面上に表示するVBAのコードを作って。メモ内の文字サイズを24ポイントにして、メモ枠の大きさを自動調整して。メモ枠の上位置を、アクティブセルの上位置から30ポイント下に下げて。メモ枠の左位置を、アクティブセルの右位置から12ポイント右に移動して。数式の文字列内に含まれる「関数名と認識される」文字だけを青色に設定して。関数は何が使われるか分からないとします。メモは常に表示されるようにして。
Sub AddFormulaAsCommentWithBlueFunctions()
    Dim c As Range
    Set c = ActiveCell
    Dim f As String
    f = c.Formula
    If f <> "" Then
        ' 既存のコメントを削除
        On Error Resume Next
        c.Comment.Delete
        On Error GoTo 0
        ' 数式をコメントとして追加
        c.AddComment Text:=f
        ' フォントサイズを24ポイントに設定
        With c.Comment.Shape.TextFrame.Characters.Font
            .Size = 24
        End With
        ' 関数名を青色に設定
        Dim regEx As Object
        Set regEx = CreateObject("VBScript.RegExp")
        regEx.Global = True
        regEx.IgnoreCase = False
        regEx.Pattern = "([A-Z][A-Z0-9_\.]*)\s*\("
        Dim matches As Object
        Set matches = regEx.Execute(f)
        Dim i As Integer
        For i = 0 To matches.Count - 1
            With c.Comment.Shape.TextFrame.Characters(matches(i).FirstIndex + 1, Len(matches(i).SubMatches(0)))
                .Font.Color = RGB(0, 112, 192) ' 青色
            End With
        Next i
        ' コメント枠の大きさを自動調整
        c.Comment.Shape.TextFrame.AutoSize = True
        ' コメント枠の位置を調整
        With c.Comment.Shape
            .Top = c.Top + 30
            .Left = c.Left + c.Width + 12
        End With
        ' コメントを常に表示
        c.Comment.Visible = True
    End If
End Sub

できた!さすが"VBA担当"さん!正規表現を使いましたか。ちなみに、セルや数式に名前を定義していたり、かなり変わった使い方をしていると、文字色変更が対応出来なくなるかもですけど、そしたら正規表現のパターンを変えればいいですね。ちなみに本物は、人前で失敗すると恥ずかしいのでw もっと多くの方法で関数名だけを抽出しています。

まとめ

こうした特殊なマクロも、問題なく作成できますね。AIの「VBAコード生成」はすごいです。途中で一回間違えましたけど、そんなのは"ご愛敬"でしょう。指摘したら、すぐに修正してくれましたからね。みなさんも、ぜひこのコードをアドインに仕込んで活用してください。ちなみに、本物はもっと高機能だけどね~( ̄^ ̄)v


余談

(*1)最初に作ったのは、かなり昔です。私が会社員を辞めてライターとして独立し、パソコン雑誌や書籍の執筆をしていた頃、とある出版社さんから「読者にセミナーやって」と依頼されました。懐かしい。まだ30歳代前半の頃でした。場所は新橋です。SL広場の近くだったかな。よく覚えています。朝マックを食べてから行きました。たぶん、初めてのセミナーだったと思います。ネタは「ワークシート関数の活用」的なやつです。たくさんの数式を準備して挑みました。開始後しばらくして「では、この数式を入力してください」みたいに告げると「先生、(文字が小さくて)見えませ~ん」と言われました。部屋はけっこう広く50人くらい集まっていて、そりゃ後ろの席でなくても、数式バーに書かれている文字は見えないですよねw 初めてのセミナーだったので、そこに気づきませんでした。慌てて、とりあえず数式をホワイトボードに手書きし「これを写してください」と対処しました。こりゃヤバいってんで、控え室でお昼のお弁当を食べながら、この"数式をコメントで表示するマクロ"を作り午後の部を乗り切りました。そのときの様子は、なぜか今でも克明に覚えています。それから数十年、長い間使い続け「もっと、こうできたら便利かも」って、いろんな機能を追加しました。今ではすっかり指に馴染んでいて、他の人のExcelを触っているときでも、つい指が勝手に動いたりしちゃいます。いやぁ、時の経つのは早いですね。当時に、今のようなAIがあったら、もっとお弁当をゆっくり食べられたのにw