Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年05月24日] [更新 2013年11月12日] エクセル操作フォームEx
   
エクセル操作フォームEx
使用方法
動作確認等 図は Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成







継承したフォームを使用


使用方法は Delphi の TForm と同じです.基本的に,TplExcelFormEx を継承したフォームを作成して使用します.それをプロジェクトに追加して使用します.
リポジトリから継承フォームを作成する場合は,[コンポーネントの登録方法等] のページのリポジトリへの登録の記事を参考にしてください.
以下は基本的な使用方法のコードと実行結果の図です.


エクセル操作フォーム 図1
実行画面例
  • Windows 7 + Excel 2010
  • 表示するブックを指定していないので何も表示しない

リスト1
継承フォーム plExcelFormEx2 を表示.上の図はこのコードの実行結果の例
  procedure TForm1.Button1Click(Sender: TObject);
begin
  //エクセル操作フォームEx(の継承フォーム)を表示
  plExcelFormEx2.ShowModal;
end;


エクセル操作フォーム 図2
実行画面例
  • Windows 7 + Excel 2010

リスト2
起動前に表示するブック名を指定する例.上の図はこのコードの実行結果の例
procedure TForm1.Button2Click(Sender: TObject);
begin
  //表示するブックのフルパス
  plExcelFormEx2.xlfBookFullPath := ExpandFileName('.\テスト.xls');

  //エクセル操作フォーム(の継承フォーム)を表示
  plExcelFormEx2.Show;
end;


エクセル操作フォーム 図3
実行画面例
  • Windows 7 + Excel 2010
  • 数式バーを表示
  • グリッド線を表示
  • シートタブを表示
  • 行と列の番号を表示

リスト3
起動時に各種プロパティを設定する例.上の図はこのコードの実行結果の例
procedure TForm1.Button3Click(Sender: TObject);
begin
  //表示するブックのフルパス
  plExcelFormEx2.xlfBookFullPath := ExpandFileName('.\テスト.xls');

  //アクティブにするシートの指定
  plExcelFormEx2.xlfActiveSheetName := '第3四半期';

  //シート選択タブを表示
  plExcelFormEx2.xlfDisplayWorkBookTabs := True;

  //アクティブなセルの指定
  plExcelFormEx2.xlfActiveCell := 'C13';

  //行番号と列番号を表示
  plExcelFormEx2.xlfDisplayHeadings := True;

  //スクロール可能なエリアの設定
  plExcelFormEx2.xlfScrollArea  :='A1:F30';

  //右側のパネルを非表示にする
  plExcelFormEx2.PanelRight.Visible := False;

  //数式バーを表示
  plExcelFormEx2.xlfDisplayFormulaBar := True;

  //グリッドラインを表示
  plExcelFormEx2.xlfDisplayGridLines := True;

  //エクセル操作フォーム(の継承フォーム)を表示
  plExcelFormEx2.Show;
end;




コピーして使用


添付のテストプログラムの [超シンプルエクセル (メインフォームとして起動)] のフォーム関係ファイルをプロジェクトのフォルダにコピーして利用すると便利です
この場合,リポジトリに登録する必要はありません.plExcelEx.pas, plExcelEx.dfm がパスの通った場所にあれば使用可能です.




操作用ボタン類


以下のボタン類しかありません.


[印刷] [印刷] のダイアログを表示します.TPrintDialog を使用しています.
[プロパティ] は設定しても無効ですので使用不可となっています.
現在表示されているシートのみ印刷します.
[新規] 予備のボタンです.
このボタンのクリックイベントコードは 1 行もありません.
デフォルトでは非表示となっています 表示中の入力を全てクリアするとか,新規に帳票を開く等の利用を想定しています.
[開く]
TOpenDialog のダイアログを表示します.
表示中の文書が未保存の場合は,保存確認のダイアログを表示します.
ワークシートとグラフシート以外のシートが持つブックは開けません.
[上書き] 現在のブック名で上書き保存します.
[保存] [名前を付けて保存] に相当します.保存ダイアログを表示します.
[縮小] [拡大] [標準] 表示の倍率変更ボタンです.
[縮小] [拡大] は各々 10% づつ変化します.[標準] は 100% 相当です.
[ヘルプ] 予備です.
[情報] 予備です.
[閉じる] フォームを閉じます.
編集中のブックがあり,保存されていない場合は,閉じる前に保存確認のダイアログを表示します.




グラフシートの扱い


エクセル操作フォームEx で操作可能なのシートはワークシート (TExelWorkSheet) だけです.
グラフシート (TExcelChart) を扱いたい場合は,利用者がオブジェクトを生成して使用することになります.

ワークシートとグラフシートはブックの別のオブジェクトです.したがって,グラフシートが含まれるブックを開いて,グラフシートシートをアクティブにしても,それまでのアクティブなワークシートはそのままです (見えなくなるだけです).詳しくはエクセル VBA のヘルプで確認してください.


図4
Excel 2000 の VBA ヘルプより




埋め込みオブジェクトと印刷プレビュー


埋め込みオブジェクトを開いたり,印刷プレビュー画面を表示すると,エクセルのメニューやコマンドバーが表示されます.新たにブックを開くと,またエクセル操作フォームEx の状態となります.

Ver. 9.14 でエクセルの印刷プレビューを表示するメソッドを追加しましたが,印刷が目的の場合,エクセルの印刷プレビューはあまり正確とはいえません.設計段階で,クライアント側での使用を想定したプリンタでの結果を確認する作業も必要でしょう.




[ Alt ] + [ TAB ] によるウィンドウ切り換え


[Alt] + [TAB] で他のウィンドウに切り換える場合,エクセル本体に入力フォーカスがあると,キャプションバー (タイトルバー) のアクティデ・非アクティブ状態が正常に反映されません.




エクセルのプロセスを強制終了


エクセル操作フォームEx を利用したアプリケーションの開発では,エラーが発生した場合,エクセルが画面上に表示されず,タスクバーにも存在しない状態となり,エクセルのプロセスがメモリ上に残ってしまうことがあります.この状態でエクセル操作フォームExを起動すると「エラーが特定できません」などの表示が現れ,実行できななくなります.
添付の ExcelKill.exe を使用すると,このプロセスを強制終了することができますが,WindowsNT では機能しません.




エクセルは WYSIWYG ではない - 雑感


マイクロソフトのウインドウズ版エクセルは,WYSIWYG (ウィジウィグ)アプリケーションではありません.表示の正確さよりも速度を重視しています.画面上だけでは正確な印刷結果はわかりません.
セル範囲にテキストが収まらないとか,逆に余分な空白が発生したり,データを入力していないつもりの白紙のページを印刷してしまうこともあります.印刷プレビューである程度は確認できますが十分ではありません.
「プレビューでは見えているのに」というのは,よく聞く話です.この現象は,使用するフォント,OS,エクセルのバージョン等も影響します.このことに注意する必要があります.
もし,印刷そのものが目的であれば,他の手段を考えてもいいかも知れません.もちろん,データの表示や表計算の手段として,また,グラフィクス,チャートの機能は価値はあるでしょう.

エクセルで通常のビジネス文書類を作成している方もいます.エクセルを使用する理由として「高速だから」というのがあります.しかし,パソコンの操作もキーボードの操作もおぼつかない,連続したセル入力位置もマウスクリックで移動する人に言われては,返す言葉がありません.

2009年05月30日,とりあえず前作で掲載していた参考コード類の Excel 2007 への移行テストを完了しました.当初,TExcelApplication ではなく,ワード操作フォームEx も含めて思い切って OLEObject で構成することも考えたのですが,オブジェクトを明確に定義して使用する TExcelApplication によるコードに決めました.どちらがいいかは,結構判断に迷うところです.