VB2008エクセルについて

タグの編集
投稿者 紅バスター  (高校生) 投稿日時 2009/7/28 22:24:24
こんにちは!
VB2008を使用している者です。
今、VBでコンボボックス1と2の条件(組・番号)を入力してボタン1をクリックしたら、テキストボックスに名前を表示させるやつを作成しています。
それで、エクセルのVLooKUPを使用したいのですが分からなくて困っています。
プログラムにどう書き込むか分かる人は教えてください。
あと、エラーの中で警告”変数は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。”の直し方が分かりません。直し方を詳しく教えてください。
このようなプログラムで失敗してしまいました。
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim exApp As New Excel.Application
        Dim exBook As Excel.Workbook
        Dim exSheet As Excel.Worksheet

        'Excelブックを起動 exBook = exApp.Workbooks.Open("C:\test.xls")
        'Excelを表示
        exApp.Visible = True
        'シートを指定 exSheet = exBook.Worksheets("Sheet1")

        MsgBox("Excelをオープンしました。")
        '保存せずに閉じる
        exBook.Close(False)

        'Excelを閉じる
        exApp.Quit()
        '終了処理
        exSheet = Nothing
        exBook = Nothing
        exApp = Nothing

    End Sub
End Class
投稿者 (削除されました)  () 投稿日時 2009/7/28 23:02:19
(削除されました)
投稿者 neptune  (社会人) 投稿日時 2009/7/29 02:15:13
こんにちは

気づいた所を

>'Excelブックを起動 exBook = exApp.Workbooks.Open("C:\test.xls")
多分この書き方ではインスタンスが正常に破棄されない。
workbooksがexAppから参照されているが、暗黙のうちの参照であるため恐らく開放されないと思う。
→正常に終了しないと言う事。(未確認ではあります。)

>エクセルのVLooKUPを使用したいのですが
使用するのは自由ですが、なぜにワークシート関数のVLookUpかなと思ってしまいます。
制約も多いし。
findメソッドもあるし、そちらの方が恐らく使い勝手は楽チンかも?

正直、検索数が少なければ全部のデータをなめていっても良いと思います。

>Null 参照の例外が実行時に発生する可能性があります。”の直し方が分かりません。
はこれですね。どこかきちんと書いておいてください。
>exBook.Close(False)
exBookは変数の型宣言はしているが、実体を与えられていない(Null参照)から指摘されている。
直し方。
使用する前に実体を与えればよい。

>直し方を詳しく教えてください。
デバッグを他人にお願いするのはここのような開発言語系の掲示板では嫌われますよ。
→アドバイスがもらいに肉なる可能性あり。

ここの過去ログを「Excel」をキーワードにして検索するといろいろ注意点、サンプルなどがあったと
思います。まずは過去ログをあさってみて下さい。
投稿者 メソポタミア文明  (社会人) 投稿日時 2009/7/29 03:07:39
紅蓮、本好きというHNと中身同じと予想。
投稿者 紅蓮  (学生) 投稿日時 2009/7/29 03:12:42
HNってなんですか?
すみませんまだ、パソコンについて学習していなくて・・・
投稿者 るしぇ  (社会人) 投稿日時 2009/7/29 03:25:57
>HNってなんですか?
Handle Nameです。
http://www.cam.hi-ho.ne.jp/mendoxi/bug/handle-name.html

同じ目的と思われる質問が複数のハンドル名であがる。
過去に質問者として現れたハンドルの人が回答がついてても無反応なのに
上記スレッドには合いの手を入れる。
…その際、高校生が小学生に変わってる。
こちらから見てると実に気持ち悪くて、関わりたく無いと思っています。
で、ボクの場合、基本的には放置にします。

>多分この書き方ではインスタンスが正常に破棄されない。
補足です。
VB.NET で Excelのプロセスが正常に終了しないという問題はかなり有名です。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
これは、プログラム終了後に自作のプログラムと関係の無い Excel ファイルを
開いた場合、正常に表示されないといった実害があります。

これを解決するために、VB.NET から Excel を操作する場合、まずは使用した
オブジェクト毎にCOM解放処理を入れます。この際、
> exBook = exApp.Workbooks.Open("C:\test.xls")
右辺のピリオドが2回出てくるような書き方はすべてNGとなります。
質問者があげたサンプルコードは、この解放処理が丸々抜けています。
VB6 時代のコードなら、終了処理の部分が意味がありましたが、VB.NET では、
有効な終了処理では無くなりました。
VB.NET のサンプルコードを探して、全て書き直してください。


>警告”変数は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。”
オブジェクトを参照する変数は、メモリ上のオブジェクトの先頭アドレスを
格納します。オブジェクトは一般的にサイズが大きいので、丸々メモリ上を
移動させるより先頭アドレスのみやり取りするほうが便利だからです。
(これに対し値型の変数(数値型など)は宣言した時点で実体となり、初期化されます。)

このため、参照変数は宣言しただけでは中身が空っぽです。
メモリ上に用意された実体(インスタンス)の先頭アドレスを格納する作業が必要です。

アドレスを格納する前に参照した場合、空っぽを参照しますので、これが
neptune さんご説明の通り「Null 参照」となります。
変数の中身をデバッグ中に確認すると Nothing となります。
Null 参照した時に表示されるエラーは
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
です。
使用する前に実体を与えればよいというのが、全くもってその通りですが、
無駄な実体を作るのは無意味ですので、やはりこれもサンプル探しから
はじめた方が良いでしょう。
投稿者 紅蓮  (高校生) 投稿日時 2009/7/29 03:32:02
分かりやすい説明ありがとうございました。
投稿者 neptune  (社会人) 投稿日時 2009/7/29 07:43:34
紅バスター  さん

同じ人だろうとは思ってましたが、
せめて、同一スレッド内ではHN統一しようよ。

それと、少なくともアドバイスもらったらありがとうぐらいは言おうよ。
それが世の中の礼儀ってもんですよ。

別段それが欲しいわけじゃないが、複数HN + 放置じゃマナー悪すぎ!
投稿者 紅蓮バスター  (高校生) 投稿日時 2009/7/30 20:25:37
すみません。
返答するのが遅れてしまいました。
自分は、本好きさんとは違う人ですが、不快な感じを与えてしまうような発言をしてしまいすみません。
あれから、一日いろんな人のアドバイスを受けて完成いたしました。
皆さんありがとうございました。
失礼な発言をしてしまいすみません。