@Toshichan4

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

c# range.value で取得されたデータの型を調べる

Q&A

Closed

c# のプログラムで Excel ファイルに com でアクセスしています。
Range.value で取得したデータが C# の 数値型かどうかを
調べたいのですが、どのようにすればよいかご教示願います。

取得した Range.value のデータが
Int16,Int32,Int64,SByte,UInt16,UInt32,
UInt64,BigInteger,Decimal,Double,Single
の時に、true を返す関数を作成したいと考えています。

0 likes

1Answer

using System.Numerics;
// 引数がどんな型なのか分からないのでobject型とする
// is演算子を利用
bool IsNumber(object value) =>
    value is short   or
             int     or
             long    or
             sbyte   or
             byte    or
             ushort  or
             uint    or
             ulong   or
             decimal or
             double  or
             float   or
             BigInteger;

byte型がなかったので、追加しておきました(要らなければ消していいです)。いずれにしろ、is演算子を利用してください。

0Like

Comments

  1. @Toshichan4

    Questioner

    ご回答ありがとうございます。
    IsNumber は調べたのですが、VB での使用例はあるものの
    C# での利用方法がわかりませんでした。
    Excel の A1 セルに 数値として 123 を、
    A2 セルに 文字列として '123 を入力して

    Console.WriteLine("Sheet1 Range(\"A1\") の value = {0}", obj_XL.xlSheet.Range["A1"].Value);
    Console.WriteLine("Sheet1 Range(\"A1\") の valueType = {0}", obj_XL.xlSheet.Range["A1"].Value.GetType());
    
    Console.WriteLine("Sheet1 Range(\"A2\") の value = {0}", obj_XL.xlSheet.Range["A2"].Value);
    Console.WriteLine("Sheet1 Range(\"A2\") の valueType = {0}", obj_XL.xlSheet.Range["A2"].Value.GetType());
    

    とすると、

    Sheet1 Range("A1") の value = 123
    Sheet1 Range("A1") の valueType = System.Double
    Sheet1 Range("A2") の value = 123
    Sheet1 Range("A2") の valueType = System.String
    

    と出力されるので、

    bool IsNumber(object value)
    {
    	if (value.GetType == System.Double) return true;
    	else return false;
    }
    

    的な処理をしたいと思うのですが、
    'double' は 種類 です。これは特定のコンテンツでは無効になります
    とコンパイラ にはねられて、どのように修正すればよいのかわかりません。

    あと、もう一つ分からないのは、Excelでセルに入力した数値の型はすべて
    System.Double なのかどうかです。入力の仕方によって違う型となる可能性が
    あるのなら、それらをすべて true となる条件に入れたいと考えています。

  2. typeofを使えばよいです。

    // object型にはGetTypeプロパティがないので適切な型にしたほうがよさそう
    bool IsNumber(object value) => value.GetType == typeof(double);    // value is doubleでも良い
    

    あと、もう一つ分からないのは、Excelでセルに入力した数値の型はすべて
    System.Double なのかどうかです。入力の仕方によって違う型となる可能性が
    あるのなら、それらをすべて true となる条件に入れたいと考えています。

    多分あるのではないでしょうか。標準がDoubleというだけで。

  3. @Toshichan4

    Questioner

    コメントをいただき無事型の判定ができました。
    ありがとうございます。

    Excel で使用される型についてはよくわからないので、とりあえず
    C#で 数値を表す型をならべて

    		 bool IsNumber(object value)
    		{
    			if ( (value.GetType() == typeof(System.Double) )
    					|| (value.GetType() == typeof(System.Single) )
    					|| (value.GetType() == typeof(System.Decimal) )
    					|| (value.GetType() == typeof(System.UInt64) ) 
    					|| (value.GetType() == typeof(System.UInt32) )
    					|| (value.GetType() == typeof(System.UInt16) )
    					|| (value.GetType() == typeof(System.SByte) )
    					|| (value.GetType() == typeof(System.Int64) )
    					|| (value.GetType() == typeof(System.Int32) )
    					|| (value.GetType() == typeof(System.Int16) )
    					|| (value.GetType() == typeof(System.Byte) )
    				) return true;
    			else return false;
    		}
    
    

    としました。

    なお、
    https://learn.microsoft.com/ja-jp/office/client-developer/excel/data-types-used-by-excel
    には

    ANSI C /C++ 形式
    [数値]
    すべてのバージョンの Excel:
    8 バイト倍精度浮動小数点型
    [signed] short [int] – Boolean の値および整数に用いられます
    unsigned short [int]
    [signed long] int

    [文字列]
    すべてのバージョンの Excel:
    [signed] char * – 最大 255 文字のヌル終端文字列
    [signed] char * – 最大 255 文字の length-counted 文字列

    Excel 2007 以降:
    unsigned short * – 最大 32,767 文字の Unicode 文字列で、ヌル終端文字列または length-counted 文字列のいずれかの形式

    とありましたので
    System.Double, System.Int32, System.UInt32, System.Int64
    だけでよいのかも知れません。

Your answer might help someone💌