4 人のうち 2 人が役に立つと評価しました    - このトピックを評価する

.NET 開発者の観点から捉えた Excel オブジェクト モデル

Ken Getz
MCW Technologies, LLC

April 2003
日本語版最終更新日 2003 年 9 月 26 日

対象アプリケーション
    MicrosoftR "Visual Studio Tools for Office"
    Microsoft Office Excel 2003
    Microsoft Visual StudioR .NET 2003

要約 : この文書では、Microsoft Office Excel 2003 で提供されるオブジェクトと、それらオブジェクトを使用して Microsoft Visual Studio Tools for Office でマネージ コード ソリューションを作成する方法について説明します。Application オブジェクト、Workbook オブジェクト、Worksheet オブジェクトおよび Range オブジェクトに主に焦点を当て、Visual Basic .NET コードと Visual C# コードの例を用いて、各オブジェクトのプロパティ、メソッド、およびイベントを説明します。

ExcelObj.exe は Microsoft Download Center からダウンロードできます。

目次

はじめに
Application オブジェクト
   Excel の状態を制御し、表示させるメンバ
   オブジェクトを返すメンバ
   アクションを実行するメンバ
   ファイル操作を処理するメンバ
   その他の有用なメンバ
   アプリケーションのイベント
Workbook クラス
   Workbook クラスのプロパティ
   Document プロパティの操作
   スタイルの操作
   シートの操作
   Workbook クラスのメソッド
Worksheet クラス
   Sheet クラスは存在しない
   保護の操作
   オブジェクトのプロパティ
Range オブジェクト
   選択の管理
   コード内の範囲の参照
   テクノロジの使用
   範囲の操作
   範囲内でのデータの並べ替え
次のステップに向けて

はじめに

MicrosoftR Visual Studio Tools for Office の利点を生かし、COM オートメーションのみを使用して Microsoft Office Excel 2003 アプリケーションを制御するには、開発者は Excel オブジェクト モデルで提供されるオブジェクトと対話できなくてはなりません。Excel では何百種類もの対話可能なオブジェクトが提供されていますが、まずは使用可能なオブジェクトのごく小さなサブセットに焦点を当ててオブジェクト モデルを説明します。オブジェクト モデルには、以下のようなものがあります。

  • Application
  • Workbook
  • Worksheet
  • Range

具体的に定量化することはできませんが、Excel を使用する際の大部分の作業はこの 4 つのクラスとそのメンバを中心に行われています。この文書では、各クラスの利用方法と、各オブジェクトのプロパティ、メソッド、イベントについて説明します。また、各オブジェクトの機能を紹介し、実際に使用可能な例を示します。

ヒント    一般的に、以下の重要な理由から、Microsoft Visual BasicR .NET を使用すると、Microsoft Visual C#R を使用する場合より簡単に Microsoft Office オブジェクトを操作することができます。Visual Basic for Applications (VBA) メソッドには、任意パラメータが含まれていることが多く、Visual Basic .NET はこれらのパラメータをサポートしています。C# 開発者が各任意メソッド パラメータにそれぞれ、値を指定する必要がある一方で、Visual Basic .NET 開発者は、必要な値のみを使用する参照パラメータに指定するだけです。さらに、C# ではインデクサ以外のパラメータを持つプロパティはサポートされていませんが、多くの Excel プロパティはパラメータを受け入れることができます。VBA および Visual Basic .NET において使用可能な、Application.Range プロパティのようなプロパティについても、C# 開発者のための個別の利用方法を要求します (get_Range メソッドは Range プロパティに置き換わります)。この文書内でも、このような言語ごとの違いに注意してください。

ほとんどの場合、Excel オブジェクト モデルはユーザー インタフェースを直接エミュレートします。よって、Application オブジェクトがアプリケーション全体のラッパーを提供し、各 Workbook オブジェクトに Worksheet オブジェクトの集合体が含まれるということは容易に想像がつきます。このうち、セルを表している主な抽象クラスは Range オブジェクトで、各セルまたはセルのグループの操作を可能にします。

以下の各セクションでは、主なオブジェクトについて説明し、特定のオブジェクト メンバについて取り上げます。オブジェクトは何百種類もあるため、この文書ではすべてのオブジェクトについて詳しく説明することはできませんが、オブジェクト モデルを操作するのに十分な知識を得ることができます。また、より詳しい情報を得るには Excel のオンライン ヘルプをご活用ください。

ヒント   この文書を通して、 DirectCastCType メソッドのさまざまな使用方法を知ることができます。たとえば、サンプル プロジェクトでは Option Strict がオンになっているため、Visual Basic .NET では厳密な型変換が必要になります。多くの Excel メソッドおよびプロパティは、Object型を返すか、最新のバインディングに依存します。たとえば Application.ActiveSheet プロパティは、ワークシートとは異なり、Objectを返します。したがって、できる限り厳密に変換を行うために、サンプルでは Option Strict を有効化し、それぞれの型変換を明示的に処理します (Visual Basic .NET で Option Strict を使用しなくてもコードを記述しコンパイルすることは可能ですが、実行時にエラーが発生します。つまり、Option Strict を使用する一番の目的は、実行時に例外を引き起こす無効な変換を可能な限り減らすことにあります)。C# 開発者は、この選択を妥当なものと理解できるでしょう。

このホワイト ペーパーでは、サンプル プロジェクト、ExcelObjectModel.sln を例に説明します。ExcelObjectModel.sln には Excel ワークブックとそれに関連する Visual Basic .NET コードが含まれます。ここで説明されるすべてのサンプル プロジェクトがプロジェクト例で示されるわけではありませんが、ワークブックにはすべてのプロジェクトに関連する複数の行またはコードを配置し、そのコードを呼び出すハイパーリンクもプロジェクト内に設定されます。

ヒント    スペースの都合上、この文書ではすべてのオブジェクトおよびメンバは説明しません。それぞれの細かなクラスについての説明も割愛します。大規模なオブジェクト モデルについて調べるツールとしては、オブジェクト ブラウザ ウィンドウが最適です。メンバの情報を含む、各クラスのリストを入手することができます。リストには、この文書で説明されているメンバの多くが含まれており、それらのメンバはさまざまなクラスに適用されます。たとえば、Sheets コレクションのコンテキストで述べられる PrintOut メソッドは、Chart オブジェクト、Worksheet オブジェクト、Range オブジェクトおよびその他オブジェクトにも同様に適用されます。この文書の要点は、使用可能なメソッド、メンバ、クラス、オブジェクトなどのヒントを与えることです。それ以上の詳細は開発者が個別に調べることを想定しています。

Application オブジェクト

Excel Application オブジェクトは Excel アプリケーションそのものを表します。そのように言うと、簡単な印象を持つかもしれませんが、Application オブジェクトは実行アプリケーション、そのインスタンスに適用されるオプション、および作業中のインスタンス内で開かれているユーザー オブジェクトについての非常に膨大な情報を表します。Application オブジェクトには多くのメンバがあり、その大部分については調べる必要はありません。一方で、アプリケーションを正常に動作させるために重要なメンバもあります。それらのメンバは、以下のカテゴリに分類されます。

  • Excel の状態を制御し、表示させるメンバ
  • オブジェクトを返すメンバ
  • アクションを実行するメンバ
  • ファイル操作を処理するメンバ
  • その他のメンバ

以下のセクションでは、各メンバ グループを紹介し、いくつかのメンバのコード例を示します。

Excel の状態を制御し、表示させるメンバ

Application オブジェクトは Excel の状態を全体的に制御する大きなプロパティ セットを提供します。表 1 は、状態に関連する Application オブジェクトのプロパティのサブセットのリストです。

表 1. Excel の状態を制御するアプリケーションのプロパティの一部

プロパティタイプ説明
CursorXlMousePointer (xlDefault, xlIBeam, xlNorthwestArrow, xlWait)マウス ポインタの外観を取得または設定します。
EditDirectlyInCellBooleanセルの編集機能を現在の位置で直接取得または設定します。偽 (False) の場合、数式バーを使用したセルの編集のみが可能です。
FixedDecimalBoolean真 (True) の場合、すべての数値について FixedDecimalPlaces プロパティを使用して小数点以下の桁数を指定します。または、FixedDecimalPlaces プロパティを無視します (デフォルト値は、偽 (False) です)。
FixedDecimalPlacesLong FixedDecimal プロパティが真 (True) の場合、数値に使用する小数点以下の桁数を指定します。
InteractiveBooleanユーザーがキーボードとマウスを介して Excel と対話する機能を取得または設定します。このプロパティを偽 (False) に設定した場合、例外ハンドラでは必ず真 (True) に設定し直してください。Excel ではこの設定は自動的にリセットされません。
MoveAfterReturnBoolean真 (True) の場合、Enter キーを押すと次のセルが選択されます。デフォルト値は、真 (True) です。
MoveAfterReturnDirectionxlDirection (xlDown, xlToLeft, xlToRight, xlUp) MoveAfterReturn プロパティが真 (True) の場合、Enter キーを押した後に移動する方向を示します。デフォルト値は xlDown です。
ScreenUpdatingBoolean真 (True) の場合、各メソッド呼び出しの後に Excel は画面を更新します。処理時間を節約し、アプリケーションをよりプロフェッショナルな外観にしたい場合は、コード実行中に画面を非表示にすることもできます。コード実行が終了したら、このプロパティは必ず真 (True) にリセットしてください。Excel ではこの設定は自動的にリセットされません。
SheetsInNewWorkbookLongExcel が新規ワークブックに自動的に作成するシートの数を取得または設定します。
StandardFontStringExcel のデフォルトのフォントを取得または設定します。Excel が再起動されるまでは変更は適用されません。
StandardFontSizeLongExcel のデフォルトのフォント サイズを取得または設定します。Excel が再起動されるまでは変更は適用されません。
StartupPath (読み取り専用)StringExcel 起動時のアドインを含むフォルダの完全なパスを返します。
TemplatesPath (読み取り専用)Stringテンプレートを含むフォルダの完全なパスを返します。この値は Windows の特殊フォルダの 1 つを示します。

表 1 に示されたプロパティのうち、最も使用頻度が高いと思われるのは、ScreenUpdating プロパティです。このプロパティを利用して、Excel アプリケーションの外観をよりプロフェッショナルに見せるだけでなく、処理速度を速めることも可能です。編集のたびに画面を更新することで、コード実行による負担を大幅に軽減します。広い範囲をプログラムにより埋めていく場合などに特に便利です。ただし、コード実行が終了した後は必ずこのプロパティをリセットしてください。Excel では自動的にリセットされません。したがって、ScreenUpdating プロパティを使用する際は、常に以下のフラグメントと類似のコードを使用し、.NET 例外ハンドラにより画面更新を確実に再開させる必要があります。

Application オブジェクトはまた、Excel の表示を制御するプロパティのグループを提供します。このグループ内のプロパティを編集して、画面上で表示させる項目を変更できます。表 2 は、使用可能な表示オプションのサブセットのリストです。

表 2. Excel の外観を制御するアプリケーションのプロパティの一部

プロパティタイプ説明
DisplayAlertsBoolean真 (True) (デフォルト値) の場合、コード実行中、たとえばシートの削除を選択したときなど、必要があれば、Excel は警告メッセージを表示させます。警告メッセージを表示させないようにするには、偽 (False) に設定します。偽に設定した場合でも、Excel はデフォルト値を選択したかのように各警告を処理します。
DisplayFormulaBarBoolean真 (True) (デフォルト値) の場合、Excel はセルの編集のために標準の数式バーを表示させます。編集バーを非表示にするには、偽 (False) を選択します。
DisplayFullScreenBoolean真 (True) の場合、Excel はフルスクリーン モードで動作します (Excel ウィンドウを単に最大化する場合とは効果が異なります)。デフォルト値は偽 (False) です。

ヒント    ScreenUpdating プロパティと同様、処理が終了した後は DisplayAlerts プロパティは忘れずにリセットする必要があります。Excel では自動的にこのプロパティはリセットされないため、また偽 (False) に設定されていると、ワークブックを閉じる前に保存を促すメッセージが表示されません。DisplayAlerts プロパティをリセットせず、メッセージが表示されないことを忘れていると、データを失う恐れがあります。

オブジェクトを返すメンバ

Application オブジェクトのプロパティの多くはその他のオブジェクトを返します。標準の Microsoft Office プロジェクトのテンプレートは Visual StudioR .NET により提供され、ThisApplication オブジェクトと ThisWorkbook オブジェクトしか含まれていないため、Excel が提供する他のオブジェクトを参照するには、一般に、Application クラスのオブジェクト メンバを使用する必要があります。これらメンバは使用して、ActiveWindow プロパティで特定の子オブジェクトへの参照を検索するか、Charts プロパティで使用可能なオブジェクトを収集することができます。表 3 は、オブジェクトを返す Application オブジェクトのプロパティのサブセットのリストです。

表 3. オブジェクトを返す使用可能な Application オブジェクトのプロパティのサブセット

プロパティタイプ説明
ActiveCellRangeアクティブなウィンドウ内で現在アクティブなセルの参照を返します (最前面に表示されているウィンドウ)。アクティブなウィンドウがない場合は、このプロパティはエラーを発生させます。
ActiveChartChart現在アクティブなグラフの参照を返します。埋め込みグラフは、選択されている場合か、有効化されている場合に限り、アクティブとみなされます。
ActiveSheetObject現在アクティブなワークブック内のアクティブなシートの参照を返します。
ActiveWindowWindowアクティブなウィンドウの参照を返します (最前面に表示されているウィンドウ)。アクティブなウィンドウがない場合は、何も返しません。
ChartsSheets Sheet オブジェクトのコレクションを返します (Chart オブジェクトと Worksheet オブジェクトの親オブジェクトとして)。このコレクションには、アクティブなワークブック内の各グラフの参照が含まれます。
SelectionObjectアプリケーション内で選択されているオブジェクトを返します。返されるのは、Range オブジェクト、Worksheet オブジェクト、または他のオブジェクトになります。また、一般に Range オブジェクトが選択されている場合は、Window クラスにも適用されます。現在、選択されているオブジェクトがない場合は、何も返しません。
SheetsSheetsアクティブなワークブック内の各シートの参照を含む、Sheet オブジェクトのコレクションを返します。
WorkbooksWorkbooks開いているワークブックすべての参照を含む、Workbook オブジェクトのコレクションを返します。

対話をする頻度が最も高いのは、Application クラスの Workbooks プロパティです。このプロパティを使用すると、開いているワークブックを介して、新規ワークブックを開く、または作成するという処理を反復して行うことができます。以下のセクションでは、Workbooks プロパティの動作について説明します。

Workbooks コレクション

Workbooks コレクションを使用すると、開いているワークブックすべての操作、新規ワークブックの作成、および新規ワークブックへのデータのインポートができます。以下のリストで、Workbooks コレクションの主な用途をいくつか示します。

  • 新規ワークブックを作成する。以下のコードを使用します (Add メソッドのパラメータとしてワークブック テンプレートの名前を指定することも可能です)。
  • 開いているワークブックすべてを閉じる。他の多くのコレクションとは異なり、メンバすべてを一度に閉じることができます。以下のメソッドを呼び出して、開いているワークブックすべてを閉じます。
  • 既存のワークブックを開く。 Workbooks コレクションの Open メソッドを使用します。最も簡単な形式は、以下のフラグメントで見られるような Open メソッドを使用したものです。Open メソッドは特定の状況において動作に影響する、膨大な数の任意パラメータを提供しますが、一般に、これらの任意パラメータを使用する必要はありません。
    ヒント    C# 開発者は、メソッド呼び出しの際の Type.Missing 値の参照方法をマスターしておく必要があります。Excel オブジェクト モデルは VBA で記述されることを前提としているので、そのメソッドの多くは任意パラメータを受け入れます。最高で 30 の任意パラメータの受け入れが可能な場合もあります。さまざまな Type.Missing 値のインスタンスを使用したり、各パラメータに対する特定のデフォルト値を提供する必要があります。
  • テキスト ファイル、データベースまたは XML ファイルをワークブックとして開く。 OpenText メソッド、OpenDatabase メソッド、OpenXml メソッドなどを使用します。これらメソッドは非常に柔軟性があり、単純な適用範囲に対しても、例で示す割り当て以上のスペースを使用します。現時点では、そのようなメソッドが存在するということが分かっているだけで十分です。いずれかのメソッドをExcel にロードする必要が生じた際に、詳細を調べてください。テキスト ファイルをワークブックにロードするには、以下のコードを使用します。区切り文字にはカンマを使用し、テキスト ファイルの 3 番目の行から区切っていきます。
  • 各ワークブックを参照する。整数 (コレクション内の位置を示す数字) またはワークブックの名前を使用して、Workbooks コレクション内にインデックスを作成することができます。ワークブックを名前で指定する場合には、参照の仕方に注意してください。ファイル保存の際に付与される ".xls" 拡張子の付いていない、タイトル バーに表示されるとおりの名前を指定します。
    ヒント    特定のワークブックを参照する際は、デフォルトのインデクサである、Item プロパティを利用できます。Item プロパティに加え、Workbooks コレクションは Microsoft Office で提供されている他のコレクションと同様、アイテムの数を返す Count プロパティ (ここでは Workbooks) を含みます。

アクションを実行するメンバ

Application オブジェクトは、現在のデータの再計算から、データ変更のやり直しまで、アクションの実行を可能にする多くのメソッドを提供します。以下のリストでは、Application オブジェクトのメソッドの一部を挙げ、簡単な例で各メソッドを説明します。このセクションのサンプルとしては、サンプル ワークブックの Application Object シートに示されている部分を参照してください。

  • Calculate メソッドは、開いているワークブックすべて、特定のワークブックまたは特定の範囲の再計算を強制的に実行します。
    注    コード例で示されているとおり、Range オブジェクトと Worksheet オブジェクトもまた、Calculate メソッドを提供します。計算範囲を指定するオブジェクトのメソッドを使用して、再計算が必要な、最低限の数のセルを指定できます。Excel の再計算エンジンは非常に高速ですが、再計算するセルの数を指定することで、さらに動作を最適化できます。開いているすべてのワークブックの、保留中の変更すべてを再計算する場合にのみ、Application.Calculate を使用します。
    ヒント    Visual Basic .NET と C# では、Excel メンバの処理の方法が多少異なります。たとえば、Excel、VBA、Visual Basic .NET では、Range プロパティは get_Range メソッドを使用した C# でのみアクセス可能です。この文書では、その Excel メンバの処理方法の例、およびアクセス機構メンバの例が複数示されています。
  • CheckSpelling メソッドは、指定されたパラメータのスペルが正しいかどうかを示す Boolean 値を返します。オプションとして、カスタム ディレクトリの名前や大文字小文字の違いを無視するかどうかを示す Boolean 値を指定することもできます。以下のフラグメントは、指定された値のスペルをチェックし、結果をシート上に表示します。
    ヒント    前述のフラグメントでは、後述される Range オブジェクトの Offset メソッドが使用されています。いずれも、この文書の Range オブジェクトのセクションで説明されます。Range クラスの使用は、簡単に理解できます。Range オブジェクトは、1 つのセル、またはセルのグループを表しています。このフラグメントでは、Range オブジェクトは、セル参照、CheckSpelling を参照しています。Offset プロパティは関連付けられた範囲の左上から順に、指定された数の行および列に Range オブジェクトを返すので、既知の位置と相対したセルで操作を行うことができます。
  • Evaluate メソッドは、Excel の名前を実際の参照または値に変換します。このメソッドにより、文字列の参照を作成し、それを必要に応じて実際のオブジェクト参照に変換したり、式の値を評価することができます。以下の例では、セルのアドレスをサンプル シートに入力し、コードによりテキストを指定したアドレスのセルに配置します。
  • MailSystem、MailSession、MailLogoff、MailLogon、SendMail メソッドを使用して、インストールしている電子メール システムへのログオン、現在作業中のワークブックの添付ファイルとして送信、およびログオフを実行します。MailSystem プロパティはインストールしている電子メール システムを示し、MailSession プロパティは現在の電子メール セッションの参照を返します (すでにアクティブなセッションがある場合は、ログオンの必要はありません)。以下の例では、サンプル ワークブックを添付ファイルとして添付ファイルなしの電子メール メッセージに送ります。
    注    Workbook クラスは、SendMail メソッドを提供します。これは、電子メールで送ることのできる最も細かい単位のオブジェクトがワークブックであるためです。SendMail メソッドそのものは、送信メッセージにテキストを添付する手段とはならず、また、アドレス指定ができるほどの柔軟性もないことに注意してください。これらのメンバは、ワークブックを電子メールで簡単に送信するための手段として提供されています。電子メール送信について完全な機能を求める場合は、別の方法での電子メールとの対話について調べてください。さらに、現在オンラインではなく電子メール システムにのみ接続している場合は、前述のサンプル コードの実行は失敗します。MailSession プロパティが何も返さないときに電子メールの送付を行わなければ、この失敗を避けることができます。
  • Quit メソッドを使用して、Excel プログラムを終了させることができます。DisplayAlerts プロパティを偽 (False) に設定した場合、保存されていないデータの保存を促すメッセージは表示されません。さらに、ワークブックSaved プロパティを真 (True) に設定した場合、Excel は変更の有無にかかわらず、データの保存を促すメッセージを表示させません。
  • Undo メソッドは、ユーザーがユーザー インターフェイス内で行った最近のアクションをキャンセルします。このメソッドはコードにより実行したアクションそのものには影響せず、1 つのアクションを元に戻すだけです。それほど高機能なメソッドとは言えませんが、コード実行の前にユーザーが実行した最近のアクションを元に戻すことができます。

ファイル操作を処理するメンバ

Application オブジェクトは Excel アプリケーションのコンテキスト内のファイル システムとの対話を可能にするいくつかのメンバを提供します。以下のセクションでは、使用する頻度の高いいくつかのメンバについて説明します (このセクションで説明されるサンプルは、サンプル ワークブックの Application File Handling シート上にあります)。

DefaultFilePath プロパティ

この単純なプロパティは、Excel でファイルをロードし保存するのに使用するパスを取得または設定します。

DefaultSaveFormat プロパティ

このプロパティは、ワークブックを保存するときのデフォルトのファイル形式を取得または設定します。Excel では、このプロパティの選択肢が数多くあり、そのすべての選択肢が XlFileFormat 列挙体のメンバです。サンプル ワークブックでは、図 1 で示されている使用可能なアイテムから選択することができます。以下のコードのフラグメントは、サンプル ワークブックでプロパティの値をロードし、保存する方法を示しています。

例では、サンプル シート内の列 E にXlFileFormat 列挙体に使用可能な値のすべての名前のリストが含まれており (範囲名は "XlFileFormat")、列 F に対応する整数の値が含まれています。図 2 はこれら 2 つの列のサブセットを示しています。DefaultSaveFormat という名前の付けられた範囲 (図 1 内) には、XlFileFormat 範囲の参照が含まれており、リストから値を選択できます。値を選択して保存すると、コードは Range.Find メソッドを使用して選択された文字列を検索します。次に、Range.Offset メソッドを使用して、検索した値の中から、指定されたオフセットでの値を返します (Range.Find メソッドについて詳しくは、このドキュメント内の「範囲内での検索」セクションを参照してください)。最後に、コードはその整数の値 (適切な列挙型に変換した値) を DefaultSaveFormat プロパティに格納します。

DefaultSaveFormat の現在の値を検索するのは簡単です。以下のコードが値をテキストに変換し、サンプル シート上の正しい範囲に表示させます。

選択した値の再割り当ては、これより少し難しくなり、3 つの手順で行います。コードでは以下のタスクを処理する必要があります。

選択した保存形式の名前をシートの DefaultSaveFormat 範囲から検索します。

Range クラスの Find メソッドを呼び出して、シート内の XlFileFormat 範囲に隣接する列から一致する整数の値を検索します。次に、コードは Range.Offset プロパティを使用して値を検索します。検索は、カラム単位で右方向へと行われます。

DefaultSaveFormat プロパティに整数の値を再割り当てします。


Aa168292.excelobj001(ja-jp,office.11).gif
図 1. 使用可能な形式のリストからファイル形式を選択


Aa168292.excelobj002(ja-jp,office.11).gif
図 2. サンプル ワークシート上の XlFileFormat 範囲のサブセット


RecentFiles プロパティ

RecentFiles プロパティは [ファイル] メニュー内の最近使ったファイルのリストで表示されるすべてのファイルの名前を含む文字列のコレクションを返します。このリストの長さは、ユーザーが保存を選択したファイルの数によって異なります。サンプル ワークブックは開かれると同時にこのプロシージャを呼び出し、最近使ったファイルのリストをサンプル ワークシート上の RecentFiles という名前の範囲にコピーします。

FileDialog プロパティ

FileDialog プロパティは 4 タイプのファイル形式の操作を行う FileDialog オブジェクトを返します。以下の操作を可能にするプロパティがこの FileDialog オブジェクトを返します。

  • ファイルを選択し、開く。
  • 保存場所を選択し、現在作業中のワークブックを保存する。
  • フォルダを選択する。
  • ファイル名を選択する。

このダイアログ ボックスで、Microsoft Office が提供するすべてのファイル操作機能を利用することができます。FileDialog プロパティは msoFileDialogType 列挙体の値である、msoFileDialogFilePickermsoFileDialogFolderPickermsoFileDialogOpen、または msoFileDialogSaveAs のうちの 1 つを渡して、ダイアログ ボックスの特定の用途を選択するようユーザーに要求します。ユーザーはプロパティにより返された FileDialog オブジェクトと対話できます。

FileDialog オブジェクトは、他の多くのオブジェクトと同じく、Microsoft.Office.Core 名前空間によって提供されます。各 Office オブジェクトの完全パスを入力せずに済むように、サンプル プロジェクトではこの名前空間を Imports ステートメントまたは using ステートメントを使用してインポートします。この文書内のコードのフラグメントでは、ユーザーがファイル参照のための適切な名前空間を指定済みであることを前提としています。

FileDialog オブジェクトの Show メソッドはダイアログ ボックスを表示させ、[OK] をクリックすると -1、[キャンセル] をクリックすると 0 を返します。msoFileDialogOpen 列挙体または msoFileDialogSaveAs 列挙体の値を使用した場合、このクラスの Execute メソッドを使用してファイルを開いたり保存することができます。SelectedItems プロパティは文字列のコレクションを含み、それぞれの文字列が選択されたファイル名を表しています。

たとえば、サンプル ワークブックの以下のコードは、新規ワークブックを開くことを促すメッセージを表示させます。このフラグメントは、複数ファイルの選択、使用可能なフィルタのリストのクリア、2 つの新規フィルタの追加、および図 3 で示されているようなダイアログ ボックスの表示を可能にします。1 つまたは複数のファイルが選択されると、コードは FileDialog オブジェクトの Execute メソッドを呼び出し、要求されたファイルを開きます。


Aa168292.excelobj003(ja-jp,office.11).gif
図 3. FileDialog クラスを使用した標準の [ファイルを開く] ダイアログ ボックスの表示


以下のサンプルのフラグメントでは、ダイアログ ボックスを使用してフォルダを選択する方法を示します。

注    Application オブジェクトは GetOpenFileName メソッドと GetSaveAsFileName メソッドを呼び出してファイル名を選択し、ファイルを開けるようにします。これらメソッドを使用することも可能ですが、Microsoft .NET Framework で提供される、同様の機能を持つ OpenFileDialog コントロールと SaveFileDialog コントロールのほうがより機能性に優れ、簡単に使用することができます。

その他の有用なメンバ

Application オブジェクトは WorksheetFunction プロパティ、Names コレクション、Windows コレクションなど、他のカテゴリに分類されないいくつかのメンバを提供します。以下のセクションでは、これらのメンバについて説明します。

WorksheetFunction クラス

Application オブジェクトには、WorksheetFunction クラスのインスタンスを返す WorksheetFunction プロパティも含まれています。このクラスは、 Excel ワークシートの関数をラップする数多くの共有メソッドおよび静的メソッドを提供します。各メソッドは多くある Excel スプレッドシート計算の関数ひとつひとつを提示します。同じ関数は VBA でも提供されます。いくつかのメンバは、 Visual Basic .NET や C# の演算子およびメソッドと重複しているので、ほとんど使用されません (例 : And メソッド)。

WorksheetFunction クラスのメソッドには、あまり知られていないものの、魅力的で有用な関数が数多くあります。以下はそれらの関数のリストです。

  • AcosAcoshAsinAsinhCoshDegreesLnLogMedianMaxMinModeRadians などの数学関数
  • DAverageDCountDCountADGetDMaxDMinDProductDSum などの特定の範囲内での計算を実行する、Domain 関数
  • IsErrIsErrorIsLogicalIsNAIsNonTextIsNumberIsText などの理論関数
  • BetaDistBinomDistChiTestChiInvLogNormDistNegBinomDistPearsonSumProductSumSqTDistTTestVarVarP などの統計関数
  • AndOrChoose などの .NET Framework ではほとんど提供されない、スプレッドシート関数
  • タイ語版関数。 BahtTextIsThaiDigitThaiDayOfWeekThaiDigitThaiMonthOfYearThaiNumSoundThaiNumStringThaiStringLengthThaiYearRoundBahtDownRoundBahtUp など、ユーザーは、意味の分からないタイ語の数字、カレンダー、通貨を操作する多くの関数があることに気付くでしょう (噂では、Excel チームのメンバーがタイの食べ物が大好物であったため、タイ現地のレストランで勘定を計算しやすいようにこれらの関数を加えたとされていますが、実際はデマにすぎません)。

Visual Studio .NET プロジェクトにより、WorksheetFunction クラスを簡単に利用できるようになりました。プロジェクトのテンプレートでは、ThisApplication オブジェクトが提供されているため、このオブジェクトの WorksheetFunction プロパティを簡単に参照できます。サンプル アプリケーションには、図 4 で示されるような、いくつかのクラスのメンバをテストする Other Application Members という名前のシートが含まれています。

注    WorksheetFunction クラスとそのメンバは、なぜ Visual Basic で Excel オブジェクトを実行するのが C# で同等のコードを実行するより簡単なのかを示す好例を提供します。WorksheetFuncsion クラスのメソッドの多くは C# 開発者に 30 のパラメータ (そのほとんどが空です) を渡すことを要求します。異なるグループに属するメソッドのラッパーを記述 (要求されるパラメータが 1 つ、2 つ、3 つ......という具合に) すれば、この負担を軽減できることは明らかです。ただし、この文書では、コードが “naked” メソッドを呼び出すように記述されており、ラッパーは使用していません。たしかに、C# コードは見た目にもきれいなものではありません。

[Demonstrate WorksheetFunction] リンクをクリックすると、以下のコードが実行されます (Sort メソッドについて詳しくは、「範囲内でのデータの並べ替え」セクションを参照してください)。


Aa168292.excelobj004(ja-jp,office.11).gif
図 4. WorksheetFunction クラスとその有用なメソッドをテストするための WorksheetFunction シートの選択


サンプル コードからも分かるように、WorksheetFunction メソッドのパラメータとして Range オブジェクトを渡すことができます。さらに、1 つの値またはパラメータとしての値のリストも渡せます。このメソッドは一般的に、32 個までのパラメータを受け入れることができるため、決められた一連の数値の平均を計算するには、以下のようなコードを使用できます。

Window クラスと Windows コレクション

Excel アプリケーションの画面表示を制御するのは Application オブジェクトです。Application オブジェクトの Windows プロパティを使用して Excel オブジェクト ウィンドウを開き、閉じ、整列させることができます。

Windows プロパティは Window オブジェクトのコレクションを返し、ユーザーは Arrange メソッドを呼び出して、現在開いているすべてのウィンドウ (または現在表示されているウィンドウ) を整列させることができます。XlArrangeStyle 列挙体の値の 1 つを指定して、ウィンドウをどのように整列させるかを示します。オプションとして、現在表示されているウィンドウのみの整列、ウィンドウのスクロールの同期を指定します。たとえば、ウィンドウを Excel ワークスぺース内で分割表示させるには、以下のようなコードを使用します。

プログラム実行によって新規ウィンドウを作成するには、次のようにワークブックの NewWindow メソッドを呼び出します。

NewWindow メソッドは Window オブジェクトを返すため、新規ウィンドウのキャプションを設定して表示させる以下のようなコードを記述することもできます。

Windows クラスは、色、キャプション、ウィンドウ機能の可視性、スクロール動作など、関連するウィンドウの外観と動作を制御するプロパティとメソッドを提供します。たとえば、特定のウィンドウのプロパティを操作するには、以下のようなコードを記述します。

ヒント    VBA と.NET は、1 つの色の構成要素に赤、緑、青を含んだ 3 ビットバイトを使用してそれを 32 ビット整数の下位 3 バイトにエンコードするなど、色について類似のパラダイムを用いていますが、色の処理方法はそれぞれ異なります。.NET の色を VBA で要求される OLE の色へ変換するには、System.Drawing.ColorTranslator.ToOle メソッドを使用します。

Other Application Members シート上の [Work with Windows] をクリックして、サンプル プロシージャ、TestWindows を実行します。このプロシージャは、このセクションで説明されているすべてのコードを、小さなサイズのチャンクで提供します。同じシート内で [Reset Windows] をクリックすると、以下のプロシージャが実行され、最初に開いていたウィンドウ以外のすべてのウィンドウが閉じ、最初に開いていたウィンドウが最大化されます。

Name クラスと Names コレクション

Application オブジェクトは、自らの Name オブジェクトのコレクションを返す Names プロパティを提供します。各 Name オブジェクトは、Excel アプリケーション内の範囲名に対応しています。セル参照を検索する方法は数多くあります。たとえば、ワークブックNames プロパティまたは Worksheet オブジェクトを使用する方法があります。

新規のセル参照を作成するには、以下のフラグメントで示すように、Names コレクションの Add メソッドを使用します。Add メソッドは 2 つの必須パラメータに加え、数多くの任意パラメータを受け入れます。

名前と場所を指定して (その他任意パラメータと共に)、コード内で範囲を参照します。

セル参照の情報の検索には、Name クラスの多くのプロパティが使用できます。以下のリストでは、一般的に最も使用頻度の高いメンバのいくつかを説明します。

  • Name はセル参照に割り当てられている名前を返します。
  • RefersTo は実際の検索対象アドレスを含む文字列を標準形式 ("=SheetName!$B$25") で返します。
  • RefersToR1C1 は検索対象アドレスを "R1C1" 形式 ("=SheetName!R25C2") で返します。
  • Value は範囲内のセルの内容を解釈するセル参照を返します。

サンプル ワークブックの [Work with Names] リンクをクリックすると、以下のコードが実行され、シート上の領域にすべてのセル参照についての情報が埋め込まれます。

アプリケーションのイベント

Application クラスで提供されるすべてのメソッドに加え、その他にも多くのイベントが使用可能です。すべてのイベントを系統立てて説明することはできませんが、名前からそれぞれの用途が比較的容易にわかるようになっています。以下のセクションでは、アプリケーションで使用する頻度が高いと思われるイベントのサブセットについて説明します。

ヒント    Office アプリケーション内でイベント ハンドラに渡されるパラメータは、ネイティブの .NET イベントで使用されるパラメータとは、使用感が異なることがあります。通常、.NET のイベント ハンドラは常に、イベントを発生させるオブジェクトを参照することによってObject変数を受け取り、次にイベントの詳細情報を含む EventArgs ベース クラスから引き継いだ 2 番目のパラメータを受け取ります。Office アプリケーションは明確に定義されたイベントのデザイン パターンを持たないため、各イベント ハンドラは最初の開発者により定義されたパラメータの任意の数値を受け入れます。

シートでの動作

Application オブジェクトは、シートに関連付けられたイベントの範囲 (グラフとワークシートの両方) を提供します。以下のリストでは、多くのイベントについての情報を示します。

  • SheetActivate はシートがアクティブになったときに発生します。Excel はイベント ハンドラにアクティブになったシートの参照を含むObject変数を渡します。
    ヒント    シートを参照するオブジェクトを持つ Excel ソリューションでは、参照を使用する前に、変数の参照を正しい形式 (状況によって、ワークシートかグラフのいずれか) に変換する必要があります。ただし、Visual Basic .NET の Option Strict 設定を無効にしている場合は、後から形式を割り当てることもできます。IntelliSense は入力するだけでは使用できず、コードの記述も難しくなります。この文書の例ではすべて、Sheets コレクション内のアイテムを使用しており、結果はワークシートまたはグラフ、いずれかの必要に応じたシートのタイプに変換されます。
  • SheetBeforeDoubleClick は、シートがダブルクリックされたとき、Excel がダブルクリックのデフォルトの処理を行う前に発生します。Excel はイベント ハンドラに、シートの参照を含むObject変数、ダブルクリックされた場所から一番近いセルを含む Range オブジェクト、およびデフォルトのイベント処理をキャンセルする Boolean 値 (デフォルトでは偽 (False)) を渡します (このイベントはグラフ シートでは発生しません)。
    ヒント    “Before” を含む名前を持つイベントはすべて、デフォルトのイベント処理をキャンセルする役目があります。イベント ハンドラに渡されるパラメータは通常、”Cancel” という名前でデフォルト値は偽 (False) です。このパラメータを真 (False) に設定すると、Excel はデフォルトのイベント処理を実行しません。
  • SheetBeforeRightClick は、シートが右クリックされたとき、Excel が右クリックのデフォルトの処理を行う前に発生します。Excel はイベント ハンドラに、シートの参照を含むObject変数、右クリックされた場所から一番近いセルを含む Range オブジェクト、およびデフォルトのイベント処理をキャンセルする Boolean 値 (デフォルトでは偽 (False)) を渡します (このイベントはグラフ シートでは発生しません)。
  • SheetCalculate はシートが再計算されたときに発生します。Excel はイベント ハンドラに再計算されたシートの参照を含むObject変数を渡します。
  • SheetChange はワークシート内のセルがユーザーによる操作またはコードの実行によって変更されたときに発生します。Excel はイベント ハンドラにシートの参照を含むObject変数と、変更された範囲の参照を含む Range 変数を渡します。
  • SheetDeactivate はシートが非アクティブになったときに (つまり、操作対象外となったとき) 発生します。このイベント ハンドラは操作Excel はイベント ハンドラに非アクティブになったシートの参照を含むObject変数を渡します。Excel はイベント ハンドラに非アクティブになったシートの参照を含むObject変数を渡します。
  • SheetFollowHyperlink はワークブック内のハイパーリンクをクリックしたときに発生します。Excel はイベント ハンドラに、ハイパーリンクを含むシートを参照するObject変数と、クリックしたハイパーリンクの参照を含む Hyperlink オブジェクトを渡します (サンプル プロジェクトでは、サンプル内での移動にこのイベントが使用されています)。
  • SheetSelectionChange はワークシート上で選択が変更されたときに発生します (このイベントはグラフ シートでは発生しません)。Excel はイベント ハンドラに、選択が変更されたシートを参照するObject変数と、新しい選択を参照する Range 変数を渡します (Excel は変更前の選択に関する情報は渡さないことに注意してください)。
    注    このセクションで説明されている各イベントは Workbook クラスが提供するイベントでも使用可能です。Application オブジェクトがイベントを提供すると、Excel で現在開かれているシートでそのイベントが実行されます。Workbook オブジェクトがイベントを提供すると、特定のワークブック内のシートに影響を及ぼす場合にのみ、そのイベントが実行されます。さらに、Worksheet クラスも同じイベントを提供します。この場合、イベント名に “Sheet” は含まれず (例 : SheetFollowHyperlink の代わりに FollowHyperlink など)、イベント ハンドラにシートの参照は渡されません。これはイベントを受け取ったオブジェクトを見れば分かります。Workbook クラス以外が提供するイベントとその用途、パラメータはこの文書で示されるイベントと同一です。

ウィンドウでの動作

Application オブジェクト (および対応する Workbook オブジェクト) は、Workbook オブジェクトの動作を処理するイベントの範囲を提供します。以下のリストではそれらのイベントについて説明します。

  • WindowActivate はウィンドウがアクティブになったときに発生します。Excel はイベント ハンドラに、ウィンドウを表示させるワークブックを参照する Workbook オブジェクトと、選択されたウィンドウを参照する Window オブジェクトを渡します。その他のアクティブ化のイベントと同様、このイベントも Excel 内で操作対象が移動した場合にのみ発生します。他のアプリケーションを操作してまた Excel の操作を再開する場合には、このイベントは発生しません。
  • WindowDeactivate はウィンドウが非アクティブになったときに発生します。詳しくは、WindowActivate イベントの説明を参照してください。
  • WindowResize はワークブックのウィンドウ サイズを変更したときに発生します。Excel はイベント ハンドラに、ウィンドウを表示させるワークブックを参照する Workbook オブジェクトと、サイズが変更されたウィンドウを参照する Window オブジェクトを渡します。
    注    Workbook クラスが提供するイベントでは、イベント ハンドラにワークブックの参照は渡されません。これは、イベントを発生させるオブジェクトを見れば分かります。

ワークブックの管理

Application オブジェクトは、ユーザーが Workbook オブジェクトと対話をしたときに、発生するイベントの範囲を提供します。これらイベントの各プロシージャはイベントに関連した特定のワークブックを示す Workbook 変数を受け取ります。以下のリストでは使用可能なイベントのサブセットについて説明します。

  • NewWorkbook は新規ワークブックが作成されたときに発生します。Excel はイベント ハンドラに新規ワークブックを参照する Workbook 変数を渡します (このイベントは Application クラスでのみ発生します)。
  • WorkbookActivate はワークブックがアクティブになったときに発生します。Excel はイベント ハンドラにアクティブになったワークブックを参照する Workbook 変数を渡します (その他のアクティブ化のイベントと同様、このイベントも Excel 内で操作対象が別のワークブックに移動した場合にのみ発生します)。
  • WorkbookBeforeClose は開いているワークブックを閉じるよう選択したとき、デフォルトのイベント処理が行われる直前に発生します。Excel はイベント ハンドラに、閉じるワークブックを参照する Workbook 変数と、デフォルトのイベント処理をキャンセルする (つまり、ワークブックを開いたままにする) Boolean 値 (デフォルトでは偽 (False)) を渡します。
    警告    条件を考慮せずに Cancel パラメータを真 (True) に設定してしまうと、他のワークブックも閉じなくなります。
  • WorkbookBeforePrint はワークブック印刷の開始を選択したときに、デフォルトのイベント処理が行われる直前に発生します。Excel はイベント ハンドラに、印刷する内容を含むワークブックを参照する Workbook 変数と、デフォルトのイベント処理をキャンセルする (つまり、要求された印刷をスキップする) Boolean 値 (デフォルトでは偽 (False)) を渡します。
  • WorkbookBeforeSave はワークブックを保存するよう選択したとき、デフォルトのイベント処理が行われる直前に発生します。Excel はイベント ハンドラに、保存するワークブックを参照する Workbook 変数と、デフォルトのイベント処理をキャンセルする (つまり、要求された保存をキャンセルする) Boolean 値 (デフォルトでは偽 (False)) を渡します。
  • WorkbookDeactivate はワークブックが非アクティブになったときに発生します。Excel はイベント ハンドラに非アクティブになったワークブックを参照する Workbook 変数を渡します (その他のアクティブ化のイベントと同様、このイベントも Excel 内で操作対象が別のワークブックに移動した場合にのみ発生します)。
  • WorkbookNewSheet は新規シートがワークブックに追加されたときに発生します。Excel はイベント ハンドラにワークブックを参照する Workbook 変数と新規シートを参照するObject変数を渡します。
  • WorkbookOpen はワークブックが開かれたときに発生します。Excel はイベント ハンドラに新しく開かれたワークブックを参照する Workbook 変数を渡します。
    注    Workbook クラスも、ここで説明されているイベントと類似したイベントを提供します。特に指定しない限り、"Workbook" で始まる名前を持つすべてのイベントが、Workbook クラスのイベント リストに表示されます ("WorkbookActivate" の代わりに "Activate" など)。Workbook クラスのイベント ハンドラには Workbook 変数はパラメータとして渡されません。これは、イベントを発生させるオブジェクトを見れば分かります。また、Workbook クラスは他の Application オブジェクト イベントのミラーを提供しますが、本来すべてのワークブックをトラップすべきところを、1 つのワークブックしかトラップしません。使用頻度の高いイベントは紹介しましたので、この文書でのイベントについての説明はここまでとします。

Workbook クラス

Workbook クラスは Excel アプリケーション内の 1 つのワークブックを表しています。このセクションでは、最も使用頻度の高いプロパティおよびメソッドと共に、Workbook クラスのいくつかのメンバについて説明します。

ヒント    Application クラスのメンバの多くは、Workbook クラスのメンバとしても現れます。この場合、プロパティはアクティブなワークブックではなく、特定のワークブックに適用されます。Workbook クラスのメンバとしてすでに多くのメンバが紹介されているため、このセクションでは前のセクションほど多くのメンバを紹介しません。

Workbook クラスのプロパティ

Workbook クラスは膨大な数のプロパティ (約 90 種類) を提供します。その多くは特殊なケースを処理するためのもので、一般の開発者が知る必要はありません。たとえば、AutoUpdateFrequency プロパティは、共有ブックの自動更新の間隔を分単位で返し、Date1904 プロパティは、ワークブックが 1904 データ システム (Macintosh コンピュータで一般的に使用されている、1904 年 1 月 2 日 を値 1 としたデータのシリアル化のためのシステム) を使用している場合に真 (True) を返し、PasswordEncryptionAlgorithm プロパティはパスワード暗号化のための正確なアルゴリズムを設定するためのものです。

このセクションでは、Workbook オブジェクトの数多くのプロパティを全体的に説明する代わりに、使用頻度の高い一部のオブジェクトを紹介します。一般的な経験則として、ワークブックにある機能が必要となったときは、すでに他のユーザーがその機能を要求しており、その機能を可能にするプロパティや提供するメソッドも存在しているはずです。ワークブックに独自のコードを付け加える前に、まずマニュアルなどの文書を注意してよく読んでみてください。

以下のリストでは、一般的に最も使用頻度の高い Workbook プロパティのいくつかを説明します。

  • NameFullNamePath (読み取り専用文字列) : これらのプロパティはワークブックの名前をそれぞれ異なる形式で返します。FullName はワークブックのファイル名を含む完全パスを返します。Name は名前の部分のみを返し、Path はパスの部分のみを返します。サンプル ワークブックの [Name Information] リンクをクリックすると、以下のコードが実行され、図 5 で示されているような情報を返します。:


    Aa168292.excelobj005(ja-jp,office.11).gif
    図 5. Workbook プロパティを使用した名前情報の検索


  • Password (文字列) : ワークブックに関連付けられたパスワードを取得または設定します。パスワードを指定した場合、ワークブックの HasPassword プロパティは真 (True) を返します。Password プロパティを検索することもできますが、値は常に "********" となります。サンプル ワークブックの [Set Password] リンクをクリックして以下のコードを実行し、パスワードとしてテキストと空白文字列のどちらが指定されているか、状況に応じてワークブックのパスワードを設定または解除してください。この例ではサンプル プロジェクトの Password という名前の形式を使用して、テキスト ボックスと Password プロパティが提供されます。
  • PrecisionAsDisplayed (Boolean) : 真 (True) の場合、Excel は表示されている小数点以下の桁数を使用して計算を実行します。偽 (False) (デフォルト値) の場合、表示されていない桁も含めた使用可能なすべての少数以下の数値を使用して計算が行われます。図 6 はこのプロパティが真 (True) に設定されたサンプル ワークブックを示しています。列 C 内の各値は、列 B の値のコピーですが、小数点以下の値の表示は 2 桁までとなっています。PrecisionAsDisplayed プロパティを真 (True) に設定すると、実際の計算値が四捨五入されるため、合計が異なる点に注意してください。[PrecisionAsDisplayed = False] リンクをクリックすると、合計は同じになります。以下のプロシージャをクリックして呼び出し、真 (True) または偽 (False) を渡してください (クリックしたリンクに応じた値を渡します)。


    Aa168292.excelobj006(ja-jp,office.11).gif
    図 6. PrecisionAsDisplayed プロパティを真 (True) に設定した場合に、Excel が表示されている桁数のみを使用して計算を行う例


  • ReadOnly (読み取り専用 Boolean) : ワークブックが読み取り専用で開かれている場合に真 (True) を返します。ワークブックにデータを保存できないため、アプリケーションではこれ以外のアクションを選択する場合も考えられます。
  • Saved (Boolean) : ワークブックの保存状態を取得または設定します。ユーザーがワークブックの内容や構造を変更した場合、Saved プロパティは真 (True) になります。ワークブックを閉じるまたは、Excel を終了しようとした場合、警告メッセージが表示され、ワークブックを保存するよう促されます (このメッセージを表示させないようにするには、Application.DisplayAlerts プロパティを偽 (False) に設定します)。コード内で Saved プロパティを偽 (False) に設定すると、Excel は保存がすでに行われているときと同じようにワークブックを扱い、保存を促すメッセージを再度表示させません。

Document プロパティの操作

その他の Office アプリケーションと同様、Excel でも文書のプロパティをワークブックと共に格納することができます。Excel では数多くのビルトイン プロパティが提供され、ユーザーが独自のプロパティを追加することもできます。[ファイル] メニューの [プロパティ] をクリックすると、図 7 で示されるようなダイアログ ボックスが表示され、さらに [ユーザー設定] タブをクリックするとユーザー設定のプロパティを作成、変更することができます。

Aa168292.excelobj007(ja-jp,office.11).gif
図 7. ダイアログ ボックスを使用した文書のプロパティの設定


Workbook クラスの BuiltInDocumentProperties プロパティを使用してビルトイン プロパティを操作し、CustomDocumentProperties プロパティでユーザー設定のプロパティを操作することができます。これらのプロパティはそれぞれ、DocumetnProperty オブジェクトのコレクションである DocumentProperties オブジェクトを返します。特定のプロパティを名前またはコレクション内のインデックスで検索するには、Item プロパティのコレクションを利用できます。Excel 文書内ではプロパティ名の完全なリストを使用できますが、それよりも簡単なリスト検索方法があります。サンプル ワークブックの [Document Properties] リンクをクリックすると、以下のプロシージャが実行されます (図 8 を参照)。このプロシージャは DumpPropertyCollection メソッドを呼び出し、すべてのビルトイン プロパティとその現在の設定値をリストします。ユーザー設定についてもこの処理が繰り返されます。さらに、プロシージャは Revision Number プロパティを個別に変更し、新規のユーザー設定を作成します。

ヒント    前述のコード サンプル、DisplayDocumentProperties では、列挙体と Microsoft.Office.Core アセンブリで提供される型が数種類使用されています。また、”Excel” の省略形と同様に ”Office” というテキストをこの名前空間の省略形として設定する Imports ステートメントまたは using ステートメントを含みます。プロジェクト テンプレートは自動的に “Excel” の省略形を自動的に設定します。開発者は各自 “Office” ステートメントを追加する必要があります。

Aa168292.excelobj008(ja-jp,office.11).gif
図 8. ビルトインの文書プロパティ


注    この文書では Excel とそのオブジェクト、使用可能なビルトインの文書プロパティのリストを供給する Office について説明していますが、必ずしも Excel ですべてのプロパティを実行する必要はありません。未定義プロパティの Value プロパティにアクセスしようとすると、例外エラーが発生します。サンプル プロシージャには、このような状況に対応するための簡単な例外エラーのハンドラが含まれています。

スタイルの操作

Word 文書と同様、Excel ワークブックでも名前付きのスタイルをワークブック内の領域に適用させることができます。これにより、Excel は数多くの定義済みのスタイル (それほど有用とはいえませんが) を提供します。[書式] メニューの [スタイル] をクリックしてダイアログ ボックスを表示させ、図 9 で示されるように対話を通じてスタイルを変更することできます。

Aa168292.excelobj009(ja-jp,office.11).gif
図 9. ダイアログ ボックスで対話を通じてスタイルを変更


[スタイル] ダイアログ ボックスの [変更] をクリックして、図 10 で示されるような [セルの書式設定] ダイアログ ボックスを表示させます。

Aa168292.excelobj010(ja-jp,office.11).gif
図 10. [セルの書式設定] ダイアログ ボックスを使用したスタイルの変更


[セルの書式設定] ダイアログ ボックスでは、セルの書式設定に使用できるすべての選択肢が表示され、それぞれの選択肢はコード内でも使用可能です。Workbook オブジェクトの Styles プロパティを使用し、対話を通してワークブック内の領域にスタイルを適用することができます。

また、Workbook オブジェクトの Styles プロパティを使用して、スタイルの作成、削除、変更もできます。サンプル ワークブックで [Apply Style] をクリックして以下のプロシージャを実行すると、新規スタイルを作成し、さまざまなスタイルを設定して領域に適用できます。

GetDocPropRange メソッドは文書のプロパティの埋め込まれた範囲を返します。このプロシージャでは Range.End メソッドを使用して文書のプロパティの埋め込まれた範囲の末尾を検索し、範囲の左上と右下の値を基に新しい範囲を作成します。

ヒント    Range オブジェクトの検索と操作について詳しくは、後の「範囲の操作」セクションを参照してください。

コードを実行すると、サンプル ワークブック上で文書のプロパティを含む領域の網かけとフォントが図 11 で示されるように変更されます。

Aa168292.excelobj011(ja-jp,office.11).gif
図 11. ユーザー設定のスタイルが適用されたワークブック


[Clear Style] をクリックすると、以下のプロシージャが実行され、同じ領域内のスタイルをクリアします:

シートの操作

Workbook クラスは Sheets オブジェクトを返す Sheets プロパティを提供します。この Sheets オブジェクトは それぞれが Worksheet オブジェクトや Chart オブジェクトとなる Sheet オブジェクトのコレクションを含みます。サンプル ワークブック内で [List Sheets] をクリックすると、以下のプロシージャが実行され、ワークブック内のすべてのシートがリストされます。

また、Sheets クラスの以下のメンバも有用です。

  • Visible プロパティを使用すると、シートを削除したり再度作成することなく、既存のシートを表示または再表示することができます。Visibility プロパティを XlSheetVisibility 列挙体の値 (XlSheetHiddenXlSheetVeryHiddenxlSheetVisible) の 1 つに設定します。XlSheetHidden を使用すると、Excel インターフェイスを介してシートを再表示させることができ、XlSheetVeryHidden を使用すると、シートを再表示させるためにコードの実行が要求されます。
  • Add メソッドを使用すると、新規シートをワークブック内のシートのコレクションに追加できます。4 つの任意パラメータを受け入れ、シートの位置、追加するシートの数、シートのタイプ (ワークシート、グラフなど) を表示させます。
  • Copy メソッドはシートのコピーを作成し、指定した位置にそのシートを挿入します。シート挿入は、新規作成時と、作成後、いずれのタイミングでも必要に応じて指定できます。特に指定しない場合は、Excel は新規シートを含んだ新規ワークブックを作成します。以下のフラグメントでは、現在作業中のワークブック内の 1 番目のシートをコピーし、3 番目のシートの後ろに挿入します。
  • Delete メソッドは指定したシートを削除します。
  • FillAcrossSheets メソッドは 1 つの範囲内またはシート内からデータをコピーし、同じワークブック内の他のシートすべてにそのデータを貼り付けます。範囲、データのコピー、フォーマット、または Excel で残りのすべての操作を行うよう指定します。以下のフラグメントでは、あるシート内の Data という名前の範囲からデータをコピーしてフォーマットし、そのデータをワークブック内のすべてのシートの同じ領域に貼り付けます。
  • Move メソッドは Copy メソッドと似たような働きをしますが、シートのインスタンスが 1 つだけになります。シート挿入は、新規作成時と、作成後、いずれのタイミングでも指定できます (ただし、両方を指定することはできません)。シートの移動先を特に指定しない場合は、Excel は新規シートを含んだ新規ワークブックを作成します。以下のフラグメントでは、1 番目のワークシートがワークブックの末尾に移動します。
    ヒント    やや非効率ですが、ワークブック内のシートのリストを並べ替えるために Move メソッドを使用してバブル ソートを実行することもできます。もちろん、シートの数がそれほど多くなければ、ソートのスピードは気になるほど遅くはありません。
  • PrintOut メソッドを使用すると、選択したオブジェクトを印刷することができます (このメソッドはいくつかの別のオブジェクトにも適用されます)。印刷するページ (印刷開始ページから終了ページまでを指定)、部数、印刷前のプレビュー、使用するプリンタの名前、ファイルの印刷か、部数単位印刷、プリントするファイルの名前など、数多くの任意パラメータを指定することができます。以下の例では、指定したファイルの最初のページのみを 2 部、印刷前にプレビューした後にデフォルトのプリンタで印刷します。
  • PrintPreview メソッドを使用すると、指定したオブジェクトを [印刷プレビュー] ウィンドウに表示させることができます。また、オプションとしてページ レイアウトの変更を禁止できます。
  • Select メソッドは指定したオブジェクトを選択し、操作対象をユーザー任意で移動することができます (ユーザーの選択を変更せずに操作対象のオブジェクトを変更するには、代わりに Activate メソッドを使用します)。オプションとして、現在選択されているオブジェクトと入れ替わるオブジェクトの参照を提供することもできます。以下のフラグメントでは、1 番目のワークシートを選択します。
    ヒント    このセクションで説明されているメソッドの多くは他のクラスにも適用されます。たとえば、PrintOut メソッドは ChartChartsRangeSheetsWindowWorkbookWorksheetWorksheets クラスでも提供されます。これらのメソッドは各クラスで同様に動作し、別のオブジェクトでも動作します。Select メソッドは、ほとんどすべての選択可能なオブジェクトに適用されます (そのようなオブジェクトは数多くあります)。

Workbook クラスのメソッド

Workbook クラスは膨大な数のメソッドを提供し、その多くが非常に特殊な状況を処理します。このセクションでは、詳細について焦点を当てるのではなく、さまざまなアプリケーションで使用頻度の高いいくつかのメソッドについて説明し、上級者向けのメソッドについては後に研究するものとして説明を割愛します。以下のリストでは、一般的に最も使用頻度の高いメソッドのいくつかを説明します。

  • Activateメソッドはワークブックをアクティブにし、ワークブック内の 1 番目のシートを選択します。
  • Close メソッドは指定したワークブックを閉じます。オプションとして、変更の保存を指定することもできます。ワークブックが保存されない場合も、ファイル名を指定することができます。さらに、そのワークブックが他のユーザーに送られた場合、ワークブックをまた他のユーザーに送ることを許可するかどうかを指定することもできます。以下のフラグメントでは、変更を破棄してワークブックを閉じます。
  • Protect メソッドと Unprotect メソッドを使用すると、ワークブックを保護してワークシートの追加と削除を禁止したり、ワークブックの保護を解除することができます。オプションとしてパスワードを指定したり、シートの保護 (ユーザーはシートを移動できません) やワークブックのウィンドウの保護の選択を表示させたりすることもできます。ワークブックが保護されていてもユーザーはセルを編集できます。データを保護するには、ワークシートを保護する必要があります。Unprotect メソッドを呼び出して、必要があればパスワードを渡し、ワークブックの保護を解除します。以下の例では、GetPasswordFromUser という名前のプロシージャがユーザーにパスワードの入力を求め、入力された値を返します。
  • Save メソッドはワークブックを保存します。ワークブックを保存していない場合、代わりに SaveAs メソッドを呼び出してパスを指定します (保存していないと Excel は作成時に付けられたファイル名でそのワークブックを現在の作業フォルダに保存します)。
  • SaveAs メソッドは Save メソッドよりはるかに複雑です。このメソッドを使用すると指定されたワークブックを保存することができ、オプションとしてファイル名、ファイル形式、パスワード、アクセス モードなどを指定できます。すべてのオプションのリストについては、オンライン ヘルプを参照してください。以下のフラグメントでは、現在作業中のワークブックを指定された場所に XML 形式で保存します。
    ヒント   一部のファイル形式では対話的なファイル保存が必要なため、SaveAs メソッドを呼び出す前に Application.DisplayAlerts プロパティを偽 (False) に設定する場合があります。たとえば、ワークシートを XML 形式で保存する場合、Excel はこのワークブックと共に VBA プロジェクトを保存できないことを伝えるメッセージを表示させます。DisplayAlerts プロパティを偽 (False) に設定すると、この警告メッセージは表示されません。
  • SaveCopyAs メソッドはワークシートのコピーをファイルに保存しますが、開いているワークブックはメモリ内で変更しません。このメソッドはワークブックの保存場所を変更せずにバックアップ コピーを作成するのに有効です。
    警告    ワークブックを保存およびコピーするメソッドを対話的にキャンセルすると、コード内で実行時エラーがトリガされます。たとえば、プロシージャで SaveAs メソッドを呼び出したときに Excel でメッセージの表示が無効化されていない場合、ユーザーが表示されたメッセージ ウィンドウの [キャンセル] をクリックすると、Excel はコード内で実行時エラーを発生させます。

Worksheet クラス

この文書をここまで読めば、個々のワークシートを操作するのに必要な概念の大半は理解できているはずです。Worksheet クラスには多くのメンバがありますが、大半のプロパティ、メソッド、イベントは Application クラスや Workbook クラスが提供するメンバと同一か、もしくは類似しています。このセクションでは、これまで説明されていなかった Worksheet クラス特有の重要なメンバや問題を取り上げます (このセクションの例は、Worksheet Object シートのサンプル ワークブック内にあります)。

Sheet クラスは存在しない

Excel には Workbook オブジェクトのプロパティの 1 つとして Sheets コレクションがありますが、Sheet クラスはありません。代わりに、Sheets コレクションの各メンバは Worksheet オブジェクトにも Chart オブジェクトにもなります。このように考えれば分かりやすいでしょう。つまり、Worksheet クラスと Chart クラスはそれぞれ内部の Sheet クラスが特殊化したインスタンスですが、Sheet クラスは公表されていません (ソース コードを入手しなければ、これが実装と一致するかどうか分かりません)。

保護の操作

一般に、Excel の保護機能はユーザーの操作やコード実行によるワークシート内のオブジェクトの変更を禁止します。ワークシートの保護を有効にすると、解除しない限りユーザーはシートの編集や変更ができません。ユーザー インターフェイス内で保護を有効にするには、[ツール] メニューから [保護][シートの保護] をクリックして行います。これらの項目を選択すると、図 12 で示すような [シートの保護] ダイアログ ボックスが開きます。ここでパスワードの設定や、個々のユーザーに自由にアクションを許可することもできます。保護を有効にするとデフォルト設定ですべてのセルがロックされます。また、[ツール] メニューから [保護][範囲の編集を許可] をクリックすると、図 13 で示すようにダイアログ ボックスが開き、ユーザーが特定の範囲内のセルを編集できるように設定することができます。これら 2 つのダイアログ ボックスを組み合わせて使用すれば、シートをロックしたままユーザーに特定の機能や範囲の編集を許可することができます。

Aa168292.excelobj012(ja-jp,office.11).gif
図 12. ユーザー インターフェイス内でこのダイアログ ボックスを使用してシート保護の制御を行う

Aa168292.excelobj013(ja-jp,office.11).gif
図 13. このダイアログ ボックスを使用してユーザーに特定の範囲の編集を許可する

ワークシートの Protect メソッドを使用して、プログラムでシートの保護を制御することができます。メソッドの構文は以下のようになり、それぞれのパラメータは任意です。

以下のリストは Protect メソッドの各パラメータを説明しています。

  • Password パラメータを設定して、ワークシートの保護を解除するために必要となる大文字小文字の区別をする文字列を指定します。このパラメータを指定しない場合、誰でもシートの保護を解除することができます。
  • DrawingObjects パラメータを真 (True) に設定して、ワークシート上の図形を保護します。デフォルト値は偽 (False) です。
  • Contents パラメータを真 (True) に設定して、ワークシートのコンテンツ (セル) を保護します。デフォルト値は真 (True) なのでおそらく変更する必要はないでしょう。
  • Scenarios パラメータを真 (True) に設定して、ワークシートのシナリオを保護します。デフォルト値は真 (True) です。
  • UserInterfaceOnly パラメータを真 (True) に設定して、コード実行による変更を許可し、ユーザー インターフェイスを介しての変更を禁止します。デフォルト設定は偽 (False) です。つまり、保護されたワークシートには、コード実行とユーザーのインターフェイスでの入力、どちらによっても変更を加えることができません。このプロパティ設定は現在のセッションにのみ適用されます。すべてのセッションでコードを使用してワークブックを操作するには、ワークブックが開かれるたびにこのプロパティを設定するコードを含める必要があります。
  • AllowFormattingCells パラメータ、AllowFormattingColumns パラメータ、および前述のメソッド構文のリストで示した残りのパラメータはすべて特定のフォーマット機能の設定に使用され、図 12で示されるダイアログ ボックスの各選択肢に対応しています。これらのプロパティのデフォルト設定はすべて偽 (False) です。

以下のフラグメントで示すように、シートの Protect メソッドを呼び出してワークシートを保護します。これによりパスワードが設定され並べ替え以外の操作が行えなくなります。

ヒント    コード内でパスワードをハード コードするのは明らかに良い方法とは言えません。ほとんどの場合、ユーザーにパスワード入力を要求し、そのパスワードを保存せずにワークブックに適用する必要が生じるためです。一般に、ソース コード内ではパスワードはハード コードされません。

ワークシートの保護を解除するには、以下のようなコードを使用します。このフラグメントは GetPasswordFromUser と呼ばれるプロシージャで、ユーザーにパスワードの入力を要求し、入力された値を返します。

Unprotect メソッドはワークシートの保護を解除し、任意のパスワードを供給することができます。

Excel はこの他に、保護機能を使うときに役立つ 2 つのオブジェクト、ProtectionAllowEditRange を提供します。Protection オブジェクトは、、Protect メソッドを呼び出す際に指定する、保護されていない範囲に関する情報を含むすべての情報をカプセル化します。Protect メソッドを呼び出すと、共有 Protection オブジェクトのプロパティが設定されますが、これは以下のような Boolean プロパティを提供し、Protect メソッドのパラメータと一致します。

  • AllowDeletingColumns, AllowDeletingRows
  • AllowFiltering
  • AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows
  • AllowInsertingColumns, AllowInsertingHyperlinks, AllowInsertingRows
  • AllowSorting
  • AllowUsingPivotTables

さらに、Protection クラスは AllowEditRanges プロパティを提供します。これにより、図 13 のダイアログ ボックスで指定された情報と一致するようにワークシート上の編集可能範囲を指定することができます。AllowEditRanges プロパティは一連の AllowEditRange オブジェクトを含み、各オブジェクトは以下のように、数々の便利なプロパティを提供します。

  • Range は編集可能な領域と一致する範囲を取得または設定します。
  • Title は編集可能な範囲のタイトルを取得または設定します (図 13で示すダイアログ ボックス内に表示されます)。
  • Users は一連の UserAccess オブジェクトを取得または設定します (UserAccess オブジェクトについて詳しくはオンライン文書を参照してください)。

サンプル ワークブックの Worksheet Object シート (図 14 参照) で、シートの保護のプログラミングが体験できます。[Protect] をクリックしてシートを保護すると、網かけ部分のみ編集可能になります (Information と Date という名前の 2 つの範囲)。シートの保護を解除するには [Unprotect] をクリックします。

Aa168292.excelobj014(ja-jp,office.11).gif
図 14. ワークシートの保護機能のテスト

サンプル シートの各リンクは以下のプロシージャを実行します。

オブジェクトのプロパティ

Worksheet クラスはオブジェクトを返すいくつかのプロパティを提供します。以下のセクションでは、これらのオブジェクトを紹介し、例を用いて使い方を説明します。

Comments

[挿入] メニューの [コメント] をクリックして、ワークシート上の範囲内にコメントを挿入することができます (図 15 参照)。Range オブジェクトの AddComment メソッドを使用しても、同じ動作をコードが実行します。以下のコードは、Date という名前の範囲と結びついたコメントが存在すればそれを削除し、新しいコメントを作成します。最終的に、コードは次のコード例で示す ShowOrHideComments メソッドを呼び出してシート上にあるすべてのコメントを表示させます (図 16 参照)。

Aa168292.excelobj015(ja-jp,office.11).gif
図 15. ユーザー インターフェイスのワークシート上に新しいコメントを容易に挿入可能


Aa168292.excelobj016(ja-jp,office.11).gif
図 16. サンプル シート上にすべてのコメントを表示


Worksheet クラスが提供する Comments プロパティは、Comments オブジェクトを返します。この一連の Comment オブジェクトにより、ワークシートと関連するすべての Comment オブジェクトを繰り返し実行することができます。Comment クラスは多くのメンバは提供しません。コメントを表示、非表示するには Comment クラスの Visible プロパティを使用し、コメントを削除するには Delete メソッドを使用します。加えて、Text メソッドも有用です。このメソッドを使用して既存のコメントへのテキスト追加や上書きが可能です。

追加したコメントをワークシート上に表示するには、サンプル プロジェクトの ShowOrHideComments プロシージャを使用します。これにより、アクティブなシート上ですべてのコメントを表示または非表示させることができます。

注意    Comments コレクションは、他の多くの Excel の子コレクション クラスと同様、デフォルトの列挙子を提供しません。つまり、コレクション内のすべての要素にアクセスするために For Each ループを使用することはできません。Comment コレクションのようなコレクションでは、インデックス付きループを使用してコレクションを繰り返し実行します。

Outline

Excel では、アウトライン機能を使用してデータをグループ分けすることができます。コード内からでも同じ機能を利用することができます。たとえば、図 17 で表される行にアウトラインを追加することにより、図 18 で示されるように行を再表示したり、図 19 で示されるようにグループを再表示することができます (図ではすでにこの作業は行われています)。

Aa168292.excelobj017(ja-jp,office.11).gif
図 17. これらのグループを作成

Aa168292.excelobj018(ja-jp,office.11).gif
図 18. グループを表示


Aa168292.excelobj019(ja-jp,office.11).gif
図 19. グループをすべて表示


Worksheet クラスは Outline プロパティを提供しますが、これ自体が Outline オブジェクトです。Outline クラスはそれほど多くのメンバを提供しません。以下のリストでは、使用頻度の高いメンバを説明します。

  • AutomaticStyles (Boolean 値) はアウトライン スタイルが自動的に適用されるかどうかを Excel に表示させます。
  • SummaryColumn (XlSummaryColumn) は集計列の位置を取得または設定します。XlSummaryColumn 列挙体が使用できる値は 2 つあります。xlSummaryOnLeftxlSummaryOnRight です。
  • SummaryRow (XlSummaryRow) は集計行の位置を取得または設定します。XlSummaryRow 列挙体が使用できる値は 2 つあります。xlSummaryAbovexlSummaryBelow です。
  • ShowLevels を使用して希望の行または列のレベルまでアウトライン グループの表示と非表示を切り替えることができます。このメソッドには以下のような 2 つのパラメータを渡すことができます。

サンプル ワークシートは、2001 年 (Data2001) および 2002 年 (Data2002)、そしてすべての行 (AllData) のデータに対応する名前つき範囲を含んでいます。これらのセル参照はワークシートの幅全体をカパーしているので、有効なグループ化を行うには、完全な行から成る範囲を使用する必要があります。2003 年のデータと関連付けられたセル参照は存在しないので、コード例では行全体を対象範囲とした操作を示すことはできません。

グループは簡単に作成できます。1 つ以上の完全な行と対応する範囲の Group メソッドを呼び出して行います (グループ化のパラメータを 4 つまで任意に指定することができます。たとえば、グループの最初の値と最後の値、値ごとのグループ、グループ化の期間を示す任意の Boolean 値などですが、これらのパラメータが使用されることは稀なので例でも使用していません)。グループ化の解除は Ungroup メソッドを呼び出して行います。たとえば、サンプル シート上の [Work with Groups] リンクをクリックすると以下のようなコードが実行されます。

3 つのセル参照をグループ化するために、コードは範囲の Group メソッドを呼び出します。:

セル参照のない範囲をグループ化するには、行の範囲が分かっている場合、コードはワークシートの Rows プロパティを使用します。このプロパティは要求されている行と一致する範囲を返します。

サンプル ワークシートの [Clear Groups] リンクをクリックし、同様のコードを実行してグループ化を解除します。

これらのテクニックを使用すると、グループ化やグループ化の解除、ワークシート上に表示されるグループ化のレベルの制御が可能になります。

Range オブジェクト

Range オブジェクトは、Excel アプリケーションで最も使用頻度の高いオブジェクトです。Excel 内のある範囲を操作できるようにするには、その範囲を Range オブジェクトとして表現し、その Range メソッドやプロパティを操作することが必要です。Range クラスは非常に重要です。この文書のすべてのサンプルで、何らかの方法で Range オブジェクトが使用されています。基本的に、Range オブジェクトはセル、行、列、1 つ以上のセル ブロックを含む一群のセル (連続もしくは非連続)、複数のシート上のセルのグループを表します。

数多くある Range クラスのすべてのメンバを説明することは不可能なので、このセクションでは 3 つの重要な問題に焦点を当てます。

  • コード内で範囲を参照する。
  • コード内で範囲を操作する。
  • Range オブジェクトを使用して特定の目的を達成する。

つまり、Range オブジェクトの使用方法は状況によって何通りもあるため、このセクションでは全体的なメンバのリストを提供するのではなく、「~するには ?」という質問に答えていきます。

選択の管理

現在の選択を使用して範囲のプロパティや動作を変更しがちですが、これはできるだけ避けてください。ほかの共有リソースと同様、Excel 内の選択はユーザーの選択を表します。もしこれをコード内で変換してしまうとユーザーは現在の選択を制御できなくなります。大切なことは、ユーザーの選択を変更したい場合にのみオブジェクトの Select メソッドを呼びだすということです。開発者として都合がいいからという理由だけで Select メソッドを変更するのは好ましくありません。範囲のプロパティを設定する方法は他にもあります。Select メソッドの使用を回避すれば、コードの実行速度が上がるだけでなく、ユーザーの満足度を上げることもできます。

以下のようなコードを記述して、ユーザーが現在操作しているセルに隣接する範囲を簡単にクリアすることができます。

この方法を実行するとユーザーの選択は失われます。最初に選択されたセルが 1 つだけであっても、上記のコードを実行すると隣接するセル ブロック全体が選択されます。全部のセルを選択することが目的でない限りは、以下のコードを使用してください。

最初に紹介したフラグメントを使用する場合もあります。Excel 開発の初心者は、Excel 内でさまざまなオブジェクトやメソッドの使用方法を試行錯誤しているうちにマクロ レコーダを使用するようになる傾向があるので、このようなコードが時々記述されます。これは良いアイデアですが、マクロ レコーダが書くコードは実にひどいものです。一般的に、マクロ レコーダは選択を使用し、タスクを記録するときにその選択を変更します。

ヒント    1 つのセルもしくはセルのグループを操作するには、可能であれば、選択を変更するのではなく目的のセルを表す範囲を使用します。ユーザーの選択を変更することが目的であれば、Range.Select メソッドを使用します。

コード内の範囲の参照

Range クラスは非常に柔軟性があるので、プログラムで範囲を操作する際には多すぎるほどの選択肢があります。Range オブジェクトは単一オブジェクトの場合もあれば、一連のオブジェクトを表す場合もあります。ItemCount メンバがあるので、Range オブジェクトはたいていの場合、単一オブジェクトを指しますが、Range オブジェクトの使い方を判断するのが困難な場合もあります。

ヒント    以下のいくつかの例を使用して範囲の Address プロパティを検索することができます。このプロパティは、"$A$1" (A1 に位置するセル)、"$1" (ワークシートの最初の行)、そして "$A$1:$C$5" (A1 と C5 で囲まれる四角内のすべてのセルからなる範囲) などを含むいくつかのフォーマットのうちの 1 つの範囲の座標の表示を含む文字列を返します。"$" は相対座標と対照的な絶対座標を表しています。Address プロパティを使用すれば、検索した範囲の正確な位置が簡単に分かります。範囲の参照方法についての詳細は Excel オンライン ヘルプを参照してください。

簡単に言えば、以下のリストに記載されたコードを記述して Range オブジェクトが単一セルとグループのセル、どちらを参照するのかを指定することができます。それぞれの例には以下のセット アップ コードがあります。

以下のいずれかのテクニックを使用して、特定の範囲を参照できます (Range オブジェクトの参照を取得する方法は他にもいくつかあります)。

  • Application オブジェクトの ActiveCell プロパティを参照します。
  • オブジェクトの Range プロパティを使用して範囲を指定します。C# はパラメータ表現された非インデックス型プロパティをサポートしていないので、代わりパラメータを 2 つ必要とする get_Range メソッドを呼び出す必要があります。
  • ワークシートの Cells プロパティを使用して単一の行と列の値を指定します。
  • 範囲の "コーナー" を指定します。範囲内の Cells プロパティ、Rows プロパティ、および Columns プロパティを直接参照することもできます。それぞれの場合、プロパティは範囲を返します。
  • セル参照を参照します。このテクニックはこの文書の随所で使用されています。C# の get_Range メソッドはパラメータを 2 つ必要とし、範囲名はパラメータを 1 つしか必要としないので、2 番目のパラメータに Type.Missing を指定する必要があります。
  • 特定の行、列もしくは行の範囲と列の範囲を参照します。RowsColumns のプロパティはそれぞれ Object を返すので Option StrictOn に設定されている場合は変換が必要です。
    警告    プロパティの IntelliSense は誤解を招きやすいので注意が必要です。はじめに行、次に列の値を指定するよう指示します。しかし実際には Columns プロパティの値は逆転しています。RowsColumns、どちらのプロパティでも 2 番目のパラメータは使用されません。
  • Application オブジェクトの Selection プロパティを使用して、選択されたセルと一致する範囲を返すことができます。図 20 のような状況では以下のコードで文字列 "$C$3" を返すことができます (絶対座標を示すために "$" を使用します)。
    ヒント    Address プロパティも、パラメータ化されたプロパティのうちの 1 つで、C# では直接操作できません。get_Address メソッドを呼び出し、Range オブジェクトに対応するアドレスを検索します。Address プロパティのパラメータはすべて任意ですが、get_Address メソッドではパラメータは 5 つ検索されます。しかし、アドレスの形式を指定する 3 番目のパラメータ以外はおそらく必要ありません。
  • 他の 2 つの範囲の結合を含む範囲を作成します (カッコ内に 2 つの範囲をカンマで区切って指定します)。
  • 他の 2 つの範囲の共通部分を参照する範囲を作成します (カッコ内に 2 つの範囲を区切り文字なしで指定します)。
  • 範囲の Offset プロパティを使用してオリジナルの範囲に対応する範囲を検索します。以下の例では、行 1、列 1 に位置するセルの下の領域にコンテンツを加えます。
    ヒント    Range.Offset プロパティはパラメータ化されたプロパティなので、C# コードは直接その値を検索することはできません。代わりに、C# 開発者は get_Offset メソッドを呼び出す必要があります。
  • 現在作業中の領域を示す範囲を検索するには、範囲の CurrentRegion プロパティを使用します。たとえば 図 20 で示されるような一番近くの空の行と列で囲まれた領域です。以下の表現式を使用して現在作業中の領域のフォントを太字にできます。

    Aa168292.excelobj020(ja-jp,office.11).gif
    図 20. セル C3 の CurrentRegion プロパティを要求して範囲 A1:E5 が返される


  • 範囲のコンテンツの各領域にそれぞれ対応する範囲のコレクションを検索するには、範囲の Areas プロパティを使用します。たとえば、以下のフラグメントは図 21 で示されるようなセル参照、Test ("$B$1:$E$5" と "$C$7:$G$11") に領域のアドレスを表示させます ("$" は絶対座標を表しています)。


    Aa168292.excelobj021(ja-jp,office.11).gif
    図 21. 範囲が隣接していない領域を含む場合。Areas プロパティを使用して各領域を個別に検索する。


  • End プロパティXlDirection 列挙体の値 (xlUpxlToRightxlToLeftxlDown) を使用して領域の最後のセルを表わす範囲を検索します。その列挙体の値が表すキーを押したような形になります。図 22 で示される選択されたセルを使用して以下のコードを実行すると、コード内のコメントで示すとおりに定義された 4 つの範囲が作成されます。

    Aa168292.excelobj022(ja-jp,office.11).gif
    図 22. End プロパティを使用して 1 つの範囲に対応する複数の範囲を返す


  • 指定された範囲を含む行や列を参照するには EntireRow プロパティまたは EntireColumn プロパティを使用します。たとえば、以下のコードを使用すると行 7 から行 11 までのフォントが太字になります (図 21 の例を参照)。

テクノロジの使用

開発者は通常、選択されたセルを含む行全体のフォントを変更する機能を要求して、テキストを太字にすることができます。Excel にはこの機能はありませんが、追加することはそれほど難しくはありません。サンプル ワークブックの Range クラス シートは特別に処理される範囲を含んでいます。アイテムを選択するとその行は太字になります。図 23 はこの動作を示しています。

Aa168292.excelobj023(ja-jp,office.11).gif
図 23. アイテムを選択してその行全体を太字にする


サンプル ワークブックはフォーマットを行う以下のプロシージャを含みます。

この例では、次のようなアクションを実行して現在作業中の行を太字にし、以前太字にされた行を標準に戻します。

  • すでに選択された行を記録するために変数 (Visual Basic では Static) を宣言します。
  • Application.ActiveCell プロパティを使用して現在作業中のセルの参照を検索します。
  • アクティブなセルの EntireRow プロパティを使用して現在作業中の行を太字にします。
  • intRow の現在の値が 0 でないことを確認します。値 0 は、このコードが実行されるのは初めてであることを示します。
  • 現在作業中の行が以前とは別の行であることを確認します。別の行の場合は、コードは行の状態を変更するだけです。Row プロパティは範囲と一致する行を示す整数を返します。
  • 以前に選択された行を表す範囲の参照を検索し、その行を標準の表示に戻します。

サンプル ワークブックでは、SheetSelectionChange イベント ハンドラから BoldCurrentRow プロシージャを呼び出します。このプロシージャの実行中に、コードは (Application オブジェクトの Intersect メソッドを使用して) 新しい選択が正しい範囲内にあることを確認し、それが確認されると BoldCurrentRow プロシージャを呼び出します。

範囲の操作

ある範囲の参照を取得した後に何ができるか見ていきます。実にさまざまなことができます。このセクションでは Range オブジェクトの操作のためのいくつかのテクニックに焦点を当て、各テクニックの簡単な例を示します。このセクション内のすべてのサンプルはサンプル ワークブックの Range Class シート内にあります。

範囲のオートフィル

B>Range クラスの AutoFill メソッドを使用すると、ある範囲内に自動的に値を入力することができます。多くの場合、AutoFill メソッドは、連続して増加または減少する値を範囲内に入力するときに利用します。XlAutoFillType 列挙体 (xlFillDaysxlFillFormatsxlFillSeriesxlFillWeekdaysxlGrowthTrendxlFillCopyxlFillDefaultxlFillMonthsxlFillValuesxlFillYearsxlLinearTrend) の中から任意の定数を供給すると、フィルの形式を指定することができます。フィル タイプを指定しない場合、Excel はデフォルトのフィル タイプ (xlFillDefault) が要求されていると判断し、適合する値を指定の範囲にフィルします。

図 24 のサンプル ワークシートはオートフィルされる 4 つの範囲を示しています。列 B は 5 つの平日の曜日を含み、列 C は5 つの月を含み、列 D は 年ごとに増加する 5 年分の日を含み、列 E はそれぞれの行ごとに 2 ずつ増える一連の数を含みます。サンプル コードを実行すると、同じ範囲が図 25 のようになります。

Aa168292.excelobj024(ja-jp,office.11).gif
図 24. 4 つのサンプル範囲に AutoFill メソッドを呼び出す前


Aa168292.excelobj025(ja-jp,office.11).gif
図 25. 範囲をオート フィルした後


[AutoFill] リンクをクリックすると以下のようなプロシージャが実行されます。

各ケースについて 2 つの範囲を指定する必要があります。

  • AutoFill メソッドを呼び出す範囲で、フィルの "開始点" を指定します。
  • フィルの範囲で、AutoFill メソッドにパラメータとして渡されます。パラメータを受け取る範囲はソースの範囲を含んでいる必要があります。

AutoFill メソッドの 2 番目のパラメータとなる XlAutoFillType 列挙体の値は任意です。通常、必要な動作を取得するためにはこの値を供給する必要があります。たとえば、以下のコードを変更してみます。

so that it looks like this:

日付の値を年ごとに増加させる代わりに、毎日増加させるように変更されました。

範囲内での検索

Range クラスの Find メソッドを使うことにより、その範囲内のテキストの検索ができます。この柔軟性のあるメソッドは図 26 で示されている Excel の [検索と置換] ダイアログ ボックスと動作が類似しています。実際、このメソッドはこのダイアログ ボックスと直接、対話しています。つまり、Range.Find メソッドは検索方法を決定するために渡されたパラメータを使用しますが、パラメータが渡されない場合、[検索と置換] ダイアログ ボックス内のパラメータを使用します。表 4Range.Find メソッドで使用するパラメータのリストです。最初の 1 つ以外はすべて任意です。

Aa168292.excelobj026(ja-jp,office.11).gif
図 26. このダイアログ ボックス内の選択が Find メソッドの動作に影響


注意    Range.Find のパラメータの大半は任意で、ユーザーが [検索と置換] ダイアログ ボックスの中の値を変更する可能性があるため、Find メソッドに実際にすべての値を確実に渡す必要があります。ただし、ユーザーの選択を考慮するのが目的である場合はこの限りではありません。C# 開発者はメソッド呼び出しごとにすべてのパラメータを供給する必要があるため、この問題を考慮する必要はありません。

表 4. Range.Find メソッドのパラメータ

パラメータタイプ説明
What (必須)Object検索するデータ。文字列もしくは Excel データ タイプ。
AfterRange検索を開始する範囲 (このセルは検索対象には含まれません)。このセルを指定しない場合は、検索は範囲内の左上から始まります。
LookInXlFindLookin (xlValue, xlComments, xlFormulas)検索される情報のタイプ。Or 演算子を使用して複数の値を組み合わせることはできません。
LookAtXlLookAt (xlWhole, xlPart)セル内容の検索の、完全一致または部分一致を指定します。
SearchOrderXlSearchOrder (xlByRows, xlByColumns)検索の順位を決定します。xlByRows (デフォルト値) は最初に左から右へ、次に上から下へ検索します。xlByColumns は最初に上から下へ、次に左から右へ検索します。
SearchDirectionXlSearchDirection (xlNext, xlPrevious)検索方向を決定します。デフォルト値は xlNext です。
MatchCaseBoolean検索で大文字と小文字を区別するかどうかを決定します。
MatchByteBoolean検索で全角文字を全角文字のみに一致させる (True) または、対応する半角文字とも一致させる (False) かを決定します。全角文字をサポートしている場合のみ適用されます。

サンプル ワークブックの以下の例では、("Fruits" という名前の) ある範囲を検索し、"apples" という言葉を含むセルのフォントを変更します (図 27 は検索結果を示しています)。このプロシージャでは、以前に設定された検索設定で再度検索する FindNext メソッドも使用されます (Range.FindPrevious メソッドの動作は Range.FindNext メソッドとほぼ同一ですが、この例では使用しません)。検索を始めるセルを指定すると、FindNext メソッドが残りの操作を処理します。

Aa168292.excelobj027(ja-jp,office.11).gif
図 27. "apples" という言葉を含むセルの検索結果


ヒント    FindNext (および FindPrevious) メソッドによる検索では、範囲の最後まで検索されると範囲の最初に戻ります。コードを確認して、検索が永久に続くことがないようにしてください。サンプル プロシージャではこの問題に対処する方法が 1 つ示されています。この問題を完全に回避する、もしくは Find/FindNext/FindPrevious メソッドでは不可能な複雑な検索を実行するには、For Each ループ を使用して範囲内のすべてのセルをループすることも可能です。

サンプル ワークブックの Range Class シートの Find リンクをクリックすると、以下のプロシージャが実行されます。

コードは目的を達成するために以下のアクションを実行します。

  • Excel.Range 変数を宣言して、範囲全体、最初に検索された範囲、および現在検索されている範囲を記録します。
  • 検索開始セル以外のすべてのパラメータを指定して、最初に一致するデータを検索します。デフォルト設定では範囲の左上のセルの次から検索が開始されます。例では、セルの値が "apples" と一致するデータを検索します。内容が部分的に一致しているセルを、行ごとに上から下へ検索していきます。大文字と小文字の区別はしません。
  • 一致するデータが見つかるまで検索が続きます。
  • 最初に見つかった範囲 (rngFoundFirst) を Nothing と比較します。これはコードが最初の一致データのみを見つけた場合で、コードは見つかった範囲を格納します。見つかった範囲のアドレスが最初に見つかった範囲のアドレスと一致すると、コードはループから出ます。
  • 見つかった範囲の外観を設定します。
  • 別の検索を実行します。

サンプル シートの [Reset Find] リンクをクリックすると、範囲を最初の状態に戻すための簡単なプロシージャが実行されます。

ヒント    同じ範囲内で検索と置換を行う場合は Range.Replace メソッドを使用します。このメソッドは Find メソッドと同様のしくみですが、置換後の値を指定することができます。Replace メソッドは置換が行われたかどうかを示す Boolean 値を返します。置換が 1 か所でも行われれば真 (True ) を返します。

範囲内でのデータの並べ替え

Excel のユーザー インターフェイスからある範囲内のデータを並べ替えることができるように、Range.Sort メソッドを使用してプログラムの実行によりデータを並べ替えることができます。並べ替えの範囲と、キーとして使用するための任意の 3 つ以内の行または列、そしてその他のいくつかのパラメータを指定します。残りの操作は Excel が処理します。表 5Sort メソッドで使用されるすべてのパラメータを示しています (Visual Basic .NET 開発者はこれらのパラメータのうち数個を使用するだけかもしませんが、C# 開発者はそれぞれの値を供給する必要があります)。

表 5. Sort メソッドに使用するパラメータ

パラメータタイプ説明
Key1Object (String または Range)範囲名 (文字列) もしくは Range オブジェクトで、最初に並べ替えられるフィールド。並べ替える値を決定します。
Order1XlSortOrder (xlAscending, xlDescending)Key1 で指定された値の並べ替え順序を決定します。
Key2Object (String または Range)2 番目に並べ替えられるフィールド。ピボット テーブルの並べ替えには使用できません。
TypeObjectピボット テーブルの並べ替えにおいて、並べ替えられる要素を決定します。標準の範囲では適用されません。
Order2XlSortOrderKey2 で指定された値の並べ替え順序を決定します。
Key3Object (String or Range)3 番目に並べ替えられるフィールド。ピボット テーブルの並べ替えには使用できません。
Order3XlSortOrderKey3 で指定された値の並べ替え順序を決定します。
HeaderXlYesNoGuess (xlGuess, xlNo, xlYes)最初の行がヘッダ情報を含むかどうかを指定します。xlNo がデフォルト値です。Excel に判断させるには xlGuess を指定します。
OrderCustomIntegerユーザー設定リストの中に 1 から始まるインデックスを指定します。このパラメータを省略した場合はデフォルトの並べ替え順序が適用されます。図 28 では並べ替え順序のユーザー設定作成方法のテクニックを紹介しています。たとえば、このパラメータを 6 に指定すると "fruits" というユーザー設定の並べ替え順序にしたがって並べ替えが行われます。
MatchCaseBoolean大文字小文字を区別する並べ替えを行うには真 (True) に設定し、大文字小文字を区別しない並べ替えを行うには偽 (False) に設定します。ピボット テーブルの検索には使用できません。
OrientationXlSortOrientation (xlSortRows, xlSortColumns)並べ替えの方向。
SortMethodXlSortMethod (xlStroke, xlPinYin)並べ替え方法を指定します。すべての言語には適用されません (現在の値は中国語の並べ替えのみに適用されており、その他の言語はサポートしていません (英語版の場合))。
DataOption1XlSortDataOption (xlSortTextAsNumbers, xlSortNormal)Key1 で指定された範囲内のテキストの並べ替え方法を指定します。ピボット テーブルの並べ替えには適用されません。
DataOption2XlSortDataOptionKey2 で指定された範囲内のテキストの並べ替え方法を指定します。ピボット テーブルの並べ替えには適用されません。
DataOption3XlSortDataOptionKey3 で指定された範囲内のテキストの並べ替え方法を指定します。ピボット テーブルの並べ替えには適用されません。

ヒント    このようなメソッドを呼び出す場合、Visual Basic .NET 開発者には C# 開発者に比べて大きなメリットがあります。すべてのパラメータを使うことはほとんどないので Visual Basic .NET 開発者は名前付きパラメータを使用して必要なパラメータのみ指定することができます。C# 開発者は、デフォルトの動作を承認するために、使用されていないすべてのパラメータにヌル値を渡す必要があります。

Aa168292.excelobj028(ja-jp,office.11).gif
図 28. ユーザー設定リストを作成し、コード実行によってこれらの個々の並べ替え順序を参照する


Range Class サンプル シートの [Sort] リンクをクリックすると、以下のようなプロシージャが実行され、最初に 1 列目のデータごとに、次に 2 列目のデータごとに Fruits の範囲の並べ替えが行われます。

同じシート上の [Reset Sort] リンクをクリックすると以下のプロシージャが実行され、図 28 に示されているようなユーザー設定に基づいて 2 列目の並べ替えが行われます。

次のステップに向けて

Excel のオブジェクト モデルは奥の深い豊かな機能性を備えているので、非常に長いように見えるこの文書でさえ、そのほんの一部しか説明できません。この文書では、ApplicationWorkbookWorksheet、そして Range といった重要なクラスを紹介しましたが、ほかのさまざまな便利なクラスまでは紹介していません。たとえば、PivotTableChart のような、Excel オブジェクト モデルが提供する第 2 層クラスも詳しく検討していく必要があります。Excel オブジェクト モデルについて完全に理解し、自分が必要とするクラスを見つけるための努力さえおしまなければ、必要な自動タスクのほとんどを使いこなせるようになります。この文書や、オブジェクト ブラウザ、Excel VBA オンライン ヘルプなどをうまく活用して、Excel で想像できる限りのあらゆるタスクに挑戦してください。


この情報は役に立ちましたか。
(残り 1500 文字)