Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年03月19日] [更新 2019年08月20日]* Delphi 一般・その他
Microsoft Office 2007 - 2010 の VBA ヘルプ
動作確認等 Windows XP(SP3) + Office 2007
Windows 7 U64(SP1) + Office 2007, 2010
[整理番号 - 0100]







01_Microsoft Office 2007 - 2010 の VBA ヘルプ


Delphi でワードやエクセルを操作するプログラムを開発する際、ワードやエクセルのヘルプ、特に、VBA (Visual Basic for Application) のヘルプはかかせません。Office 2003 までは、この VBA のヘルプは単独で起動できましたが、Office 2007 以降では、VBA ヘルプファイルというのはありません。

例えば、ワード 2007 の VBA のヘルプは、ワードのヘルプを [F1] で表示した後、下図のように、[検索] のリストから [開発者リファレンス] を選択することになります。

以下の説明は、このヘルプを単独で起動する方法です。Office 2007 からはヘルプの形式が変更となり、CLVIEW.EXE というソフトを起動オプションをつけてヘルプを起動します。初期の CLVIEW.EXE では起動オプションによって、[開発者リファレンス] を起動できましたが、現在はできないようです。単にワード等のヘルプを表示するだけになっているようです。
説明は Office 2007 の場合ですが、Office 2010 も同じように設定できます。


[備考]
CLVIEW.EXE の起動オプションで [開発者リファレンス] を起動できないと書いていますが、引数の指定方法が変わっているようです。以下の記事の説明で起動できることを確認しました。


図1
ワードのヘルプを表示
  • ワード 2007 を起動
  • [F1] を押下してヘルプを表示
  • [検索] リストから[開発者リファレンス]
  • [Word 2007 開発者リファレンス] 等がVBA のヘルプに相当する





02_ワード  2007 のヘルプを単独で表示


CLVIEW.EXE は、Office のインストール先のフォルダ直下にあります。
この CLVIEW.EXE のショートカットを作成し、リンク先に起動オプションを追加します。起動オプションに追加する文字列は、実際にワードを起動してヘルプを表示した後、タスク・マネージャーで調べることができます。

64 ビット版の Windows 7 の場合、64 ビット版の Office 2010 のインストール先は [Program Files] ですが、32 ビット版の Office 2010 のインストール先は [Program Files (x86)] です。


図2
CLVIEW.EXE の場所
  • Office のインストール先フォルダ直下
  • [Office12] は Office 2007 のフォルダ
図3
ショートカットのプロパティ設定
  • CLVIEW.EXE のショートカットを作成
  • [プロパティ] ダイアログを表示
  • 追加するのは、
    "WINWORD" "Microsoft Office Word"
図4
ヘルプを起動
  • CLVIEWE.EXE のショートカットから起動
  • 起動するのはヘルプ全体
  • 初期状態では、目次も何もない空白状態
  • 図は、目次を表示して
  • [開発者リファレンス] にしたところ




03_エクセル 2007 のヘルプを単独で表示


エクセルの場合は、CLVIEW.EXE の起動オプションを変更するだけです。
Office 2007 以降の VBA のヘルプは、以前と比べてかなり使いやすくなっています。また内容も充実してきているようです。Excel のヘルプでは、罫線の種類の定数値の説明もあります。いままでなかったのが不思議なのですが。


図5
ショートカットのプロパティ設定
  • CLVIEW.EXE のショートカットを作成
  • [プロパティ] ダイアログを表示
  • 追加するのは、
    "EXCEL" "Microsoft Office Excel"
図6
VBA のヘルプの使用例
  • [罫線] で検索して、[XlLineStyle]
  • 罫線の定数値一覧が表示される
図7
Windows XP で Excel2007 のヘルプ




04_マクロを利用するには [ 開発 ] タブを表示する


Delphi でワードやエクセルを操作するコードは、ワードやエクセルのマクロを作成して、それを参考にすることがあります。
そのために、以下の説明のように、ワードやエクセルに [開発] タブを表示して、Visual Basic やマクロを使用可能にしておくと便利です。図は Word 2007 の場合です。


図8
Word 2007 での設定
  • [Wordのオプション] [基本オプション]
  • [開発] タブをリボンに表示するをチェック
図9
Word 2010 での設定
  • [オプション] [リボンのユーザ設定]
  • [開発] にチェック
図10
Word 2007 設定結果




05_Office 開発者向けドキュメント


以下は Microsoft Office 関係の VBA のリファレンス記事へのリンクです。
2014年09月21日現在、機械翻訳を含めて、各オブジェクトや関数類の日本語のリファレンスがあるのは、Office 2013 関係の記事だけです。
2019年03月、MSDN にあった記事が Office Dev Center に統合されました。以下はそこへの記事へのリンクです。記事によっては機械翻訳の日本語で表示されますが、ページ右上の [英語で読む] の操作で英語表示とすることができます。
2019年08月20日の時点では、Office 2016 相当の VBA のリファレンスとなっているようです。





06_Google 検索エンジンで VBA のリファレンスを検索


検索エンジンで Microsoft Office 関係の VBA のリファレンス内のの記事を検索するには、site: を指定します。以下は、AddPicture を検索する例です。



// VBA のリファレンス内を検索
AddPicture site:https://docs.microsoft.com/ja-jp/office/vba/api/ [検索]




07_VBA のコードを Delphi のコードに変換する例


エクセルのシートに画像を挿入して表示する例です。
[Servers] タブの TExcelApplication コンポーネント類を使用する場合です。

Office 開発者向けドキュメントの Shapes オブジェクトのメソッドの一覧に AddPicture というメソッドがあります。AddPicture のメソッドのリンクをクリックすると、AddPicture のオンラインの記事が表示されます。そのページの [例] (記事の右上にリンクあり) のところに VBA のコード例が掲載されています。



リスト1
MSDN オンラインの記事に掲載されている AddPicture メソッドのコード例
Set myDocument = Worksheets(1) 
myDocument.Shapes.AddPicture _ 
    "c:\microsoft office\clipart\music.bmp", _ 
    True, True, 100, 100, 70, 70


AddPicture メソッドの記事で引数の型を確認すると、第 2, 3 番目の型は MsoTriState となっています。リンクが貼ってあるので確認できますが、Delphi のソースコードでも確認できます。プリフィックスが mso の定数は Excel2000.pas 等にあります。
これは列挙型ですから、そのうちの 1 つを使用します。


リスト2
Excel2000.pas 内の MsoTriState 列挙型 (Enum) の値
// Constants for enum MsoTriState
type
  MsoTriState = TOleEnum;
const
  msoTrue = $FFFFFFFF;
  msoFalse = $00000000;
  msoCTrue = $00000001;
  msoTriStateToggle = $FFFFFFFD;
  msoTriStateMixed = $FFFFFFFE;


Delphi でコードを書く時に、下図のように型を確認すると TOleEnum となっています。


図11
引数の型の確認
  • TOleEnum 型となっている
  • つまり、列挙型 (Enum)
  • 実際の型は MSDN やエクセルkのヘルプで確認

以上のことを考慮して、MSDN オンラインに掲載されている VBA のコードを Delphi のコードに変換したコードが以下です。その下の図が実際に実行した結果です。

任意のセルの位置に画像を挿入したい場合は、セルの Range オブジェクトの Left, Top の値を使用すればその位置に表示することができます。



リスト3
上の VBA のコードを Delphi のコードに変換した例
//=============================================================================
//  MSDNに掲載されているVBAのコードをDelphiのコードに変換
//
//  定数類の使用にはusesにOffic2000等が必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
   ExcelWorksheet1.Shapes.AddPicture(
         ExtractFilePath(Application.ExeName) + '501.bmp',
         msoTrue, msoTrue, 100, 100, 70, 70);
end;


[備考 1]
第 2, 3 番目の引数として、OleVariant 型で定義した変数を使う手もあります。その変数に True または Flase を代入すれば、後は Delphi が適当に処理してくれます。

[備考 2]
エクセル関係のオブジェクトを OleVariant 型で使用する場合は、第 2, 3 引数の値として、VBA のコードと同じ True, False を直接与えることができます。


図12
実行結果

以下は、今回のテストで使用したプログラムのフォームの設計時の画面と、全コードです。


図13
テスト用のプロジェクトの設計時の画面

リスト4
本項の記事を書くために使用したテストプログラムのコード
動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Excel 2010
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Excel2000, Office2000, OleServer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ExcelApplication1: TExcelApplication;
    ExcelWorkbook1: TExcelWorkbook;
    ExcelWorksheet1: TExcelWorksheet;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  フォームを閉じる時はエクセルの終了処理も実行
//  もし複数のブック,シートオブジェクトを生成している場合はそれらのClose
//  やDisconnect処理も必要
//  エクセルを閉じないでこのアプリを終了する場合でも、
//  各オブジェクトのDisconnectの実行は必要
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  LBookNo : Integer;
begin
  if Assigned(ExcelApplication1) then begin

    for LBookNo := ExcelApplication1.Workbooks.Count downto 1 do begin
      ExcelApplication1.Workbooks[LBookNo].Close(False, EmptyParam, False, 0);
      Application.ProcessMessages;
    end;

    if Assigned(ExcelWorkbook1) then begin
      ExcelWorkbook1.Disconnect;
    end;
    if Assigned(ExcelWorksheet1) then begin
      ExcelWorksheet1.Disconnect;
    end;

    ExcelApplication1.Disconnect;
    ExcelApplication1.Quit;
  end;
end;

//=============================================================================
//  エクセルを新規起動する
//  起動したら最初のシートをアクティブにする
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  //ブックを追加
  ExcelApplication1.Workbooks.Add(EmptyParam, 0);
  ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
  //最初のシートオブジェクトを取得してアクティブにする
  //シート番号ではなくシート名(文字列)でも指定可能
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _WorkSheet);
  ExcelWorksheet1.Activate;

  //終了時に保存確認ダイアログを表示しない
  ExcelApplication1.DisplayAlerts[0] := False;

  //表示
  ExcelApplication1.Visible[0] := True;
end;

//=============================================================================
//  MSDNに掲載されているVBAのコードをDelphiのコードに変換
//
//  定数類の使用にはusesにOffic2000等が必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
   ExcelWorksheet1.Shapes.AddPicture(
         ExtractFilePath(Application.ExeName) + '501.bmp',
         msoTrue, msoTrue, 100, 100, 70, 70);
end;

end.