Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年05月30日] [更新 2016年06月11日] エクセル操作フォームEx
   
エクセル操作フォームEx   参考コード類
セルへの入力値を判定
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







セルの入力値の型の判定とセル値の変数の型


コミュニティの場で,エクセルのセルに日付時刻型を入力したい,あるいは,セルの値が日付となっているが,日付として取得できない,という質問を見かけることがあります.

エクセルのセルの値に,日付型や時刻型というのはありません.単にセルの書式設定した時の表示の問題です.これは,エクセル少し操作してみれば理解することができます.
以下は,このことを実際に確認するための参考コード類です.
たとえプログラマーであっても,エクセルを操作するプログラムを作成するのであれば,ある程度はエクセルの操作についての知識が必要と言えます.本ページのサンプルコードを実際に操作してみると,Excel でなくても,Delphi で日付時刻型の変数を扱うのと,実はほとんど同じ操作だということが分かります.
ですが,折角書いた記事とサンプルですのが,引き続き掲載しておくことにします.


[備考 1]
本ページのサンプルコードは,そのほとんとがエクセルのセルの値の取得です.
セル値を Delphi の日付時刻型の変数の値として取得できます.したがって,セルに値を代入するには Delphi の日付時刻型の TDateTime, TDate, TTime 等の型の値を代入することになります.


[備0考 2]
画像,図形,OLE オブジェクト等を除けば,エクセルの「セルの値」には「文字列」と「数値」しかありません.コミュニティの場で質問に書かれている「日付の値」というのはありません.

Delphi では型を定義して変数を使用します.したがって「日付として取得」という表現は適切ではないと言えます.どんな「型」の「値」として取得できないかを明確にする必要があります.「日付として扱う」型としては,TDateTime 型や Double 型等があります.

エクセルに限らず,Delphi のコントロールを含めて,コンピュータの画面に表示されている「値」は全て文字列です.数値を「表示」するには,文字列に変換する必要があります.エクセルのセルへの表示と同じように,Delphi でも表示書式を設定して文字列に変換することができます.





セルへ入力した値が文字列か数値かを判定


セルの値が変更となった時のイベントを使用して,入力した値が文字列であるか,数値なのかを判定する例です.場合によっては VarIsEmpty 関数等を使用して,実際にセルに値が存在するかの判定も必要になるかも知れません.
なお,セルで表示可能なのは 1,024 文字までです.たとえ入力できても,超えた分は印刷されません.これはエクセルのバージョンによって異なります.


図1
実行例

リスト1
セルへの値が変更となった時のイベントを使用して,セルの入力の型を判定
  private
    { Private 宣言 }
    procedure CellValueChangeEvent(ARow,ACol: Integer; Value: OleVariant);
  public
    { Public 宣言 }
  end;

var
  plExcelFormEx1: TplExcelFormEx1;

implementation

uses Excel2000;

{$R *.dfm}

//=============================================================================
//  フォームを表示開始時の処理
//=============================================================================
procedure TplExcelFormEx1.FormShow(Sender: TObject);
begin
  //シートタブを表示する
  Self.xlfDisplayWorkBookTabs := True;
  //グリッドライン等を表示
  xlfDisplayGridLines := True;
  //行列番号を表示する
  xlfDisplayHeadings := True;

  //フォーム表示開始時に開くブック名
  Self.xlfBookFullPath := 'テスト.Xls';

  //イベントを定義
  OnCellValueChange := CellValueChangeEvent;

  //元のフォームのOnShowを実行
  inherited;
end;

//=============================================================================
//  フォームが閉じる時の処理
//=============================================================================
procedure TplExcelFormEx1.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  Self.xlfBookSaved := True;
  inherited;
end;

//=============================================================================
//  セルの値が変化した時のイベント
//  入力した値の型を判定してダイアログを表示
//=============================================================================
procedure TplExcelFormEx1.CellValueChangeEvent(ARow, ACol: Integer;
  Value: OleVariant);
var
  strText : String;
begin
  if (Value = Unassigned) then begin
    StrText := '空白です';
  end else
  if VarIsNumeric(Value) then begin
    StrText := '数値です';
  end else
  if VarIsStr(Value) then begin
    StrText := '文字列です';
  end else begin
    StrText := 'その他です';
  end;

  strText := '入力したのは ' + strText;
  MessageBox(Handle, PChar(strText), '入力情報', MB_ICONINFORMATION);
  xlfSetFocusExcel;
end;




セルの値を数値 ( 実数値 ) として取得


セルの値を Double 型の実数値として取得する例です.
図は,セル [B2] に 39500 という値がある場合です.このセルに書式は設定していません.エクセル起動時のデフォルトのままです.


図2
セルの値を実数値として取得

リスト2
セルの値を実数値の Double 型の値として取得
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := xlfExcelSheet.Range['B2', 'B2'].Value;

  if VarIsNumeric(V) then begin
    strText := FormatFloat('#,##0.000', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;


エクセルのセルの値でなくても,変数の値が同じであれば,結果は同じです.
次のコードを実行すると,結果は上のコードを実行した時と同じとなります.


procedure TForm1.Button1Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := 38500;

  if VarIsNumeric(V) then begin
    strText := FormatFloat('#,##0.000', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;




セルの値を日付時刻型の値として取得


セルの値を日付時刻型の値として取得する例です.
図は,セル [B2] に 39500 という値がある場合です.このセルに書式は設定していません.エクセル起動時のデフォルトのままです.
セルの値は上のサンプルと同じですが,日付時刻の値として取得できることが分かります.
Delphi の日付時間型は浮動小数点の Double 型です.したがって,セルの値を日付時刻型として処理するか,他の型の値として処理するかはプログラマの判断となります.

ただし,セルに書式が設定してある場合,その書式を考慮することが必要な場合もあります.セルの書式を取得するコードについては,この後のサンプルを参考にしてください.


図3
日付時刻の値として取得

リスト3
セルの値を日付時刻型の値として取得
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
var
  V       : TDateTime;
  strText : String;
begin
  V := xlfExcelSheet.Range['B2', 'B2'].Value;

  if not VarIsError(V) then begin
    strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;


エクセルのセルの値でなくても,変数の値が同じであれば,結果は同じです.
次のコードを実行すると,結果は上のコードを実行した時と同じとなります.
Delphi の TDateTime 型 は Double 型ですから StrToFloat 関数を使用して倍精度の実数値として取得できます.もちろん,変数を TDateTime 型にしても同じです.


図4
日付時刻の値として処理する例

procedure TForm1.Button1Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := StrToFloat(Edit1.Text);

  strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




セルの値を OleVariant 型で取得して日付時刻型に変換


同じくセルの値を日付時刻の値として取得する例です.まず OleVariant 型の変数で値を取得してから TDateTime 型に変換しています.


図5
日付時刻の値として取得

リスト4
セルの値を日付時刻型の値として取得
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  V       : OleVariant;
  strText : String;
begin
  V := xlfExcelSheet.Range['B2', 'B2'].Value;

  if not VarIsError(V) then begin
    strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', TDateTime(V));
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;


エクセルのセルの値でなくても,変数の値が同じであれば,結果は同じです.
次のコードを実行すると,結果は上のコードを実行した時と同じとなります.


procedure TForm1.Button1Click(Sender: TObject);
var
  V       : OleVariant;
  strText : String;
begin
  V := 39500;

  if not VarIsError(V) then begin
    strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', TDateTime(V));
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;




セルの値を文字列型として取得


セルの値を文字列として取得する例です.
図は,セル [B2] に 39500 という値がある場合です.このセルに書式は設定していません.エクセル起動時のデフォルトのままです.
セルの値は上のサンプルと同じですが,文字列として取得できることが分かります.したがって,セルの値を文字列として処理するか,他の型の値として処理するかはプログラマ側の判断となります.

ただし,セルに書式が設定してある場合,その書式を考慮することも必要な場合もあります.セルの書式を取得するコードについては,この後のサンプルを参考にしてください.


図6
セルの値を文字列として取得

リスト5
セルの値を文字列型として取得
procedure TplExcelFormEx1.Button4Click(Sender: TObject);
var
  V : String;
begin
  V := xlfExcelSheet.Range['B3', 'B3'].Value;
  MessageBox(Handle, PChar(V), '情報', MB_ICONINFORMATION);
end;


エクセルのセルの値でなくても,変数の値が同じであれば,結果は同じです.
次のコードを実行すると,結果は上のコードを実行した時と同じとなります.エクセルのセルの値はバリアント型です.そこで,値をバリアント型と仮定して,文字列に変換する操作をしています.


procedure TForm1.Button1Click(Sender: TObject);
var
  V : String;
begin
  V := VarToStr(39500);
  MessageBox(Handle, PChar(V), '情報', MB_ICONINFORMATION);
end;




セルの値を VarToStr 関数で文字列型として取得


同じくセルの値を文字列として取得する例です.
VartToStr 関数で文字列に変換しています.確実な方法です.


図7
セルの値を文字列として取得

リスト6
セルの値を文字列型として取得
procedure TplExcelFormEx1.Button5Click(Sender: TObject);
var
  V : String;
begin
  V := VarToStr(xlfExcelSheet.Range['B2', 'B2'].Value);
  MessageBox(Handle, PChar(V), '情報', MB_ICONINFORMATION);
end;




セルの値が同じで表示の書式が違う例


これまでのサンプルで,おおよその予想はついたとは思いますが,実際にセルに書式を設定して確認するためのサンプルです.
39500 という値を 3 つのセルに入力し,各々違う書式を設定します.その結果が下図です.


図8
セルの値は同じだが,表示書式が違う例

リスト7
3 つのセルに同じ値をセットして,異なる表示書式にする例
procedure TplExcelFormEx1.Button6Click(Sender: TObject);
var
  ARange : Txlf2000Range;
begin
  //浮動小数点として表示
  ARange := xlfExcelSheet.Range['B2', 'B2'];
  ARange.NumberFormatLocal := '#,##0.000';

  //日付時刻として表示
  //エクセルは標準では時刻の午前午後の表示はない
  //セルの書式設定の[ユーザ定義]のリストから日本語のロケールIDを指定)
  ARange := xlfExcelSheet.Range['B3', 'B3'];
  ARange.NumberFormatLocal := 'yyyy年mm月dd日(aaa) [$-411]AM/PM h時mm分';

  //文字列
  ARange := xlfExcelSheet.Range['B4', 'B4'];
  ARange.NumberFormatLocal := '@';
end;


セルの書式は次のようなコードで取得できます.
書式の設定の時と同じ Range オブジェクトの NumberFormatLocal プロパティを使用します.このプロパティは読み書き両用です.下図は,書式が設定していない標準のセルの場合です.


[備考]
エクセルのセルの書式の形式と,Delphi の Format 関数等で使用する書式の形式が必ずしも一致するとは限りません.
したがって,エクセルのセルに表示されている形式を,例えば TStringGrid のセルに,同じ形式の書式で表示できるとは限りません.



図9
指定セルの書式を調べる

リスト8
指定したセルの書式を調べる
procedure TplExcelFormEx1.Button10Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
begin
  ARange  := xlfExcelSheet.Range['B12', 'B12'];
  strText := ARange.NumberFormatLocal;
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




日付時刻書式のセルの値を日付時刻型として取得


セル [B3] には日付時刻として表示するように書式を設定しています.この値を TDateTime 型の値として取得します.
[B4] には書式が文字列のセルがあります.このセルの値も TDateTime 型の値として取得できます.結果は下図と同じとなります.


図10
TDateTime 型の値として取得して,書式を指定して表示

リスト9
セルの値をTDateTime 型の値として取得
procedure TplExcelFormEx1.Button7Click(Sender: TObject);
var
  V       : TDateTime;
  strText : String;
begin
  V := xlfExcelSheet.Range['B3', 'B3'].Value;

  if not VarIsError(V) then begin
    strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;


エクセルのセルの表示 2008年02月22日(金) 午前 12時00分 というのは書式表示です.Delphi で言えば,FormatDateTime 等で作成した値です.エクセルのセルにこの値が直接格納されているわけではありません.表示の際に変換しているだけです.データベースの値を TDBGrid 等に表示する際にも日付の書式を指定して表示することがあります.それと同じです.

Delphi の場合,Delphi が日付時刻型の書式として認識できる文字列は,TDateTime 型の値に変換できます.以下はそのコードと実行結果です.(金) という文字列が含まれると,日付時刻型の文字列と認識してくれないので,除外しています.



[備考]
文字列が TDateTime 型あるいは Double 型の数値として取得可能なのは,文字列が [地域と言語] の表示形式にしたがっている場合だけです.この形式は ShortDateFormat, LongDateFormat 等を使用して,対象アプリケーション内だけで有効な形式に設定することができます.



図11
文字列を TDateTime 型の値として取得して,書式を指定して表示

procedure TForm1.Button1Click(Sender: TObject);
var
  V       : TDateTime;
  strText : String;
begin
  V := VarToDateTime(Edit1.Text);

  strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;


Delphi の TDateTime 型の値は,Double 型です.したがって,次のように Double 型の数値としても取得できます.


図12
文字列を Double 型の値として取得し,書式を日付時刻形式にして表示

procedure TForm1.Button2Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := VarToDateTime(Edit1.Text);

  strText := FormatDateTime('yyyy年m月d日 ampm h時mm分', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




日付時刻書式のセルの値を実数値として取得


下図のセル [B2], [B3], [B3] には同じ値がセットされていますが,表示書式は違います.
セル [B3] には日付時刻として表示するように書式を設定しています.これらの値を Double 型の実数値として取得します.
[B4] には書式が文字列のセルがあります.このセルの値も Double 型の値として取得できます.結果は下図と同じとなります.


図13
セル [B3] の値を Double 型の値として取得
図14
セル [B2] の値を Double 型の値として取得

リスト10
セルの [B3] 値を Double 型の値として取得
procedure TplExcelFormEx1.Button8Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := xlfExcelSheet.Range['B3', 'B3'].Value;

  if VarIsNumeric(V) then begin
    strText := FormatFloat('#,##0.000', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;

リスト11
セル [B2] の値を Double 型の値として取得
procedure TplExcelFormEx1.Button8Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := xlfExcelSheet.Range['B2', 'B2'].Value;

  if VarIsNumeric(V) then begin
    strText := FormatFloat('#,##0.000', V);
    MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
  end;
end;


既に前項で動作確認していますが,Delphi の場合,Delphi が日付時刻型の書式として認識できる文字列は,倍精度実数の Double 型の値に変換できます.以下はそのコードと実行結果です.(金) という文字列が含まれると認識してくれないので除外しています.



[備考]
文字列が TDateTime 型あるいは Double 型の数値として取得可能なのは,文字列が [地域と言語] の表示形式にしたがっている場合だけです.この形式は ShortDateFormat, LongDateFormat 等を使用して,対象アプリケーション内だけで有効な形式に設定することができます.



図15
日付の文字列を Double 型の値として取得

procedure TForm1.Button3Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := VarToDateTime(Edit1.Text);

  strText := FormatFloat('#,##0.000', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;


エクセルのセル [B2] に表示されている 39,500.000 は,Double 型の数値として取得できることを確認しています.
下図のように,TEdit に表示されている 39,500.000 を Double 型の数値に変換しようとするとエラーとなります.これは,39,500.000 というカンマが含まれる文字列を数値として認識してくれないために発生します.
一方,エクセルのセル [B2] の 38,500.000 も文字列ですが,これは表示の書式の設定によってこの文字列が表示されています.このセルの値は 38500 です.セルの値を取得するコードを実行すれば,そのセルの値を取得することができます.



図16
39,500.000 を Double 型の値として取得

procedure TForm1.Button1Click(Sender: TObject);
var
  V       : Double;
  strText : String;
begin
  V := StrToFloat(Edit1.Text);

  strText := FormatFloat('#,##0.000', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




日付時刻書式のセルの値を文字列として取得 - 日付の入力


セル [B3] には日付時刻として表示するように書式を設定しています.この値を String 型の文字列として取得します.
この結果の図は,このセルに 2008/02/22 という文字列を入力すると,図のような日付時刻の形式で表示できることを意味しています.エクセルのセルに,文字列で日付や時刻を入力する場合にこの方法が利用できます.TDateTime 型の値であればそのままセルに代入できます.後はセルの書式を設定することになります.



[備考]
取得する文字列は,[地域と言語] の表示の設定によって異なります.



図17
セルの値を文字列として取得

リスト12
日付時刻として表示されているセルの値を String 型の値として取得
procedure TplExcelFormEx1.Button9Click(Sender: TObject);
var
  V : String;
begin
  V := xlfExcelSheet.Range['B3', 'B3'].Value;

  if not VarIsError(V) then begin
    MessageBox(Handle, PChar(V), '情報', MB_ICONINFORMATION);
  end;
end;


次のように,セル [B3] に '2013/12/10 19:25:30' を入力すると,下図のようになります.


図18
日付の入力

リスト13
書式が日付時刻のセルに日付の文字列を入力
procedure TplExcelFormEx1.Button12Click(Sender: TObject);
begin
  xlfExcelSheet.Range['B3', 'B3'].Value := '2013/12/10 19:25:30';
end;


セルに '2013/12/10 19:25:30' を入力すると,このセルの値を文字列として取得すると,入力した文字列と同じ文字列になります.
このような文字列も Delphi では TDateTime 型や Double 型の数値として取得できます.


[備考]
文字列が TDateTime 型あるいは Double 型の数値として取得可能なのは,文字列が [地域と言語] の表示形式にしたがっている場合だけです.この形式は ShortDateFormat, LongDateFormat 等を使用して,対象アプリケーション内だけで有効な形式に設定することができます.



図19
日付時刻形式の文字列を数値として取得

procedure TForm1.Button1Click(Sender: TObject);
var
  V       : TDateTime;
  strText : String;
begin
  V := StrToDateTime(Edit1.Text);

  strText := FormatDateTime('yyyy年m月d日 ampm h時mm分ss秒', V);
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




セルの表示を文字列として取得 - Text プロパティ


「セルの値」ではなく,セルの表示そのものを文字列として取得するには,Range オブジェクトの Text プロパティが使用できます.Text プロパティは読み出し専用のプロパティです.
セルの表示は,そのセルの書式設定にしたがって表示されます.その書式にしたがった表示を文字列として取得します.取得した値を (日付時刻型も含めて) 数値として扱うには工夫が必要となることがあります.



図20
セルの表示を文字列として取得
  • Range オブジェクトの Text プロパティを使用した結果

リスト14
セルの表示を文字列として取得
Range オブジェクトの Text プロパティを使用した例
procedure TplExcelFormEx1.Button13Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
begin
  ARange  := xlfExcelSheet.Range['B3', 'B3'];
  strText := ARange.Text;

  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




セルの表示を文字列として取得 - ワークシート関数の Text メソッド


ワークシート関数の Text メソッドを使用しても,セルの表示を文字列として取得できます.
その例です.セルの値を,そのセルに設定されている書式でフォーマットした文字列として取得します.結果は前項のサンプルと同じになります.Text メソッドを使用すると,セルの値を,任意の書式にフォーマットして取得することができます.


図21
セルの表示を文字列として取得
  • ワークシート関数の Text メソッドを使用した結果
  • 実行結果は前項のサンプルと同じ

リスト15
セルの表示を文字列として取得
ワークシート関数の Text メソッドを使用した例
procedure TplExcelFormEx1.Button14Click(Sender: TObject);
var
  AFunction : WorksheetFunction;
  AValue    : OleVariant;
  ARange    : Txlf2000Range;
  AFormat   : Widestring;
  strText   : String;
begin
  AFunction := xlfExcelApp.WorksheetFunction;

  ARange  := xlfExcelSheet.Range['B3', 'B3'];
  AFormat := ARange.NumberFormatLocal;
  strText := AFunction.Text(ARange, AFormat);

  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




論理値のセルの扱い


セルの「値」が論理式で定義した論理値の場合も,これまでと同じように論理値としての文字列.あるいは数値としてセルの値を取得できます.
次のサンプルでは,セル [C1] に論理式を設定しています.セル [A1] の値によって真偽が決まるようにしています.そのセル [C1] の値を取得して表示します.


図22
セル [A1] に 50 を超える値を入力
  • セル [C1] の論理値は True となる
  • True の数値は -1
図23
セル [A1] に 50 以下の値を入力
  • セル [C1] の論理値は False となる
  • False の数値は 0

リスト16
論理値のセルの値を文字列と数値で表示
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  LVStr   : string;
  LVFloat : Double;
  LText   : string;
begin
  xlfExcelSheet.Range['C1', 'C1'].Value := '=A1>50';

  LVStr   := xlfExcelSheet.Range['C1', 'C1'].Value;
  LVFloat := xlfExcelSheet.Range['C1', 'C1'].Value;

  LText := LVStr + sLineBreak + FloatToStr(LVFloat);
  MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);
end;


セルの「値」の型は,VarType 関数で調べることができます.


図24
セルの値の型が論理型かを調べる
  • セルの値は OleVariant 型で取得する
  • 論理型であったら,そのセルの論理式と値を取得して表示

リスト17
セル値の型を VarType で確認してその式と値を表示
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
var
  LRange : Txlf2000Range;
  LValue : OleVariant;
  LText  : string;
begin
  LRange := xlfExcelSheet.Range['C1', 'C1'];

  LRange.Value := '=A1>50';
  LValue := LRange.Value;

  if VarType(LValue) = varBoolean then begin
    LText :=  VarToStr(LRange.Formula) + sLineBreak + VarToStr(LValue);
    MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);
  end;
end;




セルの値の型を VarType 関数で調べる


エクセルの「セルの値」は基本的には,文字列と数値とそれ以外と言えます.
セルの書式を設定しても数値は数値ですが,VarType 関数を使用すると,どんな書式を設定したかをある程度調べることができます.ここまでのサンプルでも VarType 関数を使用していますが,テスト結果を掲載しておきます.


図25
書式の設定なしで,入力もない場合
図26
書式の設定なしで,文字列 ABC を入力した場合
図27
書式の設定なしで,100 を入力した場合
図28
書式の設定を [通貨] にした場合
図29
書式の設定を [日付] にした場合
  • 書式の設定が [時刻] の場合は varDouble
図30
セルが論理値の場合

リスト18
書式を設定したセルの値の型を VarType 関数で調査
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  LValue       : OleVariant;
  LVarType     : TVarType;
  LVarReal     : Word;
  LVarTypeText : string;
  LText        : string;
  LAddText     : string;
begin
  LValue := xlfExcelSheet.Range['A1', 'A1'].Value;

  LText := '';
  LVarType := VarType(LValue);
  if LVarType > varByRef then begin
    LVarReal := LVarType - varByRef;
    LAddText := ' + varByRef';
  end else
  if LVarType > varArray then begin
    LVarReal := LVarType - varArray;
    LAddText := ' + varArray';
  end else
  if LVarType > varTypeMask then begin
    LVarReal := LVarType - varTypeMask;
    LAddText := ' + varTypeMask';
  end else begin
    LVarReal := LVarType;
    LAddText := '';
  end;

  LVarTypeText := VarTypeAsText(LVarReal);
  case LVarReal of
    varEmpty:    LText := 'varEmpty (Unassigned)';
    varNull:     LText := 'varNull';
    varAny:      LText := 'varAny';
    varSmallInt: LText := 'varSmallInt';
    varInteger:  LText := 'varInteger';
    varSingle:   LText := 'varSingle';
    varDouble:   LText := 'varDouble';
    varCurrency: LText := 'varCurrency';
    varDate:     LText := 'varDate';
    varOleStr:   LText := 'varOleStr';
    varDispatch: LText := 'varDispatch';
    varError:    LText := 'varError';
    varBoolean:  LText := 'varBoolean';
    varVariant:  LText := 'varVariant';
    varUnknown:  LText := 'varUnknown';
    varShortInt: LText := 'varShortInt';
    varByte:     LText := 'varByte';
    varWord:     LText := 'varWord';
    varLongWord: LText := 'varLongWord';
    varInt64:    LText := 'varInt64';
    varUInt64:   LText := 'varUInt64';
    varStrArg:   LText := 'varStrArg';
    varString:   LText := 'varString';
    varArray:    LText := 'varArray';
    varByRef:    LText := 'varByRef';
    varUString:  LText := 'varUString';
    varTypeMask: LText := 'varTypeMask';
  end;

  LText := LVarTypeText + sLineBreak + LText;
  LText := LText + LAddText + sLineBreak + IntToStr(LVarType);
  MessageBox(Handle, PChar(LText), '結果', MB_OK);
end;