方法 : リフレクションを使用して Excel 内のリテラル文字列を領域保護する

Office プロジェクトでは、プロジェクト内の文字列を英語 (米国) として書式設定した場合に、ロケールに依存するデータ文字列が Excel で正しく表示されます。 .NET Framework 3.5 を対象とする Office プロジェクトでは、Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute を false に設定することにより、この動作を変更できます。 ただし、この属性を変更した後で Excel にリテラル文字列を渡すと、スレッドの現在の LCID が自動的に使用され、データの書式が正しく設定されないことがあります。 詳細については、「さまざまな地域設定を使用した Excel のデータの書式設定」を参照してください。

対象: このトピックの情報は、Excel 2007 と Excel 2010 のドキュメント レベルのプロジェクトおよびアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

.NET Framework 3.5 を対象とする Office プロジェクトで Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute を false に設定した場合でも、リフレクションを使用して、Excel オブジェクトのプロパティおよびメソッドに対する特定の呼び出しで英語 (米国) のデータ形式 (ロケール ID 1033) を使用するように強制できます。 この方法を実行すると、プロパティやメソッドに渡される文字列に英語 (米国) の書式を使用できるため、すべてのロケールでコードが正しく動作するようになります。

次の例は、Excel のドキュメント レベル プロジェクトで NamedRange コントロールのプロパティを設定または取得する方法を示していますが、アプリケーション レベル プロジェクトの Excel オブジェクトにも同じ概念が適用されます。

リフレクションを使用して Excel の範囲内のプロパティを設定するには

  1. InvokeMember メソッドを使用して Excel オブジェクトのプロパティ値を設定するヘルパー メソッドを作成します。 パラメーターとして、Excel オブジェクト、プロパティ名、およびプロパティのパラメーターを含めます。 ヘルパー メソッドで、CultureInfo パラメーターを持つ InvokeMember オーバーロードを使用し、このパラメーターに英語 (米国) のロケール ID を渡します。

    Shared Function SetPropertyInternational( _
        ByVal target As Object, ByVal name As String, _
        ByVal ParamArray parameters() As Object) As Object
    
        Return target.GetType.InvokeMember(name, _
            Reflection.BindingFlags.Instance Or Reflection.BindingFlags.SetProperty, _
            Nothing, target, parameters, _
            System.Globalization.CultureInfo.GetCultureInfo(1033))
    End Function
    
    static object SetPropertyInternational(object target, string name, params object[] args)
    {
        return target.GetType().InvokeMember(name,
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty |
            System.Reflection.BindingFlags.Public,
            null, target, args, new
            System.Globalization.CultureInfo(1033));
    }
    
  2. セル A5 に NamedRange コントロールを作成し、NamedRange1 という名前を付けます。

    Dim NamedRange1 As Microsoft.Office.Tools.Excel.NamedRange = _
        Me.Controls.AddNamedRange(Me.Range("A5"), "NamedRange1")
    
    Microsoft.Office.Tools.Excel.NamedRange NamedRange1 =
        this.Controls.AddNamedRange(this.Range["A5", missing], "NamedRange1");
    
  3. NamedRange1 の Formula プロパティを直接設定する代わりに、SetPropertyInternational ヘルパー メソッドを呼び出し、NamedRange コントロールの基になる Range オブジェクト、プロパティ名、および値を渡します。

    注意

    NamedRange コントロールを直接渡すことはできません。 代わりに、InnerObject プロパティを使用して基になる Excel Range オブジェクトを取得し、このオブジェクトをメソッドに渡す必要があります。 詳細については、「ホスト項目およびホスト コントロールのプログラム上の制限事項」を参照してください。

    SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)")
    
    SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)");
    

リフレクションを使用して Excel の範囲内のプロパティ値を取得するには

  1. InvokeMember メソッドを使用して Excel オブジェクトのプロパティ値を取得するヘルパー関数を作成します。 ヘルパー メソッドには、オブジェクト、プロパティ名、およびプロパティのパラメーターが渡されます。

    Shared Function GetPropertyInternational( _
        ByVal target As Object, ByVal name As String, _
        ByVal ParamArray parameters() As Object) As Object
    
        Return target.GetType.InvokeMember(name, _
            Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetProperty, _
            Nothing, target, parameters, _
            System.Globalization.CultureInfo.GetCultureInfo(1033))
    End Function
    
    static object GetPropertyInternational(object target, string name, params object[] args)
    {
        return target.GetType().InvokeMember(name,
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty |
            System.Reflection.BindingFlags.Public,
            null, target, args, new 
            System.Globalization.CultureInfo(1033));
    }
    
  2. NamedRange およびプロパティ名を渡して GetPropertyInternational 関数を呼び出します。

    注意

    以下のコード例は、ワークシートに NamedRange1 という名前の NamedRange コントロールがあることを前提としています。

    Dim formula As String = CType( _
        GetPropertyInternational(NamedRange1.InnerObject, "Formula"), String)
    
    MessageBox.Show(formula)
    
    string formula = (string)
        GetPropertyInternational(NamedRange1.InnerObject, "Formula");
    
    MessageBox.Show(formula);
    

参照

処理手順

方法 : Office Multilingual User Interface を使用する

概念

型の動的な読み込みおよび使用

さまざまな地域設定を使用した Excel のデータの書式設定

Office ソリューションのグローバリゼーションとローカリゼーション

Office ソリューションのデザインと作成

その他の技術情報

Deploying Office Solutions