none
Visual Studio 2010 Express で Excel操作 RRS feed

  • 質問

  • 初心者です。

    社内部署支援システムで使用中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 Integer

            With 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

    2010年7月7日 4:29

回答

  • こんにちは、おのでらです。

    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
    2010年7月9日 3:37
  • もう皆さまが言い尽くされていますが、

    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 = Nothing

    VBAとかVB6の時)以下で済んだのですが...
    Set ObjectA=Createなんか'<なんかのインスタンス作成>
    ObjectA.ObjectB.hogehogeMethod()
    Set ObjectA = Nothing

    #面倒で鬱陶しいのは非常によく理解できます^^;

    • 回答としてマーク intfol 2010年7月12日 21:14
    2010年7月9日 4:35
  • ReleaseComObjectで解放して下さい。

    (参考)
    [C#] COM と RCW と参照カウント
    http://igeta.cocolog-nifty.com/blog/2007/07/rcw.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク intfol 2010年7月12日 21:32
    2010年7月7日 8:18
    モデレータ
  • >ReleaseComObjectで解放して下さい。

    あと、Application.Quit() しましょう。

     

    • 回答としてマーク intfol 2010年7月12日 21:32
    2010年7月8日 0:30

すべての返信

  • ReleaseComObjectで解放して下さい。

    (参考)
    [C#] COM と RCW と参照カウント
    http://igeta.cocolog-nifty.com/blog/2007/07/rcw.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク intfol 2010年7月12日 21:32
    2010年7月7日 8:18
    モデレータ
  • >ReleaseComObjectで解放して下さい。

    あと、Application.Quit() しましょう。

     

    • 回答としてマーク intfol 2010年7月12日 21:32
    2010年7月8日 0:30
  • Visual Web Developer Express Edition ではなくて、Visual Basic Express Edition だとすれば、次回からは Visual Basic Express Edition のフォーラムをご利用ください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年7月8日 14:05
    モデレータ
  • 申し訳ございません。Visual Basic Express Edition です。

    次回から気をつけます。

    せっかく助言していただいたのですが、うまくExcelを終了させることが出来ません。

    画面上では見えていないのですが、タスクマネージャーのプロセスでは起動しています。

    教えてください。よろしくお願いします。

    2010年7月9日 1:37
  • こんにちは、おのでらです。

    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
    2010年7月9日 3:37
  • もう皆さまが言い尽くされていますが、

    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 = Nothing

    VBAとかVB6の時)以下で済んだのですが...
    Set ObjectA=Createなんか'<なんかのインスタンス作成>
    ObjectA.ObjectB.hogehogeMethod()
    Set ObjectA = Nothing

    #面倒で鬱陶しいのは非常によく理解できます^^;

    • 回答としてマーク intfol 2010年7月12日 21:14
    2010年7月9日 4:35
  • おのでら様Chuki様本当にどうもありがとうございました。

    とっても分かりやすかったです。初めて理解できた感じです。

    皆様方に折角ご指導いただいても私があまりにも素人でしたので、開放の意味すらはっきりと理解していませんでした。

    感激です。

    VBがとっても楽しくなりました。今後ともよろしくお願いします。

    2010年7月12日 21:24