Excelのコメントに文字列や画像を表示/削除し、文字列を検索:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、AddCommentメソッドでコメントに文字列や画像を挿入し、ClearCommentsメソッドでコメントを削除し、InStr関数で複数のコメントを検索する方法を紹介。
Excelのコメントをマクロで使いこなせ!
今回はセルに対してコメントを設定するTipsを紹介する。コメントの設定はExcelメニューの[校閲]→[コメントの挿入]で、アクティブになっているセルにコメントを挿入できる(図1)。
さて、このコメントを挿入するマクロの有用性はどこにあるのか? と考えると、一度マクロを書いて、挿入するコメントの内容を定型化しておけば、ボタン一つで、選択されてアクティブになっているセルに、コメントを挿入できるといったところだろうか。
毎回毎回同じコメントをメニューから選択して設定する手間は大いに省けると思う。わずかな手間の積み重ねが、作業効率化のガンとなる。ガンは小さいうちに処置しておくことが望まれる。
また、コメントに画像を表示させるTipsも紹介する。さて、これはどんな場合に利用すれば便利だろう。筆者が思い浮かべたのは社員の個人情報管理で、「氏名」にこのコメントを挿入して、「氏名」に該当する人物の顔写真等を挿入しておけば、社員の管理に役に立つのではないかと思う。履歴書に張る顔写真と同じ考えだ。
「複数のコメント内を検索」では、コメント内に記述しているコメントの一部をキーワードとして、そのキーワードに該当するセルを選択する方法を解説する。
各セルにコメントを挿入しておいて、どのセルにどのようなコメントを書いていたか、いちいちセルをクリックしてはコメント内を見ていくのは手間である。検索入力欄とボタンを配置して、検索機能を実装すれば大変に効率も良く便利だと思うので、そのTipsを紹介する。
AddCommentメソッドでセルにコメントを挿入する
まずは、「セルにコメントを挿入する」Tipsの解説からだ。例えば、図2のような「月別売上」データがあったとしよう。このデータの「12月売上」の金額のセルに「最高売上げ! よく頑張った!」とコメントを追加してみよう。
図2では、各セル内にExcelのメニューから文字サイズや文字色の書式設定を事前にしておいた。
文字列を表示するAddCommentメソッドの書式
{オブジェクト}.AddComment Text:={コメントの内容}
{オブジェクト}には、対象となるRangeオブジェクトまたはActiveCellを指定する。{コメントの内容}には、コメントに表示するテキストを指定する。
VBEを起動してModule1内にリスト1のコードを記述する。
Option Explicit Sub コメントの挿入() If TypeName(ActiveCell.Comment) = "Nothing" Then ActiveCell.AddComment Text:="最高売上!" & vbCrLf & "よく頑張った!" ActiveCell.Comment.Visible = True Else MsgBox "既にコメントが設定されています!" Exit Sub End If End Sub
TypeNameでアクティブなセルにコメントが設定されているかどうかをチェックし、コメントが設定されていない場合は、AddCommentメソッドでコメントを追加し、コメントの内容を指定する。
既にコメントが設定されている場合は警告メッセージを表示して処理を抜ける。
「12月売上」の金額セルを選択した状態で、VBEメニューの「実行」→[Sub/ユーザーフォームの実行]と選択して実行すると図3のように表示される
すでにコメントが設定されているC14のセルをアクティブセルにした状態で、再度このマクロを実行すると図4のように警告メッセージが表示される。
AddCommentメソッドでセルのコメントに画像を表示
セルに挿入したコメントにはテキストだけではなく、画像も表示できる。
画像を表示するAddCommentメソッドの書式
{オブジェクト}.AddComment.Shape.Fill.UserPicture {絶対パス付画像ファイル名}
{オブジェクト}には対象となるRangeオブジェクトまたはActiveCellを指定する。{絶対パス付画像ファイル名}には、例えば「C:\VBA Images\光.jpg」のように絶対パス付の画像ファイル名を指定する。
今回の場合は事前に「C:\VBA Images」というフォルダーを作っておいて、その中に複数のJPEG画像を配置している。
図5のような「画像名」の表示されたデータがあったとしよう。「コメントに画像を表示」ボタンはExcelメニューの[挿入]→[図形]と選択して「角丸四角形」を配置した。このボタンにこれから作成するマクロを関連付ける。
図5の各「画像名」にコメントを挿入して、画像を表示させるコードはリスト2になる。
Sub コメントに画像を表示() Dim 画像 As Object Dim 画像名 As String Range("G3:G6").ClearComments If TypeName(ActiveCell.Comment) = "Nothing" Then Set 画像 = LoadPicture("C:\VBA Images\光.jpg") Select Case ActiveCell.Value Case "光" 画像名 = "C:\VBA Images\光.jpg" Case "すすき" 画像名 = "C:\VBA Images\すすき.jpg" Case "枯れ木" 画像名 = "C:\VBA Images\枯れ木.jpg" Case "銀杏" 画像名 = "C:\VBA Images\銀杏.jpg" Case Else Exit Sub End Select With ActiveCell.AddComment .Shape.Fill.UserPicture 画像名 .Shape.Height=Application.CentimetersToPoints(画像.Height) / 1000 .Shape.Width = Application.CentimetersToPoints(画像.Width) / 1000 .Visible = True End With End If End Sub
まず、Object型の変数「画像」、文字列型の変数「画像名」を宣言する。
次に、G3からG6までのセルのコメントを削除しておく。この記述をしていないと、アクティブなセルにコメントを追加して画像を表示させた場合、画像が重なって表示されてしまうので注意してほしい。
アクティブなセルにコメントが挿入されていない場合は、以下の処理を行う。Object型の変数「画像」にLoadPictureメソッドで「C:\VBA Images\光.jpg」を読み込んでおく。これは、読み込んだ画像のHeightやWidthの値を取得するために必要で、特に「光.jpg」でなくてもよい。「C:\VBA Images」フォルダー内の画像をどれか一つ読み込んでおけばいい。ここで使用している画像は320×240サイズのjpg画像だ。
アクティブなセルの値によってSelect Case文で条件分岐を行う。セル内に表示されている名前で読み込む画像ファイル名を絶対パス付で変数「画像名」に格納しておく。
「画像を表示するAddCommentメソッドの書式」を使って、変数「画像名」に格納されている画像をコメント内に表示する。通常は、コメントのサイズに合わせて画像が縮小表示される。そこで、ここでは画像のサイズに合わせてコメントのサイズを大きくしている。それには、「Application.CentimetersToPoints」メソッドを使って、センチメートル単位の数値をポイント単位に変換して、コメントのサイズを読み込む画像のサイズに合わせている。
最後に、VisibleプロパティにTrueを指定してコメントを表示する。
このマクロを「コメントに画像を表示」ボタンに関連付け、実行すると図6のように表示される。
ClearCommentsメソッドでコメントの削除
図6を見ると、「コメントの削除」というボタンが見える。このボタンに関連付けているマクロはリスト3だ。
Sub コメントの削除() Range("G3:G6").ClearComments End Sub
ClearCommetsメソッドでG3からG6のセルのコメントを削除する。
InStr関数で複数のコメント内の文字列を検索する
最後に、「複数のコメント内の文字列を検索する」Tipsを解説しよう。例えば、図7のような「氏名」データがあったとしよう。この氏名データには、それぞれコメントが挿入されていて、以前の職場の情報が記録されている。
このデータにはさらに、検索キーを入力できるセルと、「実行」と「リセット」ボタンを用意している。後者のボタンは、図形から「角丸四角形」を2個配置して作成した。図形から「角丸四角形」を2個配置して、「実行」と「リセット」ボタンとしている。
なお図7でも、各セル内にExcelのメニューから文字サイズや文字色の書式設定を事前にしておいた。
InStr関数でコメントを検索する書式
InStr({オブジェクト}.Comment.Text,{検索文字列})
InStr関数を使って、{オブジェクト}(Rangeオブジェクト)のCommentのTextプロパティに、「検索文字列」が含まれているかどうかをチェックし、{検索文字列}の見つかった位置を返す。
よってInStr関数で返される戻り値が0より大きい場合は、「検索文字列」が見つかったことになる。
VBEを起動してModule1内にリスト4のコードを記述する。
Option Explicit Sub 複数コメント内検索() Dim 検索 As Range Dim no As Integer no = 0 If Range("C2").Value = "" Then MsgBox "検索キーを入力してください。" Exit Sub Else Call リセット For Each 検索 In Range("B4:B9") If TypeName(検索.Comment) = "Comment" Then If InStr(検索.Comment.Text, Range("C2").Value) > 0 Then 検索.Interior.ColorIndex = 6 Else no = no + 1 If no >= 6 Then MsgBox "検索対象はありません。" End If End If Next End If End Sub
まず、Rangeオブジェクト型の変数「検索」と、Integer型の変数noを宣言する。
次に、「検索キー入力」欄である「C2」のセルの値が空である場合は、警告メッセージを表示して、処理を抜ける。ちゃんと検索キーが入力されている場合は、「リセット」プロシージャを呼び出して、「B4」から「B9」の「氏名」が入力されているセルの背景色をColorIndexに「2」(白)を指定して塗りつぶす。この処理を行っていないと、検索文字を変更しても、先の検索文字に該当するセルが「黄」で塗りつぶされたまま残ることになる。
「B4」から「B9」のセルに対して、Rangeオブジェクト型の「検索」変数を使って以下の処理を繰り返す。さらに。TypeNameメソッドで検索対象となるコメントが「Comment」であった場合、つまり各セルにコメントが挿入されている場合は、以下の条件分岐処理を行う。
InStr関数を使って、挿入されているコメント内のTextに、「C2」のセルに入力した文字列が含まれている場合は、該当するセルの背景色を、ColorIndexに「6(黄)」を指定して塗りつぶす。コメント内に検索文字列が見つからない場合は、変数noの値を1ずつ加算させる。さらに、そのnoの値が6かそれ以上であった場合は、名前を入力しているセルに挿入されているコメント内に、検索文字列がなかったことになるため、警告メッセージを表示させる。noの値が6かそれ以上というのは、セル入力しているデータが6行分あるからだ。
リスト5は名前の入力されているセルの背景色を「白」で塗りつぶす処理だ。
Sub リセット() Range("B4:B9").Interior.ColorIndex = 2 End Sub
ColorIndexに「2」を指定して「白」で塗りつぶす。ColorIndexに指定する色番号については、記事「セルの数値、フォント、文字位置、背景色、けい線など表示形式/書式設定の使い方」を参照してほしい。
これらのマクロを「実行」「リセット」ボタンに関連付け、「実行」ボタンをクリックして実行すると図2のように表示される。「リセット」ボタンをクリックすると、「黄」の背景色が削除される。
まとめ
今回はセルのコメントを操作するTipsを紹介した。各データには何らかのコメントを記入して管理する必要があると思うので、そういった場合に、今回のTipsは役に立つだろう。いろいろアレンジして実際の業務に使っていただきたい。
著者プロフィール
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Copyright © ITmedia, Inc. All Rights Reserved.