Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年05月14日] [更新 2020年09月06日] Delphi サンプルプログラム集
590_ADO でエクセルに接続
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2007
590_ADO_Excel.zip [3,385 KB] 2013年03月01日版 (EXE 同梱)



  • 2010年05月23日
  • テーブル一覧表示ではなく単なる接続のサンプルに変更
  • 2013年03月01日
  • Windows 7 U64(SP1) + Delphi XE Pro で動作確認
  • Extended Properties の余分な(説明用)コードを削除
  • 今回の動作確認環境では,データの編集が可能なので,TDBGrid も編集可能にした
  • サンプル [04] を追加
  • 2020年09月06日
  • TADODataSet を使用するサンプルを追加




ADO でエクセルに接続


ADO でエクセルに接続する例です.エクセルはブックがデータベース,シートがテーブル (表) ということになります.
エクセルやテキストファイルは本来 Priamry Key (一次キー) の概念がないので,更新 (レコードの追加・削除) 機能は使用できないはずなのですが,2013年03月01日版の動作確認環境では可能となっているようです.そこで,前のバージョンにあった,編集を不可にするコードを削除し,ページのタイトルから「読み出し専用」文字も削除しました.
ただし,レコードの削除はできないようです.


以下は,サンプルプログラム集の ADO 関係の記事へのリンクです.


[備考]
エクセルは,セルのデータを排他的に読み込んで表示します.既にエクセルで表示しているブックを更にエクセルで表示すると,読み出し専用で読み込むことになります.
したがって,エクセルで表示しているブックのデータを ADO で接続した場合は,読み出し専用となります.データの変更はできまぜん.





01_エクセルに接続 ( TADOTable )


TADOTable コンポーネントだけを使用してエクセルに接続する例です.
このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のブックは扱えません.


図1
設計時画面
図2
Button1 クリック
  • Sheet2 のデータが表示される
図3
Button2 クリック
  • シートの第 1 行目もデータとして表示する
  • 項目名は F1, F2, ... となる
図4
Button3 クリック
  • 指定セル範囲のデータだけを表示

リスト1
エクセルに TADOTable で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はテーブルもClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOTable1.Close;
end;

//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//  対象シートの第1行目を項目名とする場合
//
//  オブジェクト・インスペクタで以下を設定
//  DataSource1.DataSet := ADOTable1;
//  DBGrid1.DataSource  := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xls;';
  StrExtended := 'Extended Properties=Excel 8.0;';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider + StrDBFile + StrExtended;

  ADOTable1.TableName := '[Sheet2$]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//
//  対象シートの第1行目もデータとして表示する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xls;';

  //Extended PropertiesにHDR=NOを追加してシートの第1行目もデータとする
  //ファイル名に空白がある時と同じように"で括ることに注意
  StrExtended  := 'Extended Properties="Excel 8.0;HDR=NO"';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider +
                                StrDBFile +
                                StrExtended;

  ADOTable1.TableName := '[Sheet2$]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  指定のブックのシーの指定範囲だけをデータベースの表としてDBGridに表示
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xls;';

  //全てデータなのでExtended PropertiesにHDR=NOを追加
  //ファイル名に空白がある時と同じように"で括ることに注意
  StrExtended := 'Extended Properties="Excel 8.0;HDR=NO"';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider +
                                StrDBFile +
                                StrExtended;

  //指定のセル範囲を表として表示(セル範囲の名前も使用可能)
  ADOTable1.TableName := '[Sheet2$A15:D24]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  データの編集
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
begin
  if ADOTable1.Active = False then exit;

  ADOTable1.First;
  ADOTable1.Edit;
  ADOTable1.Fields[0].Value := 'いも類';
  ADOTable1.Post;
end;

end.




02_エクセルに接続 ( TADOQuery )


TADOQuery コンポーネントだけを使用してエクセルに接続する例です.
このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のブックは扱えません.


図5
設計時画面
図6
Button1 クリック
  • Sheet2 のデータが表示される
図7
Button2 クリック
  • [食品群] の [野菜類] だけ表示
図8
Button3 クリック
  • [キロカロリ] の指定範囲だけ表示

リスト2
エクセルに TADOQuery で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ADOQuery1: TADOQuery;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOQuery1.Close;
end;

//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//  対象シートの第1行目は項目名となる
//
//  オブジェクト・インスペクタで以下を設定
//  DataSource1.DataSet := ADOQuery1;
//  DBGrid1.DataSource  := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
begin
  ADOQuery1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xls;';
  StrExtended := 'Extended Properties=Excel 8.0;';

  //接続文字列
  ADOQuery1.ConnectionString := StrProvider + StrDBFile + StrExtended;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.Open;

  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

//=============================================================================
//  選択クエリーの例 1
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  if ADOQuery1.Active = False then Exit;

  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.SQL.Add ('WHERE 食品群=:Param1 ');

  ADOQuery1.Parameters.ParamByName('Param1').Value := '野菜類';
  ADOQuery1.Open;

  ADOQuery1.EnableControls;
  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

//=============================================================================
//  選択クエリーの例 2
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  if ADOQuery1.Active = False then Exit;

  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.SQL.Add ('WHERE キロカロリ>=:Param1 AND キロカロリ<=:Param2 ');
  ADOQuery1.SQL.Add ('ORDER BY キロカロリ ');

  ADOQuery1.Parameters.ParamByName('Param1').Value := 300;
  ADOQuery1.Parameters.ParamByName('Param2').Value := 500;
  ADOQuery1.Open;

  ADOQuery1.EnableControls;
  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

end.




03_エクセルに接続 ( TADOConnection + TADOQuery )


TADOConnection と TADOQuery コンポーネントを使用してエクセルに接続します.
TADOConnection を使用すると,詳細な設定やトランザクション等の制御が可能となります.実行結果は前のサンプルと同じです.

このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のックは扱えません.


図9
設計時画面

リスト3
エクセルに TADOConnection と TADOQuery で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DataSource1: TDataSource;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを生成したらTADOConnection接続の設定
//
//  オブジェクト・インスペクタで以下を設定
//  ADOConnection1.LoginPrompt := False;
//  ADOQuery1.Connection       := ADOConnection1;
//  DataSource1.DataSet        := ADOQuery1;
//  DBGrid1.DataSource         := DataSource1;
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  StrDBFile   : String;
  StrExtended : String;
begin
  ADOConnection1.Connected := False;

  //プロバイダ
  ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xls;';
  StrExtended := 'Extended Properties="Excel 8.0";';

  //接続文字列
  ADOConnection1.ConnectionString := StrDBFile + StrExtended;
end;

//=============================================================================
//  フォームを閉じる時はデータベースも切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOConnection1.Connected := False;
end;
//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//  対象シートの第1行目は項目名となる
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.Open;

  ADOQuery1.EnableControls;

  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

//=============================================================================
//  選択クエリーの例 1
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.SQL.Add ('WHERE 食品群=:Param1 ');

  ADOQuery1.Parameters.ParamByName('Param1').Value := '野菜類';
  ADOQuery1.Open;

  ADOQuery1.EnableControls;

  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

//=============================================================================
//  選択クエリーの例 2
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
  ADOQuery1.SQL.Add ('WHERE キロカロリ>=:Param1 AND キロカロリ<=:Param2 ');
  ADOQuery1.SQL.Add ('ORDER BY キロカロリ ');

  ADOQuery1.Parameters.ParamByName('Param1').Value := 300;
  ADOQuery1.Parameters.ParamByName('Param2').Value := 500;
  ADOQuery1.Open;

  ADOQuery1.EnableControls;

  //各項目の表示幅を設定
  DBGrid1.Columns[0].Width := 70;
  DBGrid1.Columns[1].Width := 30;
  DBGrid1.Columns[2].Width := 70;
  DBGrid1.Columns[3].Width := 60;
end;

end.




04_Microsoft Access データベース エンジン 2010 を使用した接続


次のマイクロソフトのサイトからダウンロードして,Microsoft Access データベース エンジン 2010 をインストールすると,xls, xlsx どちらの形式のブックにも接続できます.
これは,Windows XP(SP3) 以上で使用可能です.
AccessDatabaseEngine.exe は 32 ビット版の,AccessDatabaseEngine_X64.exe は 64 ビット版の Microsoft Office 用です.Windows のビットバージョンではありません.
Microsoft Office のビットバージョンは,下図のように [ファイル] の [ヘルプ] 項目で確認することができます.


図10
Excel 2010 のビットバージョンの確認方法

Microsoft Access データベース エンジン 2010 を使用してエクセルに接続する場合は,これまでのサンプルコードを以下のように変更します.
この Excel 12.0 または Excel 14.0 というのは,システムにインストールされているエクセルのバージョンではなく,現在アクティブなバージョンで指定します.筆者が確認した限りでは,低いバージョン番号の指定であれば,動作するようですが,機能的に問題が発生するかは確認していません.


  Microsoft.Jet.OLEDB.4.0 を Microsoft.ACE.OLEDB.12.0Excel 2007 の場合は Excel 8.0 の部分を Excel 12.0Excel 2010 の場合は Excel 8.0 の部分を Excel 14.0


本サンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xlsx という名前のブックを使用してます.設計時の画面も,実行結果も最初のサンプルと同じです.



[備考 1]
Microsoft Access データベース エンジン 2010 がシステムにインストールされていない環境でこのサンプルを実行すると,下図のように,
      「インストール可能な ISAM ドライバが見つかりませんでした。」
というエラーが発生します.このエラーは,接続文字列の 'Excel 12.0' とか 'Excel 14.0' の部分が適切でない場合にも発生します.


[備考 2]
以下の記事で,Access 2007 用の JET についての説明とサンプルコードを掲載していますが,接続文字列が Access 2007 の JET と Access 2010 の JET とでは違います.注意が必要です.
Access 2010 用の JET であれば,上記の説明のように,Excel 2007 も扱えます.



図11
ISAM 関係のエラー

リスト4
Microsoft Access データベース エンジン 2010 を使用したエクセルのブックへの接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はテーブルもClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOTable1.Close;
end;

//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//  対象シートの第1行目を項目名とする場合
//
//  オブジェクト・インスペクタで以下を設定
//  DataSource1.DataSet := ADOTable1;
//  DBGrid1.DataSource  := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xlsx;';
  StrExtended := 'Extended Properties=Excel 12.0;';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider + StrDBFile + StrExtended;

  ADOTable1.TableName := '[Sheet2$]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  指定のブックのシートをデータベースの表としてDBGridに表示
//
//  対象シートの第1行目もデータとして表示する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xlsx;';

  //Extended PropertiesにHDR=NOを追加してシートの第1行目もデータとする
  //ファイル名に空白がある時と同じように"で括ることに注意
  StrExtended  := 'Extended Properties="Excel 12.0;HDR=NO"';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider +
                                StrDBFile +
                                StrExtended;

  ADOTable1.TableName := '[Sheet2$]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  指定のブックのシーの指定範囲だけをデータベースの表としてDBGridに表示
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
  StrSource    : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';

  //データベース(エクセルの場合はブック)の場所
  StrDBFile   := 'Data Source=../Data/ADOTestBook.xlsx;';

  //全てデータなのでExtended PropertiesにHDR=NOを追加
  //ファイル名に空白がある時と同じように"で括ることに注意
  StrExtended := 'Extended Properties="Excel 12.0;HDR=NO"';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider +
                                StrDBFile +
                                StrExtended;

  //指定のセル範囲を表として表示(セル範囲の名前も使用可能)
  ADOTable1.TableName := '[Sheet2$A15:D24]';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  //エクセルの場合はスキーマ定義ファイルは利用できない
  //この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
  ADOTable1.Fields[0].DisplayWidth := 10;
  ADOTable1.Fields[1].DisplayWidth := 5;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

//=============================================================================
//  データの編集
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
begin
  if ADOTable1.Active = False then exit;

  ADOTable1.First;
  ADOTable1.Edit;
  ADOTable1.Fields[0].Value := 'いも類';
  ADOTable1.Post;
end;

end.




05_TADODataSet を使用してエクセルに接続


TADODataSet を使用してエクセルに接続するサンプルです.
TADODataSet.CommandType のデフォルト値は cmdText です.この時は TADODataSet.CommandText には SQL 文を指定します.これは,前述の TADOQuery を使用したサンプルに相当します.
TADODataSet.CommandType の値を cmdTable にすると,TADODataSet.CommandText にテーブル名が指定できます.エクセルの場合は,テーブル名はシート名です.これは前述の TADOTable を使用したサンプルに相当します.

このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のックは扱えません.
このサンプルは ZIP 書庫に添付していません.



図12
設計時画面
図13
実行画面
  • Button1 クリックでも Button2 クリックでも結果は同じ

リスト5
TADODataSet を使用してエクセルに接続
//=============================================================================
//  フォームを閉じる時はデータセットを閉じる
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADODataSet1.Close;
end;

//=============================================================================
//  TADODataSet を使用したエクセルへの接続
//  TADODataSet.CommandText に SQL 文を指定する例
//
//  オブジェクト・インスペクタで以下の設定にしている
//  DBGrid1.DataSource を DataSource1 に
//  DataSource1,DataSet を ADODataSet1 に
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LProvider  : string;
  LDBFile    : string;
  LExtended  : string;
begin
  ADODataSet1.Close;

  ADODataSet1.CommandText := 'SELECT * FROM [Sheet2$] ';

  // プロバイダ
  LProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  // データベース(エクセルの場合はブック)の場所
  LDBFile   := 'Data Source=../Data/ADOTestBook.xls;';
  LExtended := 'Extended Properties=Excel 8.0;';

  // 接続文字列
  ADODataSet1.ConnectionString := LProvider + LDBFile + LExtended;

  ADODataSet1.Open;


  // 各項目の表示幅を設定
  // エクセルの場合はスキーマ定義ファイルは利用できない
  DBGrid1.Columns[0].Width := 50;
  DBGrid1.Columns[1].Width := 35;
  DBGrid1.Columns[2].Width := 100;
  DBGrid1.Columns[3].Width := 40;
end;

//=============================================================================
//  TADODataSet を使用したエクセルへの接続
//  TADODataSet.CommandText にテーブル名としてのシート名を指定する例
//
//  オブジェクト・インスペクタで以下の設定にしている
//  DBGrid1.DataSource を DataSource1 に
//  DataSource1,DataSet を ADODataSet1 に
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LProvider  : string;
  LDBFile    : string;
  LExtended  : string;
begin
  ADODataSet1.Close;

  // CommandType を cmdTable にすると CommandText にテーブル名が指定できる
  // CommandType のデフォルトは cmdText
  ADODataSet1.CommandType := cmdTable;
  ADODataSet1.CommandText := '[Sheet2$]';

  // プロバイダ
  LProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  // データベース(エクセルの場合はブック)の場所
  LDBFile   := 'Data Source=../Data/ADOTestBook.xls;';
  LExtended := 'Extended Properties=Excel 8.0;';

  // 接続文字列
  ADODataSet1.ConnectionString := LProvider + LDBFile + LExtended;

  ADODataSet1.Open;


  // 各項目の表示幅を設定
  // エクセルの場合はスキーマ定義ファイルは利用できない
  DBGrid1.Columns[0].Width := 50;
  DBGrid1.Columns[1].Width := 35;
  DBGrid1.Columns[2].Width := 100;
  DBGrid1.Columns[3].Width := 40;
end;