掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6でのExcel.Applicationの定義? (ID:142316)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
それ、参考にしている .NET 用のコードに問題がありますよ。 動く事は動くと思いますが、VB6 向けコードを、そのまま VB.NET に翻訳しただけのような 作りになっていて、VB.NET として使うには、いろいろと問題のあるコードになっています。 (オブジェクトの解放処理が無く、単に Nothing を代入しているだけとか、 参照設定しているのに CreateObject しているとか。細かいところでは、 CType よりも DirectCast を使う方が望ましい、とか。) まぁ、それゆえに VB6 に翻訳しやすいコードである、とも言えますが。 >> Dim xlApp As Excel.Application >> でユーザー定義型は定義されていませんとのエラー出力があります。 この場合は、その変数定義を As Object にするだけで OK です。 ついでに、モジュールの先頭に「Option Explicit」も入れておきましょう。 一応、VB6 で Excel を参照設定すれば "As Excel.Application" を利用できますし、 参照設定した方が本来は望ましいです。 しかし参照設定すると、「親オブジェクトを指定せずに、シートやセルを利用する」といった “誤ったコード”を書いたときに、2 回目以降の Excel 操作が失敗するようになったり、 Excel が終了しなくなるといった、気づきにくい問題を抱える可能性があります。 http://homepage1.nifty.com/rucio/main/technique/teq_15.htm 参照設定しなかった場合は、そのような親オブジェクトを指定しないコードは 「変数が宣言されていません」のエラーとなるため、“誤ったコード”が 混入することを防げます。 なので VB6 から操作するのであれば、まずは参照設定無しで始めるというのも一つの手です。 (.NET の場合は、逆に参照設定しない事によるデメリットの方が大きいのですが…) >> xlbook = CType(xlApp.Workbooks.Add, Excel.Workbook) > この「CType」って何ですか?VB6にはないと思います。 型変換のための関数です。 VB6 の場合、オブジェクトをキャストする場合には、目的の型の 変数を用意して、そこに代入する必要があります。 http://support.microsoft.com/kb/168830/ja つまりこの場合、変数のキャストを行う場合には Dim xlBook As Excel.Workbook に対して、 Set xlBook = xlApp.Workbooks.Add() というコードを書けばよいことになります。型変換の関数は不要です。 > あと引数を ByVal にする必要はないのでは? > ByRef と ByVal の違いはわかりますか? それは逆でしょう。 ByVal で良い——というよりも、ByValにするべき——だと思いますよ。 (ByVal / ByRef を省略した場合、VB6 では ByRef、VB.NET では ByVal の意味になります) ByVal の場合、プロシージャ内で引数が指す物が入れ替わらない事が保証されます。 今回のようなパターンでは、ByRef にするメリットは殆どありません。 VB6 で ByRef を「使わなければならない」パターンとは、 ・ByVal では渡せない型を引数にする場合(ユーザー定義型) ・プロシージャ内で引数を書き換える必要がある場合 ・ByVal として宣言することが許可されていないイベントプロシージャを利用する場合 などに限られます。 それ以外の場合、VB6 で意図的に ByVal/ByRef を記述するのであれば、極力、ByVal を選択するべきかと。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.