Let's大谷家 あんたの日記

Just another WordPress site

【VBA】Excelで必要なセルを選択する方法

      2014/10/18

久しぶりに、Excelマクロをチョコチョコとイジってたのですが、今更ながら便利なメソッド見つけたので、まとめとく。
やりたかったのは、散乱して入力されているセルの情報を取得して、他のシートに別の形式で貼り付ける。
今回は、別シートに「コメント」として表示させることが目的。

情報が入力されているセルを探すにに、手動じゃ辛くね?
「Ctrl」+「クリック」で、目視してひたすら選択・・・
そして、間違った個所クリックしてやり直し・・・
なんて、悲しい経験ありませんか?w

じゃ、マクロで・・・と、全部のセルを舐めてセルの属性調べて対象セルのアドレスを取得・・・
おおお。そんな事やってたら、スペック高いPCでも処理追いつかんわw
一瞬で選択出来ないの?と調べた結果とサンプルです。
(Google先生、ありがとう!)

○特性セルの選択メソッド
 Selection.SpecialCells([定数]).Select

上記メソッドでセルを舐め回さなくても、一発で選択してくれる。
選択してくれる種類(定数)は、以下のとおり。

○定数の種類
 ・表示形式が設定されているセル
  xlCellTypeAllFormatConditions
 ・条件の設定が含まれているセル
  xlCellTypeAllValidation
 ・空の文字列
  xlCellTypeBlanks
 ・コメントが含まれているセル
  xlCellTypeComments
 ・定数が含まれているセル
  xlCellTypeConstants
 ・数式が含まれているセル
  xlCellTypeFormulas
 ・使われたセル範囲内の最後のセル
  xlCellTypeLastCell
 ・同じ表示形式が設定されているセル
  xlCellTypeSameFormatConditions
 ・同じ条件の設定が含まれているセル
  xlCellTypeSameValidation
 ・すべての可視セル
  xlCellTypeVisible

上記で「Ctrl」+「クリック」した感じに、対象セルを選択状態にしてくれる。
あとは、選択されたセルの情報を1つずつ処理していけば良い。
以下は、選択したセルを、他ブックの同一セルのコメントとして表示する例。

'値が設定されているセルだけを選択
Selection.SpecialCells(xlCellTypeConstants).Select

'選択されたセル単位に処理
For Each cel In Selection
  
  '処理を描く
  '選択されているセルの情報を変数に取得
  val = Range(cel.Address).Value

  '他のブックの同一セルのコメントに値を突っ込む
  Windows(fileName).Activate
  Worksheets(sheetName).Range(cel.Address).AddComment val
  'コメント常に表示に設定
  Worksheets(sheetName).Range(cel.Address).comment.Visible = True
  '見栄え悪いからコメントサイズを入力文字で自動調整
  Worksheets(sheetName).Range(cel.Address).comment.Shape.TextFrame.AutoSize = True

Next

ちなみに、突っ込む先のセルに、すでにコメントが設定されてる場合は落ちますw
あくまでも、上記はサンプルってことでw

もし、Exception的な処理を入れたいのなら、以下の通り。

if文で分岐
if Worksheets(sheetName).Range(cel.Address).comment Nothing Then
    'コメントが設定されてない場合のみ処理
    MsgBox "コメントは設定されてないよ!"
End If
'----------------
※コメント挿入部分の前後にエラートラップ設定
On Error GoTo COMMENT_ERROR
    Worksheets(sheetName).Range(cel.Address).AddComment val
On Error GoTo 0
'----------------

'※メソッド最終行に以下のエラートラップに引っかかった場合の処理を記載
COMMENT_ERROR:
    'コメントがある場合は文字列変更
    Range(cnsRANGE).Comment.Text strTEXT
    ' エラー発生の次行に戻る
    Resume Next
End Sub

後者は、やらない方がいい。
Basic時代からの「構造化PGではGOTO文ご法度」に触発するので・・・

(追記)
あとから考えたら、GOTO使わず、オブジェクトにぶっこんで、そのオブジェクトの設定内容で分岐させればいいだけでした。
頭回ってないなーw

たまーに、チョコチョコと作るマクロ。
こういうの調べて、チョロチョロツール作る時間は楽しくって仕方がないw

 - Excel(機能・VBA), プログラミング