さまざまな地域設定を使用した Excel のデータの書式設定
更新 : 2007 年 11 月
対象 |
---|
このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。 プロジェクトの種類
Microsoft Office のバージョン
詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。 |
日付や通貨など、ロケールに依存する書式設定を持つすべてのデータは、Microsoft Office Excel に渡したり、Visual Studio Tools for Office プロジェクトのコードからデータを読み込んだりする前に、英語 (米国) のデータ書式 (ロケール ID 1033) を使用して書式設定する必要があります。
既定では、Visual Studio Tools for Office ランタイムにより Excel オブジェクト モデルはロケール ID 1033 によるデータの書式設定を予期します (これは、オブジェクト モデルがロケール ID 1033 にロックされているとも言います)。この動作は、Visual Basic for Applications の動作方法と一致します。ただし、この動作を Visual Studio Tools for Office ソリューションで変更できます。
ロックされた Excel オブジェクト モデルのプログラミング
Visual Studio Tools for Office を使用して作成したドキュメント レベルのカスタマイズとアプリケーション レベルのアドインは、既定で、エンド ユーザーのロケール設定による影響を受けず、常にロケールが英語 (米国) であるものとして動作します。たとえば、Excel で Value2 プロパティの取得または設定を行う場合、データはロケール ID 1033 が予期する方法で書式設定する必要があります。別のデータ書式を使用すると、予期しない結果が得られる場合があります。
マネージ コードに渡されるデータや、マネージ コードによって処理されるデータに英語 (米国) の書式を使用した場合でも、Excel では、エンド ユーザーのロケール設定に従って、データが正確に解釈および表示されます。Excel がデータを正確に書式設定できるのは、マネージ コードによってデータと共にロケール ID 1033 が渡されるからです。このロケール ID は、データが英語 (米国) の書式であることを示し、ユーザーのロケール設定に合わせてデータを再度書式設定する必要があることを示します。
たとえば、エンド ユーザーの地域オプションがドイツ (ドイツ語) ロケールに設定されている場合、2005 年 6 月 29 日という日付は 29.06.2005 と書式設定されることが予期されます。しかし、ソリューションがこのデータを文字列として Excel に渡す場合は、英語 (米国) の書式に従って 6/29/2005 と書式設定する必要があります。セルが日付セルとして書式設定されている場合、Excel はこのデータをドイツ (ドイツ語) の書式で表示します。
Excel オブジェクト モデルのロックの解除
Visual Studio Tools for Office では、Excel オブジェクト モデル全体に対して、ロケール ID の動作のロックを解除できます。Visual Studio Tools for Office ソリューションでは、ExcelLocale1033Attribute コントロールによって Excel オブジェクト モデルの動作が制御されます。既定では、この属性は true に設定されており、Excel オブジェクト モデルがロケール ID 1033 の書式設定を予期するようロックされます。この属性が true であると、Visual Studio Tools for Office は、Excel に対して常にロケール ID 1033 を渡すプロキシ オブジェクトのソリューションでインスタンス化された、すべての Excel オブジェクトをラップします。この属性を false に設定すると、これらのプロキシ オブジェクトは使用されず、Excel オブジェクト モデルはエンド ユーザーのロケール設定を使用します。
メモ : |
---|
この属性を false に設定した場合に、いずれかのエンド ユーザーのロケール設定が英語 (米国) 以外に設定されていると、そのユーザーについてはソリューションで予期しない動作が発生する場合があります。コードの記述方法によっては、いずれのロケール設定でも機能するようにできます。詳細については、「方法 : リフレクションを使用して Excel 内のリテラル文字列を領域保護する」を参照してください。 |
オブジェクト モデルのロックを解除するには、プロジェクトにある AssemblyInfo.vb ファイルまたは AssemblyInfo.cs ファイルで、ExcelLocale1033Attribute を false に設定します。
<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
メモ : |
---|
ExcelLocale1033Attribute が true に設定されていると、Visual Studio Tools for Office ランタイムはプロキシ オブジェクトにあるすべてのネイティブ Excel オブジェクトをラップするため、ネイティブ Excel オブジェクトに関連する一部の処理の速度が低下することがあります。このような場合は、(プロキシを使用せずに) Unwrap メソッドを使用して Excel オブジェクトを取得し、そのオブジェクトを使用して処理を実行することで、パフォーマンスを向上させることができます。このとき、Unwrap によって返されるオブジェクトは、ロケール ID 1033 ではなく、現在のスレッドのロケール ID を使用することに注意してください。 |
Excel 2003 プロジェクトにおける特定の Excel オブジェクトのロックの解除
Excel 2003 用のソリューションを開発している場合、ロケール ID 1033 ではなく、現在のスレッドのロケール ID を使用するように、ネイティブな Excel オブジェクト (Microsoft.Office.Interop.Excel 名前空間で定義されたクラスのインスタンス) の変更が必要になることがあります。たとえば、Excel オブジェクトに属するメソッドの out パラメータとして null を渡す必要がある場合がこれに該当します。
Excel 2003 プロジェクト内の各 Excel オブジェクトを対象としてロケール ID 動作を変更するには、ExcelLocale1033Proxy クラスのメソッドを使用します。ロケール ID 1033 ではなく現在のスレッドのロケール ID を使用するように Excel オブジェクトを変更するには、Unwrap メソッドを呼び出します。
一方、Unwrap を呼び出して Excel オブジェクトを変更した後で、そのオブジェクトを再度使用するときに、現在のスレッドのロケール ID ではなくロケール ID 1033 を使用するように戻すことが必要になる場合もあります。現在のスレッドのロケール ID ではなくロケール ID 1033 を使用するプロキシ オブジェクトにある Excel オブジェクトをラップするには、Wrap メソッドを呼び出します。
メモ : |
---|
Unwrap メソッドおよび Wrap メソッドは Excel 2007 の Visual Studio Tools for Office プロジェクトでは使用されなくなりました。Excel 2007 プロジェクトで使用される Visual Studio Tools for Office ランタイムでは、ExcelLocale1033Attribute が true であるときにネイティブな Excel オブジェクトが期待どおりに動作するように改良が施されています。Visual Studio Tools for Office ランタイムの詳細については、「Visual Studio Tools for Office Runtime の概要」を参照してください。 |
Excel オブジェクト モデルがロックされている場合の out パラメータがあるメソッドの呼び出し
Excel 2003 ソリューションで ExcelLocale1033Attribute が true の場合、null を Excel オブジェクト モデル内のメソッドの out パラメータとして渡すと、例外がスローされます。null を out パラメータとして渡すには、メソッドを呼び出す前に、Unwrap を呼び出し、メソッドを含むオブジェクト内で渡す必要があります。
または、メソッドを呼び出す前にパラメータに値を代入することもできます。out パラメータの詳細については、「out (C# リファレンス)」を参照してください。
たとえば、ExcelLocale1033Attribute が true の場合には、次のコードによって例外がスローされます。ExportXml メソッドには out パラメータがあります。
Dim outString As String = Nothing
Dim result As Excel.XlXmlExportResult = _
Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = null;
Excel.XlXmlExportResult expResult =
Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);
この問題を解決するには、ExportXml を呼び出す前に、XmlMap を Unwrap メソッドに渡します。
Dim outString As String = Nothing
Dim map As Excel.XmlMap = TryCast( _
Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap( _
Globals.ThisWorkbook.XmlMaps(1)), Excel.XmlMap)
Dim result As Excel.XlXmlExportResult = map.ExportXml(outString)
string outString = null;
Excel.XmlMap map = Microsoft.Office.Tools.Excel.
ExcelLocale1033Proxy.Unwrap(
Globals.ThisWorkbook.XmlMaps[1]) as Excel.XmlMap;
Excel.XlXmlExportResult expResult = map.ExportXml(out outString);
または、ExportXml に渡す前に、outString 変数に値を代入することもできます。
Dim outString As String = String.Empty
Dim result As Excel.XlXmlExportResult = _
Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = String.Empty;
Excel.XlXmlExportResult expResult =
Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);
参照
処理手順
方法 : リフレクションを使用して Excel 内のリテラル文字列を領域保護する
概念
Visual Studio における Office ソリューションの作成
Visual Studio Tools for Office Runtime の概要