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.