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 |
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 のヘルプに相当する
|
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 のショートカットから起動
- 起動するのはヘルプ全体
- 初期状態では,目次も何もない空白状態
- 図は,目次を表示して
- [開発者リファレンス] にしたところ
|
エクセルの場合は,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 設定結果 |
以下は 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.
|