Word や Excel などの Office 製品の制御
サンプル
コードのダウンロード (vbmigtips_office.exe, 870
KB)
アプリケーションから、入力したデータを Word や Excel などで保存したり、グラフを作成したりしたい場合があると思います。そこで今回は、Visual Basic .NET で作成したアプリケーション (図1) に入力されたデータを Excel で保存する方法を紹介します。今回はデータの保存以外に、グラフの作成方法も紹介します。

図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) の「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)。

図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)。

図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