日付や通貨など、ロケールに依存する書式設定を持つすべてのデータは、Microsoft Office Excel に渡したり、Visual Studio Tools for Office プロジェクトのコードからデータを読み込んだりする前に、英語 (米国) のデータ書式 (ロケール ID 1033) を使用して書式設定する必要があります。既定では、Visual Studio Tools for Office を使用してドキュメント レベルのカスタマイズやアプリケーション レベルのアドインを作成した場合、Excel オブジェクト モデルではロケール ID 1033 のデータ書式が必要です。単一のロケール ID のみを予期するようにオブジェクト モデルを設定することを、オブジェクト モデルをそのロケール ID にロックすると言います。たとえば、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 Version 2003 を使用して作成されたカスタマイズでは、エンド ユーザーのコンピュータのロケール設定が、Excel オブジェクト モデルの動作に影響する場合があります。これらのロケール設定が原因で、日付や数値が誤った書式で表示されるなど、予期しない動作が発生する場合があります。
Visual Studio 2005 Tools for Office を使用して作成したカスタマイズやアドインは、エンド ユーザーのロケール設定による影響を受けず、常にロケールが英語 (米国) であるものとして動作します。Excel オブジェクト モデルは、ロケール ID 1033 のデータ書式設定を予期するようロックされます。この動作は、Visual Basic for Applications の動作方法と一致します。
Excel オブジェクト モデルのロックの解除
Visual Studio 2005 Tools for Office では、Excel オブジェクト モデル全体または個々の Excel オブジェクトに対して、ロケール ID の動作のロックを解除できます。Visual Studio 2005 Tools for Office ソリューションでは、ExcelLocale1033Attribute によって Excel オブジェクト モデルの動作が制御されます。既定では、この属性は true に設定されており、Excel オブジェクト モデルがロケール ID 1033 の書式設定を予期するようロックされます。この属性を false に設定すると、Excel オブジェクト モデルはエンド ユーザーのロケール設定を使用します。これは Visual Studio Tools for Office Version 2003 の動作方法と同じです。
メモ : |
|---|
| この属性を false に設定した場合に、いずれかのエンド ユーザーのロケール設定が英語 (米国) 以外に設定されていると、そのユーザーについてはソリューションで予期しない動作が発生する場合があります。コードの記述方法によっては、いずれのロケール設定でも機能するようにできます。詳細については、「方法 : リフレクションを使用して Excel 内のリテラル文字列を領域保護する」を参照してください。 |
オブジェクト モデルのロックを解除するには、ファイル AssemblyInfo.vb または AssemblyInfo.cs で、属性 ExcelLocale1033Attribute を false に設定します。
<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
特定の Excel オブジェクトのロックの解除
ExcelLocale1033Proxy クラスには、個々の Excel オブジェクト (つまり Microsoft.Office.Interop.Excel 名前空間で定義されているオブジェクト) でのロケール ID の動作を変更するために使用できるメソッドが 2 つ用意されています。ロケール ID 1033 ではなく現在のスレッドのロケール ID を使用するように Excel オブジェクトを変更する場合は、Unwrap メソッドを呼び出します。一方、Unwrap を呼び出して Excel オブジェクトを変更した後で、そのオブジェクトを再度使用するときに、現在のスレッドのロケール ID ではなくロケール ID 1033 を使用するように戻すことが必要になる場合もあります。現在のスレッドのロケール ID ではなくロケール ID 1033 を使用するように Excel オブジェクトを変更するには、Wrap メソッドを呼び出します。
Excel オブジェクト モデルがロックされている場合の out パラメータがあるメソッドの呼び出し
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);
参照