tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelプロセス
記事No1589
投稿日: 2005/04/21(Thu) 09:56
投稿者BNR32
はじめて投稿します。

.NET VBからExcelが終了しません。
他のサイト等も調べたのですが、シート名を表示(行11〜13)したら、どのオブジェクト
を解放してよいかなかったので、投稿させて頂きました。

行11〜13をコメントにすると、Excelプロセスは残りません。
以下に開発環境とソースを記載します。

よろしくご教授お願いします。


開発環境
[OS]:Windows XP Professional
[VB]:VB.NET 2003
[Office]:Office 2000



1    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click        
2            
3        Dim xlFilePath As String = "c:\Test1.xls"   '保存ファイル名    
4        Dim i As Integer    
5
6        xlApp = New Excel.Application    
7        xlBooks = xlApp.Workbooks    
8        xlBook = xlBooks.Open(xlFilePath)    
9
10        xlSheets = xlBook.Worksheets    
11        For i = 1 To xlBook.Sheets.Count()    
12            Console.WriteLine(xlSheets.Item(i).Name)        'シート名
表示
13        Next i    
14
15        'セルの値を取得    
16        Console.WriteLine(CeGetCell(6, 3))    
17
18        'オブジェクトの解放    
19        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)    
20        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)    
21        xlBook.Close(False)    
22        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)    
23        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)    
24        xlApp.Quit()    
25        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)    
26
27        'ガベージ
28        System.GC.Collect()    
29
30    End Sub
31
32    Private Function CeGetCell(ByVal nRow As Integer, ByVal nCol As Integer) As String
33        Dim sRtnStr As String = ""    
34        Dim xlCells As Excel.Range    
35        Dim xlRange As Excel.Range    
36
37        xlCells = xlSheet.Cells    
38        xlRange = xlCells(nRow, nCol)    
39
40        If xlRange.Value <> vbNullString Then
41            sRtnStr = xlRange.Value
42        End If
43
44        'オブジェクトの開放
45        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)    
46        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)    
47
48        Return Trim(sRtnStr)
49    End Function
 

[ツリー表示へ]
タイトルRe: Excelプロセス
記事No1591
投稿日: 2005/04/21(Thu) 10:35
投稿者花ちゃん
> よろしくご教授お願いします。
私には、ご教授 ではなく[バグ取りの依頼]に受け取れましたが。

hhttp://www.bcap.co.jp/hanafusa/hazimeni.htm#no2

ここの[VB.NETTips一覧 他]の[Excel関係]をご覧下さい。

[ツリー表示へ]
タイトルRe: Excelプロセス
記事No1600
投稿日: 2005/04/21(Thu) 13:27
投稿者花ちゃん
まだ、思案しておられるようならヒントを 投稿されたコードを自分で書かれたのなら
下記のこと位は聞かなくてもできるはずですが。

> 行11〜13をコメントにすると、Excelプロセスは残りません。
ならどうしてこの部分を調べないのですか?

> 10        xlSheets = xlBook.Worksheets    
> 11        For i = 1 To xlBook.Sheets.Count()    
> 12            Console.WriteLine(xlSheets.Item(i).Name)
> 13        Next i    

たとえば12行目をコメント化して試してみるとか?
10 行目で xlBook.Worksheets は変数に受けているのに
11行目は、なぜその変数を使用しないで直接使っているのですか?
(なぜ、変数に受けなければいけないかはご存知ですよね)
12行目のコードはどこからかペーストしたものですか?自分で1文字づつ入力した
ものですか? 自分で入力したなら何か変だなと思いませんでした。
(ここのExcelのプロセスが正常に終了しない理由 の 2番と3番)

それとこの投稿されたコードは、投稿用のコードですか?
> 37        xlCells = xlSheet.Cells
この部分はどうなっているのですか?
投稿用のコードでどこか省略しているならいいのですが。

Excelのプロセスが正常に終了しない理由 のところに書いている1番〜5番の事を
確認しながらコードを書くようにして下さい。
それと、28行目は必要ありません。コードさえキチンと書いていれば残ることはありません。

[ツリー表示へ]
タイトルRe^2: Excelプロセス
記事No1603
投稿日: 2005/04/21(Thu) 14:09
投稿者BNR32
返信ありがとうございます。
ですが、まだ、解決できずに悩んでいます。

> たとえば12行目をコメント化して試してみるとか?
12行目をコメントにするとExcelプロセスが残らないのは、確認しています。
つまり、xlSheets.Item(i).Nameの.Item(i)をするとなにかのオブジェクト
を掴むのではないかと思っています。
よって、
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets.Item(i))
とかいろいろやってみましたが、わかりませんでした。

> 10 行目で xlBook.Worksheets は変数に受けているのに
> 11行目は、なぜその変数を使用しないで直接使っているのですか?
ここは、xlSheets.Count()でした。
ありがとうございます。

> 12行目のコードはどこからかペーストしたものですか?自分で1文字づつ入力した
> ものですか? 自分で入力したなら何か変だなと思いませんでした。
Console.WriteLine(xlSheets.Item(i).Name)は、私が入力したものです。
ここでシートの名前を取得しています。

> > 37        xlCells = xlSheet.Cells
> この部分はどうなっているのですか?
> 投稿用のコードでどこか省略しているならいいのですが。
すいません。ここは、投稿用のコードです。

[ツリー表示へ]
タイトルRe^3: Excelプロセス
記事No1604
投稿日: 2005/04/21(Thu) 15:06
投稿者花ちゃん
> > 10 行目で xlBook.Worksheets は変数に受けているのに
> > 11行目は、なぜその変数を使用しないで直接使っているのですか?
> ここは、xlSheets.Count()でした。
> ありがとうございます。

ここで変数に受ける理由が解っているなら下記でもなぜしないのですか。


> > 12行目のコードはどこからかペーストしたものですか?自分で1文字づつ入力した
> > ものですか? 自分で入力したなら何か変だなと思いませんでした。
> Console.WriteLine(xlSheets.Item(i).Name)は、私が入力したものです。
> ここでシートの名前を取得しています。

2.コードはマクロ等をそのままペーストせず、キーボードから入力する
  (そうする事によって自動メンバー表示やパラメータヒントが表示される)
3.自動メンバー表示等が表示されない場合は、コードの使い方が間違っている場合があるのでヘル
  プ等で確認する
xlSheets.Item(i). と入力した時点で自動メンバー表示に Name ってでてきました。

そもそもシート1個づつ変数に受けてReleaseComObjectするべきじゃなかったのですか?
37行目で使っている xlSheet はそのようにしているのではないのですか?
他の人のコードを理解しないままに使っているとちょっと違う使い方した場合に応用(解らなく)
が利かなくなりますよ。
これ以上はコードを書くのと同じ事になりますので自分で考えて下さい。
明日になれば、Tips集に追加するつもりですが、その前に解決するようにして下さい。

[ツリー表示へ]
タイトルRe^4: Excelプロセス
記事No1611
投稿日: 2005/04/21(Thu) 17:59
投稿者BNR32
返信ありがとうございます。

なんとか自分で解決してみます。

[ツリー表示へ]