その他関連のテクニック

Excel VBAの隠しオブジェクト

(Excel 97/2000/2002/2003/2007)

Excelはバージョンアップに伴い、新しいオブジェクトが追加されることがあります。 その場合、古いオブジェクトを使用できなくしてしまうと、それまでのマクロでエラーが発生するので、古いオブジェクトは「隠しオブジェクト」として残されることがあります。

たとえば、Excel 2003までのメニューバーは、CommandBarオブジェクトとしてVBAから操作することができますが、Excel 5.0/95ではMenuオブジェクトとして実装されていました。 このMenuオブジェクトは「隠しオブジェクト」として残されていますので、Excel 2003でも使用できます。 次のコードは[編集]メニューを操作できなくします。
Sub Sample1()
    MenuBars(xlWorksheet).Menus("編集").Enabled = False
End Sub   
もちろん上記のコードは、メニューバー自体がなくなったExcel 2007で実行しても何も起こりません。 また、オブジェクトだけでなく、隠しメソッドや隠しプロパティも存在します。 たとえば、RangeオブジェクトのAutoFormatメソッドは、Excel 2003までの[書式]-[オートフォーマット]を実行して、セル範囲に組み込みの書式を設定するメソッドでした。 Excel 2007のリボンには、この「オートフォーマット」機能がありません。 しかし、AutoFormatメソッドは隠しメソッドとして残されていますので、2007でも次のコードは実行できます。
Sub Sample2()
    ActiveCell.AutoFormat Format:=xlRangeAutoFormatLocalFormat1
End Sub   
珍しいところでは、ワークシート関数を呼び出すWorksheetFunctionオブジェクトも仕様が変更されたオブジェクトです。 SUM関数やVLOOKUP関数などのワークシート関数はWorksheetFunctionオブジェクトのメンバとして提供されていますが、これはExcel 97で追加されたオブジェクトです。 Excel 5.0/95までは、ワークシート関数はApplicationオブジェクトの配下でしたので、次のようにApplicationオブジェクトのメンバとして呼び出すことができました。
Sub Sample3()
    MsgBox Application.Sum(Range("A1:A3"))
End Sub   
Excel 97以降は、ワークシート関数がWorksheetFunctionオブジェクトとして独立しましたので、本来なら
Sub Sample3()
    MsgBox Application.WorksheetFunction.Sum(Range("A1:A3"))
End Sub   
と書くのがセオリーです。 しかし、ネットの掲示板などでは「使えるから」という理由で「Application.Sum」のようなマクロも、たまに紹介されていますが、これは上記のように、下位互換のために残された「隠し機能」であり、裏技などではありません。 今後バージョンアップによって、不意に使えなくなることもあり得ます。 そうしたときに困らないためにもセオリー通りのWorksheetFunctionを使うよう心がけましょう。