人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

vb6でexcelを操作したい。
環境 win xp vb6 pro edition excel 2007

vb6のフォームにボタンを配置して、クリックすると
excelが開きシートを追加し値を代入する。
もし既にexcelが開いていれば、そのブックにシートを追加し値を代入する。
フォームのボタンが押される毎に上記を実行する。
と言うプログラムを組みました。


以下質問が500文字を超えるのでコメント欄に書きます。

●質問者: Scandium
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● じゅぴたー
●40ポイント

正式には

Dim app as object 

が正解で、Command1_Click サブプログラムの最後に

app.Application.Quit
Set app = Nothing

の2行が抜けています。

Dim app または Dim app as variant にした場合、たまたまシステム内でガベージコレクト(不足していた2行の処理)を行ってくれているのだと思います。


>あとWorksheets(1)の(1)の意味はなんでしょう?

Excelワークシートタブで一番左にあるものが1番目です。

◎質問者からの返答

回答ありがとうございます。

Set app = Nothingにしたら意図した通り動く様になりました。


もう一度Set app = Nothingを付けないで、試してみたら

意図していない動きの再現度が、不定期になって来ました。

どうやら意図していない動きは毎回は起こらないようです。

(今朝も、2日前の朝も同じ意図していない動きをしていたので、毎回起きると勘違いしていた様です。)

No2さんの言うexcelの状態の違いが何か影響を及ぼしているのか、何か別の影響があったのかよく分らなくなって来ましたが、大まかな動きは理解できて来ました。


>ガベージコレクトを行ってくれている

なるほど勉強になります。


2 ● cx20
●60ポイント ベストアンサー

実行時の動作が、型によって異なるとのことですが、型による違いではなく、実行時の、Excel の状態の違いによるものと思われます。

Set app = GetObject(, "Excel.Application")  ' 一番最初に起動した Excel.exe に接続
app.Sheets.Add  ' ブックが存在しない状態で Sheets にアクセスしようとするとエラー

実行時の Excel(一番最初に起動した Excel.exe)は、ブックが開かれている状態でしょうか?それとも閉じた状態でしょうか?

エラーの原因は、Err オブジェクトの内容に記載されていますので、Err オブジェクトをクリアする前に、確認しててください。以下は、エラー内容を確認する為のコード例です。

エラー:
 Debug.Print "Error : [" & Err.Description & "](" & Err.Number & ")"
 Err.Clear
Err : [アプリケーションの定義またはオブジェクト定義のエラーです。](1004)

何故as objectやas Excel.Applicationじゃ駄目なのかが分りません。

オブジェクト型やバリアント型であっても、Excel.Application 型の代入が出来れていれば、オートメーション(Excelの自動化)の動作には影響ないはずです。ですので、ダメではありません。


以下は、バリアント型、オブジェクト型、クラス型の説明です。

Dim app  ' バリアント型(暗黙的)
Dim app As Object  ' オブジェクト型
Dim app As Variant  ' バリアント型
Dim app As Excel.Application ' Excel.Application クラス型

バリアント型とオブジェクト型は、少し特殊で、異なる型への代入が可能となっています。

あと、

Dim app

が、グローバル変数(関数の外)として宣言しているようですが、これは意図した記述でしょうか?

意図していないのであれば、ローカル変数(関数内)で宣言した方が、良いかと思います。


グローバル変数の場合、複数回、関数を実行した場合、前の状態(Excel.Application の代入)を保持した状態となっていますので、

2回目以降の処理として、代入する前に、参照の解放(Set app = Nothing)もしくは、

GetObject()/CreateObject() による代入を行わないようにする、と言った対応が必要がなります。

あとWorksheets(1)の(1)の意味はなんでしょう?

VB にてデバッグ実行を行い、[表示] - [変数] にて、オブジェクトの中身を確認してみてください。

Worksheets は、Worksheet のコレクションで、(1) は、コレクションの1つ目の要素を示します。


追加順というわけではなく、表示されているシートの順に対応しているようです。

式 値 型
--------------------- -------------- ------------------------
[app]
 +-[Workbooks] 
 +-[Item 1]
 +-[Worksheets] Sheets/Sheets
 +-[Count] 4 Long
 +-[Item 1] Variant/Object/Worksheet
 +-[Name] "Sheet4"
 +-[Item 2] Variant/Object/Worksheet
 +-[Name] "Sheet1"
 +-[Item 3] Variant/Object/Worksheet
 +-[Name] "Sheet2"
 +-[Item 4] Variant/Object/Worksheet
 +-[Name] "Sheet3"
◎質問者からの返答

回答ありがとうございます。


>ブックが開かれている状態でしょうか?

ブックが開かれている状態です。

no1さんの返信でも書きましたが意図しない動きの再現性が変化しているようです。


>Excel.Application 型の代入が出来れていれば、オートメーションの動作には影響ないはずです。

私の考えが根本的に間違っていないと言う事が分りました。ありがとうございます。


>Dim appがグローバル変数(関数の外)として宣言しているようですが、これは意図した記述でしょうか?

いいえ違います。ミスしてました。

Dim appをローカルにするか Set app = Nothingを追加したら、意図した動きをする様になりました。


なんで質問文のような動作をしたのか私の中で説明が付きませんが、オブジェクトの扱い(2週目以降の処理の問題)やexcelの状態等が影響して来ていたのかな?。しかし大まかな動きは理解できて来ました。

ありがとうございました。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ