VB.NETでExcelを操作しているのですが、下記コード①で
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」というエラーがでてしまいます。
Excelの操作方法などは間違っていないと思うのですが・・・・
おねがいします。
コード
'エクセル起動
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oBooks As Excel.Workbooks
Dim oSheet As Excel.Worksheet
oExcel = CreateObject("Excel.Application")
oBooks = oExcel.Workbooks
oBook = oBooks.Open(FilePach)・・・・・①ここでエラーが出ます。
oExcel.Visible = False
oExcel.UserControl = False
oSheet = oBook.Worksheets(Trim(lotNo))
処理・・・・・
'エクセルの終了
oExcel.Quit()
'プロセスの開放
If Not oSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
oSheet = Nothing
End If
If Not oBook Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
oBook = Nothing
End If
If Not oBooks Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
oBooks = Nothing
End If
If Not oExcel Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
oExcel = Nothing
End If
GC.Collect()
インスタンスが生成されていないんでしょうね。
CreateObject ではなくて Newして下さい。
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oBooks As Excel.Workbooks
oExcel = New Excel.Application
oExcel.Visible = True
oBooks = oExcel.Workbooks
oBook = oBooks.Open("D:\Book1.xls")
※VB.NET2003 Microsoft Excel 9.0 Object Library参照
動作確認済みです
返信有難うございます。
oExcel = New Excel.Application()
oExcel.Visible = False
oBooks = oExcel.Workbooks
oBook = oBooks.Open(FilePach) 'アプリケーションの現在地の絶対パス
oExcel.UserControl = False 'これを設定しておけば勝手に終了しない。
この記述で実行してみたのですが、開発しているPCでは動くのですが
ほかのPCにインストールして動かすとまたオブジェクトの参照エラーが出て島します。
なぜでしょう??
インストールというのは
A.インストーラを作成し、必要なDLL及びOCXもコピーしているということですか?
B.EXEファイルだけコピー&ペーストしているということですか?
エクセル参照を行ってから、配布(他の)マシンに
A.の作業は行いましたか?
…余談ですが、
エクセルを使った帳票システムを[VB.NET]で開発してきた経験上、
セットアッププロジェクトを作ると Excel.exe がインストーラに
含まれると思いますが、インストーラからは[除外]し、インストール
先の端末に、開発環境と同じ Office をインストールして運用する
のが一番トラブルが起こらない方法と感じています。
それと…ファイルパスという意味なら綴りは FilePath です。
…そんなに大した問題じゃありませんが。
葉月さんお仰ってる通りです。
また、追記しますと実行環境にOfficeが
ない状態では動きませんよ?(流石にそんなことは無いですよね?
ExcelのCOMを参照してますので。。。
#開発環境・実行環境の提示が無いので
#推測での回答しかできませんね
返信有難うございます。
配布マシンにはイントラーを作成して配布しています。
Excel.EXEは除外しています。
開発側も配布側もOffice2000を使っています。
ちなみに今のコードです、
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oBooks As Excel.Workbooks
Dim oSheet As Excel.Worksheet
oExcel = New Excel.Application()
oExcel.Visible = False
oBooks = oExcel.Workbooks
oBook = oBooks.Open(FilePach) ・・・・・①
oExcel.UserControl = False
lblsyori.Visible = False
やはり①でエラーが起きます。
お願いします。
開発環境のほうですが、
VB.NET2002
Office2000 Pro
WindowsXP Pro
実行環境のほうですが
Windows98、2000、XP Pro です。
私の経験上
1.雛形エクセルの作成
2.そのエクセルをVBでオープン
3.オープンしたエクセルを編集
4.VBで自動的に別名保存
5.エクセルをクローズ
という順序だと思うのですが
相手先に1.のファイルは存在しますか?
パスの指定は間違っていないか
ファイルは存在するかを確認してみてください
あと修正する気があるなら、してみる程度でいいのですが
特攻隊長まるるうさんの仰るとおり
×FilePach
○FilePath
(別に障害はないがかっこ悪い)
これではどうでしょうか?
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
oExcel = New Excel.Application
'ApplicationのメンバのWorkbooksのメソッドを使用してブックオープン
oBook = oExcel.Workbooks.Open("D:\Book1.xls")
Excel.Workbooksを使わない方法です。
…なんか回答してくれる人が居るみたいだから、オイラはしばらく
潜りますw。ま、↓は参考になればという事で。
CreateObject も COM コンポーネントのインスタンスを作成する
と書いてありますので、コード的には最初の質問の時点で取り立てて
指摘するほどのミスはないと思います。それに oExcel のインスタンス
の生成に失敗してるなら
> oBooks = oExcel.Workbooks
でエラーが出そうなもの。Open まで行っているのが確実なら、
原因は別にありそうです。
ところで Open まで行っているのはどうやって確認したんですか?。
インストール先でもデバックできる環境を揃えたのでしょうか?
デバックできるなら、エラーの直前で止めてクイックウォッチや
コマンドウィンドウでどのオブジェクトが生成されてないのか
調べて下さい。
あと、FilePach を決め打ちで、例えば
oBook = oBooks.Open("c:\Test.xls")
とした場合はどうなりますか?ファイルが存在しない場合は
そういったエラーメッセージが返ってくるはず…。ただ、何かの
操作で FilePach が Nothing になる可能性は…0 では無い
ですので。
特攻隊長まるるうさんの仰るとおり
>CreateObject も COM コンポーネントのインスタンスを作成する
>と書いてありますので、コード的には最初の質問の時点で取り立てて
>指摘するほどのミスはないと思います。
私の発言は信憑性に欠けるので参考になさらないで下さい。
失礼しました。
返信有難うございます。
開発PCとは別にVB.NETをインストールしてあるPCでプロジェクトを表示させたら
Imports Microsoft.Office.Interopが見つかりませんとエラーがでています。
きっとこれが原因だと思うのですがなぜ同じOfficeをつかっていてImports Microsoft.Office.Interopが見つからないとでるのでしょう??
>>ゆうさん
> VB.NET2002
> Office2000 Pro
> WindowsXP Pro
できえれば、2002/2003の方が安全なんですけれどね。
PIAs(Office Primary Interop Assemblies)が用意されているので。
Excel 2000だと、interop アセンブリを手動で修正しないと、
イベントの処理に問題が起きたりするので、要注意。(MSKB:316653)
ところで、OfficeのService Release/Service Packは同一ですか?
あと、開いているファイルのパスは正しいですか?
> 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」というエラーがでてしまいます。
コードを見た限り、exe作成時に、Option Strict Onモードは
指定していないのですよね?
どうせOption Strict Offモードにしているのであれば、参照設定を外し、
「遅延バインディング」にて作成してみてください。
遅延バインディングの場合では、他のPCでエラーになりますか?
もし、遅延バインディングならば動作するのであれば、アセンブリが
実行環境に未登録のままになっているのかも? たとえば、Excelライブラリは
登録してあるけれど、Officeライブラリが登録だとか。
思い付きで書いただけなので、外しているかも知れませんけど。
>>葉月さん
自分の場合は、*.xls ではなく *.xlt として作っておき、
Workbooks.Open() の替わりに、Workbooks.Add() を使ってます。
*.xls を .Open() して .SaveAs() という方法でもできますが、
元ファイルをテンプレートファイルにしておいた方が、
雛形を間違えて上書きしてしまう事故を防げるので。
>>ファリンファリンさん
その記述だと、WorkbooksをReleaseComObject()できないので、
マズイと思います。一度変数に受けてReleaseComObjectしないと、
COM側のメモリを正しく解放できなくなってしまうような。。。
(.NET側のメモリ解放だけなら、GC.Collect()で済みますが)
皆様丁寧なご説明有難うございました。
結局下記のように記述してやることにしました。
私の勉強不足があるので力をつけて後にこの問題に挑戦したいと思います。
Dim oExcel As Object
Dim oBook As Object
Dim oBooks As Object
Dim oSheet As Object
有難うございました。
>Dentalさん
>>>葉月さん
>自分の場合は、*.xls ではなく *.xlt として作っておき、
>Workbooks.Open() の替わりに、Workbooks.Add() を使ってます。(略)
策をありがとうございます
しばらくエクセル開発はないっぽいですが
何かで試して使い勝手を見てみます
>ゆうさん
全オブジェクト宣言ならうまくいったんですか
あまり理想的ではないので、時間ができたらトライしてみてくださいね
ツイート | ![]() |