14/10/2006 | jiangws2002 ①.VBからExcel及びWordを操作する時の注意事項 1.当サンプルをご使用になる前に まず、プロジェクト→参照設定で Microsoft Excel *.* ObjectLibrary にチェックを入れておいて下さい。 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の宛て名ラベル等の差し込み印刷機能はその設定自体がマクロで作成されているそうです。マクロを取って他から操作しようとしてもうまく動きませ ん。動かすにはテンプレート化しないとだめなようで環境に左右されるようです。従って今回、私の場合あのような設定になりました。 ②サンプル–VBからエクセルを操作する(その1) 新規にシートを開きデーターを書き込み計算してシートを保存します。 (011) まず、VBからExcel及びWordを操作する時の注意事項を見て下さい Option Explicit ‘SampleNo=011 WindowsXP VB6.0(SP5) Excel2000 2002.04.19 Private Sub Command1_Click() ‘★プロジェクト→参照設定でMicrosoft Excel *.* ObjectLibraryに ‘ チェックを入れておいて下さい。 On Error Resume Next ‘オブジェクトへの参照を格納する変数を宣言(事前バインディング) ‘事前バインディングを使用すると、プロパティの値を設定または取得 ‘するのに必要な時間を大幅に短縮できます Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet ‘ 変数にオブジェクトの参照を代入します。Add メソッドを使って ‘ 新規 workbookとworksheet オブジェクトを作成します。 Set xlApp = CreateObject(“Excel.Application”) Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) ‘エクセルを表示します。(表示しなくてもOK) xlApp.Visible = True ‘ Excel のセルに値を代入します。 xlSheet.Cells(1, 1).Value = “12” xlSheet.Cells(2, 1).Value = “34” ‘ Formula プロパティを使ってセルに式を挿入します。 xlSheet.Cells(3, 1).Formula = “=A1+A2″ ‘ “=SUM(A1:A2)” ‘ Worksheet を名前をつけて保存します。 xlSheet.SaveAs “c:\Temp.xls” ‘ Quit メソッドを使って Excel を終了します。 xlApp.Quit ‘ オブジェクトを解放します。 Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub オブジェクト変数を代入するのに下記の方法でもいいのですが Set xlApp1 = New Excel.Application MSDNに下記のように書いてあったのでCreateObject 関数を使用Office アプリケーションのインスタンスを作成する場合は、New 関数の代わりに CreateObject 関数を使用してください。 CreateObject 関数は、ほとんどの Visual C++ クライアントが使用する作成プロセスに、より密接にマップし、バージョン間でサーバーの CLSID に考えられる変更を考慮します。 CreateObject 関数は、事前バインディング、実行時バインディングのどちらのオブジェクトでも使用可能です。