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 SubExcel 97以降は、ワークシート関数がWorksheetFunctionオブジェクトとして独立しましたので、本来ならSub Sample3() MsgBox Application.WorksheetFunction.Sum(Range("A1:A3")) End Subと書くのがセオリーです。 しかし、ネットの掲示板などでは「使えるから」という理由で「Application.Sum」のようなマクロも、たまに紹介されていますが、これは上記のように、下位互換のために残された「隠し機能」であり、裏技などではありません。 今後バージョンアップによって、不意に使えなくなることもあり得ます。 そうしたときに困らないためにもセオリー通りのWorksheetFunctionを使うよう心がけましょう。