hiroshi akutsuの日記

主にプログラミング関係のこと

Excel vba【specialcells(xlcelltypeconstants)で定数セルが1つもない場合はエラーになる場合】

たとえばエクセルのマクロで

Dim ra As Range
Set ra = Selection.SpecialCells(xlCellTypeConstants)

でselectionに何か値が入っているセルがないとエラーになる。

こういうのが面倒というか、vbaの振る舞いが予想しづらいところで、非常に煩わしく感じる。

とりあえずおこられてしまったので、

Dim ra As Range
Set ra = Selection
If Apprication.WorksheetFunction.CountA(ra) Then
  Set ra = ra.SpecialCells(xlCellTypeConstansts)
End If

とした。
ワークシート関数のcounta関数を使って判定。
counta関数はご存じのとおり、引数にセル範囲を渡してやると文字や数値が入力されたセルの個数を返してくれる。

if文の条件式に0以外の数値が渡るとtrueと扱われる。

ネットで調べたら、on error gotoで別処理させる例がよく載っていたが数百行に及ぶモジュールになってくるとスパゲッティ化するのであれだけは新人に真似してほしくない。
on error gotoを使うならせめてユーザー定義関数とかで最小の影響範囲に抑える工夫が必要だ。

ただし、ベンチマークをとっていないので、specialcells(xlcelltypeconstants)の全部をこうしたらいいという保証はできない。countaもだいぶ高速だと思うが。