連載
» 2014年06月25日 18時00分 UPDATE

VBA/マクロ便利Tips:Excelのコメントに文字列や画像を表示/削除し、文字列を検索

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、AddCommentメソッドでコメントに文字列や画像を挿入し、ClearCommentsメソッドでコメントを削除し、InStr関数で複数のコメントを検索する方法を紹介。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprize(64ビット)+Excel 2013


Excelのコメントをマクロで使いこなせ!

 今回はセルに対してコメントを設定するTipsを紹介する。コメントの設定はExcelメニューの[校閲]→[コメントの挿入]で、アクティブになっているセルにコメントを挿入できる(図1)。

vba_comment01.jpg 図1 アクティブなセルにExcelのメニューからコメントを設定した

 さて、このコメントを挿入するマクロの有用性はどこにあるのか? と考えると、一度マクロを書いて、挿入するコメントの内容を定型化しておけば、ボタン一つで、選択されてアクティブになっているセルに、コメントを挿入できるといったところだろうか。

 毎回毎回同じコメントをメニューから選択して設定する手間は大いに省けると思う。わずかな手間の積み重ねが、作業効率化のガンとなる。ガンは小さいうちに処置しておくことが望まれる。

 また、コメントに画像を表示させるTipsも紹介する。さて、これはどんな場合に利用すれば便利だろう。筆者が思い浮かべたのは社員の個人情報管理で、「氏名」にこのコメントを挿入して、「氏名」に該当する人物の顔写真等を挿入しておけば、社員の管理に役に立つのではないかと思う。履歴書に張る顔写真と同じ考えだ。

 「複数のコメント内を検索」では、コメント内に記述しているコメントの一部をキーワードとして、そのキーワードに該当するセルを選択する方法を解説する。

 各セルにコメントを挿入しておいて、どのセルにどのようなコメントを書いていたか、いちいちセルをクリックしてはコメント内を見ていくのは手間である。検索入力欄とボタンを配置して、検索機能を実装すれば大変に効率も良く便利だと思うので、そのTipsを紹介する。

AddCommentメソッドでセルにコメントを挿入する

 まずは、「セルにコメントを挿入する」Tipsの解説からだ。例えば、図2のような「月別売上」データがあったとしよう。このデータの「12月売上」の金額のセルに「最高売上げ! よく頑張った!」とコメントを追加してみよう。

vba_comment02.jpg 図2 「月別売上」の入力されたデータ

 図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
リスト1 「コメント」を挿入するコード

 TypeNameでアクティブなセルにコメントが設定されているかどうかをチェックし、コメントが設定されていない場合は、AddCommentメソッドでコメントを追加し、コメントの内容を指定する。

 既にコメントが設定されている場合は警告メッセージを表示して処理を抜ける。

 「12月売上」の金額セルを選択した状態で、VBEメニューの「実行」→[Sub/ユーザーフォームの実行]と選択して実行すると図3のように表示される

vba_comment03.jpg 図3 「12月売上」の金額にコメントが挿入された

 すでにコメントが設定されているC14のセルをアクティブセルにした状態で、再度このマクロを実行すると図4のように警告メッセージが表示される。

vba_comment04.jpg 図4 警告メッセージが表示された

AddCommentメソッドでセルのコメントに画像を表示

 セルに挿入したコメントにはテキストだけではなく、画像も表示できる。

画像を表示するAddCommentメソッドの書式

{オブジェクト}.AddComment.Shape.Fill.UserPicture {絶対パス付画像ファイル名}


 {オブジェクト}には対象となるRangeオブジェクトまたはActiveCellを指定する。{絶対パス付画像ファイル名}には、例えば「C:\VBA Images\光.jpg」のように絶対パス付の画像ファイル名を指定する。

 今回の場合は事前に「C:\VBA Images」というフォルダーを作っておいて、その中に複数のJPEG画像を配置している。

 図5のような「画像名」の表示されたデータがあったとしよう。「コメントに画像を表示」ボタンはExcelメニューの[挿入]→[図形]と選択して「角丸四角形」を配置した。このボタンにこれから作成するマクロを関連付ける。

vba_comment05.jpg 図5 「画像名」の表示されたデータ

 図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
リスト2 「画像名」にコメントを挿入して、画像を表示させるコード

 まず、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のように表示される。

vba_comment06.jpg 図6 セルをアクティブにして「コメントに画像を表示」ボタンをクリックした

ClearCommentsメソッドでコメントの削除

 図6を見ると、「コメントの削除」というボタンが見える。このボタンに関連付けているマクロはリスト3だ。

Sub コメントの削除()
  Range("G3:G6").ClearComments
End Sub
リスト3 コメントを削除するコード

 ClearCommetsメソッドでG3からG6のセルのコメントを削除する。

InStr関数で複数のコメント内の文字列を検索する

 最後に、「複数のコメント内の文字列を検索する」Tipsを解説しよう。例えば、図7のような「氏名」データがあったとしよう。この氏名データには、それぞれコメントが挿入されていて、以前の職場の情報が記録されている。

 このデータにはさらに、検索キーを入力できるセルと、「実行」と「リセット」ボタンを用意している。後者のボタンは、図形から「角丸四角形」を2個配置して作成した。図形から「角丸四角形」を2個配置して、「実行」と「リセット」ボタンとしている。

vba_comment07.jpg 図7 以前の職場情報の記録されたコメントが挿入されている

 なお図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 
リスト4 複数の「コメント」内を検索するコード

 まず、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
リスト5 背景色を「白」で塗りつぶすコード

 ColorIndexに「2」を指定して「白」で塗りつぶす。ColorIndexに指定する色番号については、記事「セルの数値、フォント、文字位置、背景色、けい線など表示形式/書式設定の使い方」を参照してほしい。

 これらのマクロを「実行」「リセット」ボタンに関連付け、「実行」ボタンをクリックして実行すると図2のように表示される。「リセット」ボタンをクリックすると、「黄」の背景色が削除される。

vba_comment08.jpg 図8 「検索キー入力」に「ハタダ」と入力して、該当するセルが「黄」で塗りつぶされた

まとめ

 今回はセルのコメントを操作するTipsを紹介した。各データには何らかのコメントを記入して管理する必要があると思うので、そういった場合に、今回のTipsは役に立つだろう。いろいろアレンジして実際の業務に使っていただきたい。

著者プロフィール

kuniyasu.jpg

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。