@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

[解決]ASP.NETからのExcel作成でエラー

投稿者投稿内容
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 11:18
過去スレ等を参考にASP.Net(VB)からExcelを新規作成するものを作ってみたのですが、どうもうまくいきません。
ファイルはできるのですが、どうやら壊れている(?)らしく開くことができません。
アドバイスお願いします。
[Source]

Private m_objExcel As Excel.Application
Private m_objWorkBooks As Excel.Workbooks
Private m_objWorkBook As Excel.Workbook
Private m_objWorkSheet As Excel.Worksheet

Me.m_objExcel = New Excel.Application
Me.m_objExcel.Visible = True
Me.m_objWorkBooks = Me.m_objExcel.Workbooks
Me.m_objWorkBook = Me.m_objWorkBooks.Add()
Me.m_objWorkSheet = Me.m_objWorkBook.ActiveSheet

Me.m_objWorkSheet.Cells(1, 1) = "テスト"

Me.m_objWorkBook.SaveAs("C:\test.xls")

Me.m_objExcel.Quit()

[Source]


_________________
うちうせん@SE見習い

[ メッセージ編集済み 編集者: うちうせん 編集日時 2006-02-21 16:35 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-21 11:29
引用:

しゅうさんの書き込み (2006-02-21 11:18) より:

Private m_objExcel As Excel.Application
Private m_objWorkBooks As Excel.Workbooks
Private m_objWorkBook As Excel.Workbook
Private m_objWorkSheet As Excel.Worksheet

Me.m_objExcel = New Excel.Application
Me.m_objExcel.Visible = True
Me.m_objWorkBooks = Me.m_objExcel.Workbooks
Me.m_objWorkBook = Me.m_objWorkBooks.Add()
Me.m_objWorkSheet = Me.m_objWorkBook.ActiveSheet

Me.m_objWorkSheet.Cells(1, 1) = "テスト"

Me.m_objWorkBook.SaveAs("C:\test.xls")

Me.m_objExcel.Quit()


まずは、COM Interop の基本からですね。

  COM オブジェクトを解放する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 11:57
[解決]
レスありがとうございました。
Quitメソッドを呼べば勝手に解放してくれるもんだと思ってました・・・。
Excelファイルが壊れている様に見えたのは、どうやら度重なるデバッグ作業中にすべて解放されてなかったため、Excel動作分のメモリがなかったようです。
再起動してみたら正常に表示できました。

[追加質問]
このExcelオブジェクト等のヘルプってどこかで参照できるんでしょうか?
_________________
by うちうせん
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-21 12:21
改名したんですね。(^^)

引用:

うちうせんさんの書き込み (2006-02-21 11:57) より:

Quitメソッドを呼べば勝手に解放してくれるもんだと思ってました・・・。


COM オブジェクトですからね。
旧 VB では、そのオブジェクトがスコープを抜けるタイミングで、
参照カウントをデクリメントしてくれていましたが、.NET の場合は自前でやる必要があります。

引用:

このExcelオブジェクト等のヘルプってどこかで参照できるんでしょうか?


Excel と限定されてしまうと、私のサイトとか花ちゃんさんのサイトとか、
あとは本家の Microsoft さんのサイトになると思います。

Excel に限らず、COM Interop やアンマネージ コードとの相互運用として考えるなら、以下が参考になります。

  アンマネージ コードとの相互運用

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 13:03
[解決]
HP参考にさせていただきます。
ありがとうございました。

[改名]
しゅうという名前は他にもいそうだったので^^;
_________________
by うちうせん
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-21 15:26
実はコードを書いていまして...
とりあえず、後から見る人のためという名目で貼っておきます。

コード:

    Private Shared Sub MosaMosaAA()
        Dim xlApplication As Excel.Application

        Try
            xlApplication = New Excel.Application()
            Dim xlBooks As Excel.Workbooks

            Try
                xlBooks = xlApplication.Workbooks
                Dim xlBook As Excel.Workbook

                Try
                    xlBook = xlBooks.Add()
                    Dim xlSheet As Excel.Worksheet

                    Try
                        xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet)
                        Dim xlCells As Excel.Range

                        Try
                            xlCells = xlSheet.Cells
                            Dim xlRange As Excel.Range

                            Try
                                xlRange = DirectCast(xlCells(1, 1), Excel.Range)
                                xlRange.Value2 = "テスト"
                            Finally
                                If Not xlRange Is Nothing Then
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                                End If
                            End Try
                        Finally
                            If Not xlCells Is Nothing Then
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
                            End If
                        End Try
                    Finally
                        If Not xlSheet Is Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                        End If
                    End Try

                    xlBook.SaveAs("C:\MosaMosaAA.xls")
                Finally
                    If Not xlBook Is Nothing Then
                        Try
                            xlBook.Close()
                        Finally
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                        End Try
                    End If
                End Try
            Finally
                If Not xlBooks Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
                End If
            End Try
        Finally
            If Not xlApplication Is Nothing Then
                Try
                    xlApplication.Quit()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
                End Try
            End If
        End Try
    End Sub


単に無駄にしたくなかっただけだったり...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-21 22:03
インデントが深くなるのが嫌で、「まとめて宣言、まとめて解放」をするようになりました。。。
どこかのスレッドから出張)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-22 00:06
引用:

Jittaさんの書き込み (2006-02-21 22:03) より:

インデントが深くなるのが嫌で、「まとめて宣言、まとめて解放」をするようになりました。。。


COM Interop の場合、それでは安全とは言えないですね。
せめてまとめての解放に Finally の機構が必要になります。

と言いつつも、私も昔はまとめてやっていました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)