トップ回答者
Visual Studio 2010 Express で Excel操作

質問
-
初心者です。
社内部署支援システムで使用中PCパフォーマンスが悪くなるので不思議に思いタスクマネージャーを調べるとアプリケーションには出ないのですが、プロセスでExcelが沢山動いていました。
これを何とかしなくてはと思うのですが、まずは開いたExcelを閉じることをしたいのですが、どのタイミングで閉じればよいのか?閉じ方はどうすればよいのかわかりません。
どなたか教えてください。よろしくお願いします。
現状のコードは以下に
Private Sub BtSansyou_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtSansyou.Click
Dim Rat As DialogResult
Dim MyExcel As New Excel.Application
Dim MyBook As Excel.Workbook
Dim xlSheets As Excel.Sheets
Dim MySheet As Excel.Worksheet
Dim i As IntegerWith Me.FileOpen
.Title = "ファイル選択"
.InitialDirectory = ""
.Filter = "エクセル|*.xls"
End With
'ファイル取得のダイアログを表示
Rat = Me.FileOpen.ShowDialog()
If Rat = Windows.Forms.DialogResult.OK Then
'選択したパスをテキストボックスに表示させる。
TxPass.Text = Me.FileOpen.FileName'エクセルを開く
MyExcel = CreateObject("Excel.Application")
MyBook = MyExcel.Workbooks.Open(TxPass.Text)
'エクセル非表示
MyExcel.Visible = False
xlSheets = MyBook.Worksheets
'リストボックスにシート名を表示させる
For i = 1 To MyBook.Worksheets.Count
MySheet = xlSheets.Item(i)
LbSeet.Items.Add(MySheet.Name)
Next
End If
End Sub
回答
-
こんにちは、おのでらです。
Excel オブジェクトはプロパティやメソッド経由でインスタンスを取得するごとにオブジェクトを解放する必要があります。
最初のコードでいうと、
・MyExcel = CreateObject("Excel.Application")
⇒Excel.Application の解放が必要です。・MyBook = MyExcel.Workbooks.Open(TxPass.Text)
⇒MyExcel.Workbooks で Excel.Workbooks の解放が必要です。
また、Workbooks.Open(TxPass.Text) で Excel.Workbook の解放が必要です。
ですので MyExcel.Workbooks を変数に設定して解放できるようにする必要があります。・xlSheets = MyBook.Worksheets
⇒Excel.Sheets
の解放が必要です。・For i = 1 To MyBook.Worksheets.Count
⇒ MyBook.Worksheets.Count プロパティにアクセスするたびに Excel.Sheets の解放が必要です。
上記で xlSheets にインスタンスを設定しているので xlSheets.Count でアクセスしましょう。・MySheet = xlSheets.Item(i)
⇒Excel.Worksheet の解放が必要です。
Excel オブジェクトを使用する場合は下のリンク先にあるぐらい解放を意識する必要があります。
http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html- 回答としてマーク intfol 2010年7月12日 21:13
-
もう皆さまが言い尽くされていますが、
ObjectA.ObjectB.hogehogeMethod()とすると、ObjectBはObjectAにくっついているように見えますが、.NETの場合別々の参照となるため、参照が残っています。ですのでいちいち変数に参照を入れて明示的に開放してください。
#VBAとかVB6の時はここまで気を使わなくてもよかったのですけれどね^^;
「原則、オブジェクト操作に使った全ての変数を開放してください」ダメ)ObjectBへの参照が残るためExcel.Exeが終了しない
ObjectA=new <なんかのインスタンス作成>
ObjectA.ObjectB.hogehogeMethod()
ReleaseComObject(ObjectA)
Set ObjectA = Nothingダメではない)
ObjectA=new <なんかのインスタンス作成>
ObjectB = ObjectA.ObjectB
ObjectB.hogehogeMethod()
ReleaseComObject(ObjectB)
ReleaseComObject(ObjectA)
ObjectB = Nothing
ObjectA = NothingVBAとかVB6の時)以下で済んだのですが...
Set ObjectA=Createなんか'<なんかのインスタンス作成>
ObjectA.ObjectB.hogehogeMethod()
Set ObjectA = Nothing#面倒で鬱陶しいのは非常によく理解できます^^;
- 回答としてマーク intfol 2010年7月12日 21:14
すべての返信
-
こんにちは、おのでらです。
Excel オブジェクトはプロパティやメソッド経由でインスタンスを取得するごとにオブジェクトを解放する必要があります。
最初のコードでいうと、
・MyExcel = CreateObject("Excel.Application")
⇒Excel.Application の解放が必要です。・MyBook = MyExcel.Workbooks.Open(TxPass.Text)
⇒MyExcel.Workbooks で Excel.Workbooks の解放が必要です。
また、Workbooks.Open(TxPass.Text) で Excel.Workbook の解放が必要です。
ですので MyExcel.Workbooks を変数に設定して解放できるようにする必要があります。・xlSheets = MyBook.Worksheets
⇒Excel.Sheets
の解放が必要です。・For i = 1 To MyBook.Worksheets.Count
⇒ MyBook.Worksheets.Count プロパティにアクセスするたびに Excel.Sheets の解放が必要です。
上記で xlSheets にインスタンスを設定しているので xlSheets.Count でアクセスしましょう。・MySheet = xlSheets.Item(i)
⇒Excel.Worksheet の解放が必要です。
Excel オブジェクトを使用する場合は下のリンク先にあるぐらい解放を意識する必要があります。
http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html- 回答としてマーク intfol 2010年7月12日 21:13
-
もう皆さまが言い尽くされていますが、
ObjectA.ObjectB.hogehogeMethod()とすると、ObjectBはObjectAにくっついているように見えますが、.NETの場合別々の参照となるため、参照が残っています。ですのでいちいち変数に参照を入れて明示的に開放してください。
#VBAとかVB6の時はここまで気を使わなくてもよかったのですけれどね^^;
「原則、オブジェクト操作に使った全ての変数を開放してください」ダメ)ObjectBへの参照が残るためExcel.Exeが終了しない
ObjectA=new <なんかのインスタンス作成>
ObjectA.ObjectB.hogehogeMethod()
ReleaseComObject(ObjectA)
Set ObjectA = Nothingダメではない)
ObjectA=new <なんかのインスタンス作成>
ObjectB = ObjectA.ObjectB
ObjectB.hogehogeMethod()
ReleaseComObject(ObjectB)
ReleaseComObject(ObjectA)
ObjectB = Nothing
ObjectA = NothingVBAとかVB6の時)以下で済んだのですが...
Set ObjectA=Createなんか'<なんかのインスタンス作成>
ObjectA.ObjectB.hogehogeMethod()
Set ObjectA = Nothing#面倒で鬱陶しいのは非常によく理解できます^^;
- 回答としてマーク intfol 2010年7月12日 21:14