5 人のうち 1 人が役に立つと評価しました    - このトピックを評価する

Word や Excel などの Office 製品の制御

Cc440882.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_office.exe, 870 KB)


アプリケーションから、入力したデータを Word や Excel などで保存したり、グラフを作成したりしたい場合があると思います。そこで今回は、Visual Basic .NET で作成したアプリケーション (図1) に入力されたデータを Excel で保存する方法を紹介します。今回はデータの保存以外に、グラフの作成方法も紹介します。

 Cc440882.office_fig01(ja-jp,MSDN.10).gif
 図1

図1 で入力された各テキストボックスのデータを元にグラフを作成し、保存します。

Visual Basic .NET での Excel の制御は、Visual Basic 6.0 と同様にオートメーション機能を利用して実現します。
Visual Basic 6.0 で Excel オブジェクトを取得する場合、CreateObject 関数を使用して、Excel のインスタンスを格納していました。Visual Basic .NET でも、CreateObject 関数を使用して Excel オブジェクトを取得できますが、CreateObject 関数は Visual Basic .NET でのみサポートされています。そのため、C# などの他の言語との相互性を考え [参照設定]に「Microsoft Excel 11.0 Object Library」 (Office 2003の場合) を追加して実装します。実装コードは以下のとおりです。

Imports System.Runtime.InteropServices

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objExcelApp As Object
Dim objBook As Object
Dim objBooks As Object
Dim objSheet As Object

objExcelApp = System.Reflection.Missing.Value
objExcelApp = New Excel.Application

With objExcelApp
.Visible = True
objBooks = .Workbooks
objBook = objBooks.Add
objSheet = objBook.ActiveSheet

With objSheet
.Range("B3") = "1 - 3 月"
.Range("B4") = "4 - 6 月"
.Range("B5") = "7 - 9 月"
.Range("B6") = "10 - 12 月"
.Range("B7") = "合計"
.Range("C2") = "売上額"
.Range("C3") = TextBox1.Text
.Range("C4") = TextBox2.Text
.Range("C5") = TextBox3.Text
.Range("C6") = TextBox4.Text
.Range("C7") = "=SUM(C3:C6)"

Dim MyCharts As Excel.ChartObjects
Dim MyChart As Excel.ChartObject
Dim MyChart1 As Excel.Chart
MyCharts = .ChartObjects
MyChart = MyCharts.Add(10, 100, 300, 250)
MyChart1 = MyChart.Chartv

MyChart1.SetSourceData(.Range("B2:C6"))
MyChart1.ChartType = Excel.XlChartType.xlColumnClustered
MyChart1.HasTitle = True
MyChart1.ChartTitle.Text = "売上額"
.SaveAs(fileName:="C:\" & Me.Name & ".xls")

Marshal.ReleaseComObject(MyCharts)
MyCharts = Nothing
Marshal.ReleaseComObject(MyChart)
MyChart = Nothing
Marshal.ReleaseComObject(MyChart1)
MyChart1 = Nothing
End With
.DisplayAlerts = False
End With

Marshal.ReleaseComObject(objSheet)
objSheet = Nothing
Marshal.ReleaseComObject(objBook)
objBook = Nothing
Marshal.ReleaseComObject(objBooks)
objBooks = Nothing

If Not objExcelApp Is Nothing Then
objExcelApp.Quit()
Marshal.ReleaseComObject(objExcelApp)
objExcelApp = Nothing
End If
GC.Collect()

MessageBox.Show("ファイルを作成し、保存しました。")
End Sub
リスト1

上記 (リスト1) の「objExcelApp = New Excel.Application」で、Excel のインスタンスが格納され、同時に Excel が起動されます。「.Visible = True」で Excel を表示し、「objBooks = .Workbooks」「objBook = objBooks.Add」で新規のブックを追加します。「.Range("B3") = "1 - 3 月"」から「.Range("C7") = "=SUM(C3:C6)"」では、各セルにデータを代入します。次にセルに代入したデータを元にグラフを作成します (今回は、縦棒グラフを作成します)。縦棒グラフの指定は 「 MyChart1.ChartType = Excel.XlChartType.xlColumnClustered」とします。表示位置、グラフの大きさ、グラフに埋め込むデータなどの設定を行います (図2)。

 Cc440882.office_fig02(ja-jp,MSDN.10).gif
 図2

最後に「.SaveAs(fileName:="C:\" & Me.Name & ".xls")」で、作成したブックを C ドライブに保存します。保存後、Quit メソッドで Excel を終了します。ここで一点注意する必要があります。Visual Basic 6.0 では、Quit メソッドで簡単に Excel を終了することができました。しかしながら、Visual Basic .NET では、Quit メソッドを呼び出しても、表示上は消えますが、プロセス (Excel.EXE) が残ったままになります。これは、EXCEL を制御するために使用するオブジェクトの参照カウンタが、デクリメントされていないためです。正しく プロセス (Excel.EXE) を終了するためには、Excel の制御時に取得した全てのオブジェクトに対し、ReleaseComObject メソッドを使用して参照カウンタをデクリメントする必要があります。
最後に保存完了のメッセージを表示します (図3)。

 Cc440882.office_fig03(ja-jp,MSDN.10).gif
 図3

Office 2003 にアクセスする場合、プライマリ相互運用アセンブリ (PIA) を使用することで、アプリケーションと Office 間での相互性が向上します。PIA により、最適なデータ型が使用されることにより、型の変換が効率的に行われます。Office 2003 プライマリ相互運用アセンブリの詳細と入手方法は、以下の Web サイトを参照してください。

http://www.microsoft.com/japan/msdn/library/ja/jpstagsdk/html/stconTrustIAs.asp

また、Office XP 用のプライマリ相互運用アセンブリも下記の Web サイトよりダウンロードすることができます。

http://support.microsoft.com/default.aspx?scid=kb;ja;328912


この情報は役に立ちましたか。
(残り 1500 文字)