VBからExcel及びWordを操作する時の注意事項 |
1.当サンプルをご使用になる前に まず、プロジェクト→参照設定で Microsoft
Excel *.* ObjectLibrary にチェックを入れておいて下さい。 又、バージョンの異なるExcel を複数同じパソコンに導入している場合は、それぞれの共通と なるバージョンで設定しておくと、どのパソコンで使用できるようです。 例、開発環境(9.0 で参照設定) 実行環境(Excel2000/Excel2002/Excel2007) でExcel 2007 が立上がり問題なく動作します。(但し、ご自分の環境で確認して下さい。プログラム内容にもよる) ※ Excel 2007 での動作は、Excel のシート・ブック類は旧のバージョンで作成したものを 使用すれば、互換モードで動作するので、大抵の場合 Excel 2007 上でも動作します。 但し、Excel 2007 で作成したブック等を使用した場合は動作の確認は行っておりません。 2.通常、事前バインディング(アーリーバインディング)の変数を使うオブジェクトの参照の方が、 実行時バインディング(レイトバインディング)の変数を使うオブジェクトの参照よりも処理が 高速になります。従って、ここでは事前バインディングの変数を使っています。 詳しくはヘルプの「オブジェクトの参照の高速化」を参照してください。(但し、Excel を起動→書 き込み→終了→解放という操作を繰り返した場合、実行時バインディングの変数を使う方が 遥かに早く操作できました。) 又、コーディング段階で、オブジェクトで使われているプロパティやメソッドの構文がチェックさ れて、誤りがあるとエラーが表示されます。(自動メンバー表示などのインテリセンス機能) Dim xlApp As Object '実行時バインディングの変数 Dim xlApp As Excel.Application '事前バインディングの変数 3.サンプル等を試される場合途中でエラー等が発生するとExcel が終了しないで残ったままにな ってしまいます。何度も繰り返すとメモリ不足になり、フリーズしたりします。 (Ctrl + Alt + Delete キーで Excel が残っていないか確認し残っていれば終了するかパソコンを 再起動して下さい。) 4.上記の状況がいつ起きるかも知れません、従ってプログラムは保存処理を都度行っておくよう にして下さい。 5.下記のように省略系や間違った使い方をすると オブジェクトを解放後もメモリ上に残ってしま います。(以下私の失敗例) 誤り Application.CentimetersToPoints 正解 xlApp.CentimetersToPoints 誤り ActiveSheet 正解 xlApp.ActiveSheet 誤り ActiveCell 正解 xlApp.ActiveCell 誤り Key1:=Range("C2") 正解 Key1:=xlSheet.Range("C2") 誤り xlSheet.Range(Cells(1, 1), 正解 xlSheet.Range(xlSheet.Cells(1, 1) 掲示板での質問も多いので下記にまとめてみましたので、詳しくは Excel のタスクを正常に終了できない現象 を見て下さい マクロ等を記録したのをコピーすると中にはこのように Key1:=Range("C2") Range が省略形で書かれています。この場合も残ったままになります。(正しくはKey1:=xlSheet.Range("B2")となります) 上記いづれの場合も参照はされるし、エラー表示もないし、動作も問題ないようですがオブジェクトを解放後もメモリ上に残ってしまいます。 又、GetObjectで開いた場合、EXCELを非表示のまま書き込みしてから、表示させて手動で閉じると エラーになりました。回避するにはGetObject後すぐにVisibleをTrueに する事でした。(掲示板の書き込みより 詳しくは 過去のログ、エクセルの終了を手動で行う場合(01/5/17)を見て下さい。 テスト後は Ctrl + Alt + Delete キーで Excel が残っていないか確認しながら進めていかれる事をお薦めします。後で気が付いてもどこが問題か見つけにくくなります。 6.各サンプルはエラー処理がしておりません、実際使われる場合使用状況に応じたエラー処理 をして下さい。 7.これらのサンプルはVB5.0(SP3) Win98SE Excel2000/VB6.0(SP5)Win XP Excel2000 の環境の元でテストをしておりますが、状況・使い方によっては不具合が発生するかも知れま せん。 ご使用にあたってはこれらを十分注意され各自の責任の元でお使い下さい。 8.文中(サンプル中)の[xlApp][xlBook][xlSheet]は下記のようにオブジェクトへの参照を変数 代入したものです。 Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) 9.私も今回勉強がてら作成したもので勉強不足のため間違っている部分があるかも知れません 間違っている部分やもっと便利な使い方等ありましたご指導願います ここにUPしているサンプル以外で解らない場合、まず,Excel上でマクロを取って見て下さい。 そのマクロを参考にコードを書いて見ると結構それで解決する場合があります。それでも 問題が解決されない場合や解らない場合は、掲示板の方に質問して見て下さい。 |
|
その他調べた結果解かった事。 New キーワードを使ったオブジェクト参照の代入 ActiveX コンポーネントがタイプライブラリを提供している場合は、変数宣言またはSet ステートメントで New キーワードを使って新しくオブジェクトを作成し、オブジェクト変数にオブジェクトの参照を代入することができます。 CreateObject 関数を使ったオブジェクト参照の代入 ActiveX コンポーネントがタイプライブラリを提供しているかどうかに関係なく、Set ステートメントで CreateObject 関数を使うと、新規オブジェクトを作成し、そのオブジェクトへの参照をオブジェクト変数に代入できます。 Wordの宛て名ラベル等の差し込み印刷機能はその設定自体がマクロで作成されているそうです。マクロを取って他から操作しようとしてもうまく動きません。動かすにはテンプレート化しないとだめなようで環境に左右されるようです。従って今回、私の場合あのような設定になりました。 |
2002/04/19