- うちうせん
- ベテラン
- 会議室デビュー日: 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 の入門サイト
じゃんぬねっと日誌
|