Visual Basic 初級講座 |
Visual Basic 中学校 > 初級講座 >
VBと関連の深い3つのテクノロジを紹介します。DirectXを使った3Dグラフィックス、データベースの読み込み、Excelへの書き込みの例が登場します。
概要 ・さまざまなテクノロジをVBから操作することができる。 ・DirectXを使うと3Dグラフィックスをはじめゲームに必要なさまざまな制御ができる。 ・ADO.NETを使うとデータベースアプリケーションを作成できる。 ・OLEオートメーションを使ってExcelを操作するプログラムが作成できる。 ・音声合成エンジンをつかってコンピューターにしゃべらせることができる。 ・他にもWebアプリケーションなどさまざまなテクノロジが存在する。 |
これを読んでいる皆さんは多かれ少なかれVBについてはある程度の知識を持っていることと思います。そして、VBの初級者にはありがちなことなのですが、「VBを極めればいろいろなプログラムを作れるようになる」という錯覚に陥る人がいます。
これはあきらかに間違いでいろいろなプログラムを作るためにはVBだけ極めても役に立たない場合が多いのです。
たとえばゲームを作りたいのならグラフィックスやオーディオに関するプログラムの知識が必要になります。インターネット上で誰でも利用できるアプリケーションを作るのならば、ネット経由でのデータの通信方法やセキュリティについて知っておかなければならないでしょう。
VBを使うとこういったこまごまとしたことを制御することはできますが、どのように制御すべきなのかはプログラムを作る人、つまりあなたが知っておく必要があります。
これは数学と実社会の関係に似ています。どんなに数学を究めてもそれだけでは実社会で役に立ちません。銀行で働くならば複雑な金利や返済計画について知っていなければなりませんし、普通のサラリーマンであっても所得税や必要経費の計算くらいできなければ困ります。
数学を使うとこういったことを計算することはできますが、どのように計算すべきなのかは計算する人が知っておく必要があります。
どうでしょうか。こうやって並べて書くとVBと数学が立場的に似ていることがおわかりになるでしょう。そして、数学だけでは何もできないようにVBだけでは何もできないということが少なくともイメージとして理解していただけるのではないでしょうか?
VBプログラマが知っておいた方が良い代表的な知識をまとめてみました。
純粋に技術的なテクノロジ | データベース関連 | Web関連 | マルチメディア関連 | その他 |
---|---|---|---|---|
Windows カーネル | データベースの基礎 | Webアプリケーションの基礎 | グラフィックス | セキュリティ |
COM/ActiveX | ADO.NET | HTML/DHTML | オーディオ | Office |
.NET Framework | SQL | ASP.NET | DirectX | Windows ネットワーク |
ストアドプロシージャ | Silverlight | OpenGL | レポーティング(印刷) | |
XML | JavaScript | WPF | 正規表現 | |
CSS |
■表1:主なテクノロジ
なんとなく思うがままに書いてみただけですし、他にも重要な知識はたくさんありますので表の内容については深く気にしないで下さい。
今回はこれらに関連して以下の4つのトピックに簡単に触れます。
・DirectXによる3Dグラフィックス
・データベース
・Excelの操作
・音声合成エンジンによる発声
どのトピックも奥が深いので今回だけで説明することはとてもできません。今回はこれらのトピックを紹介することでVBの持つ無限の可能性を示し、みなさんがそれぞれにあった方向を歩んでいくための助けとなることが目的です。
市販のゲームのような視覚効果抜群のアプリケーションを作るならばWPFかDirectX(読み方:DirectX = ダイレクトエックス)を使うのが一般的です。本格的なゲームを作るのは何を使っても使わなくても大変な作業ですが、ちょっとした3DグラフィックスをDirectXで試すくらいなら比較的簡単にできます。今回は画像を立体的に回転させるプログラムを紹介します。
■画像1:回転中の四角形1 | ■画像2:回転中の四角形2 |
DirectXはマイクロソフトがゲームプログラミングのために開発したライブラリ(=クラスの集合)で、2Dグラフィックス、3Dグラフィックスの他にオーディオの制御やゲームのコントローラからの入力処理などゲームを開発するために必要な一通りの機能が装備されています。
DirectXは日々バージョンアップしていて2006年5月時点での最新版は9.0です。
DirectXを使うにはまずDirectX SDKをインストールしなければなりません。DirectX SDKは無料でダウンロードすることができます。SDKの場合は同じ9.0でも頻繁に更新されているのでできるだけ最近の日付のものをインストールするようにしてください。
これから説明するプログラムはDirectX 9.0 SDK (April 2006)でテストしました。DirectX SDKはたとえば下記でダウンロードできますが、この記事の作成時に使用したバージョンとは異なるため記事の内容とは異なるかもしれません。
https://www.microsoft.com/en-us/download/details.aspx?id=6812
DirectX SDKをインストールしたらすぐにでもVBからこのDirectXを操作できるようになります。DirectXの3Dグラフィックス機能を使用するには参照設定に次の3つを含める必要があります。
コンポーネント名 | バージョン |
---|---|
Microsoft.DirectX | 1.0.2902 |
Microsoft.DirectX.Direct3D | 1.0.2902 |
Microsoft.DirectX.Direct3DX | 1.0.2910 |
■表2:追加する参照設定
参照設定を行うには[プロジェクト]メニューの[参照の追加]を選択します。
■画像3:DirectXへの参照設定
バージョンは私がこのプログラムを作成する際に使用したバージョンというだけで、このバージョンでなければいけないというわけではありません。
参照設定が完了すれば後は好きなようにプログラムするだけです。少し長いですが以下に全コードを掲載するのでVB2005以上の場合は丸ごと貼り付けてください。冒頭の変数BMPFileNameで定義している画像のパスだけは環境にあったものに変える必要がありますが他はこのままで実行できます。
VB.NET2002およびVB.NET2003の場合は他にもいくつか修正しなければ動きません。まず「Windowsフォームデザイナが生成したコード」の部分を消さないように気をつけて他の部分をそっくり入れ替えます。Inherits...の行も消さないように気をつけてくださいね。Imports...の2行は一番上になります。次にHandles Me.LoadをHandles.MyBase.Loadに変更します。それからFormClosingイベントをまるごと削除します。これで動くようになりますが、終了できなくなるのでVBの開発環境で停止ボタンを押すなどして終了してください。
Imports Microsoft.DirectX Imports Microsoft.DirectX.Direct3D |
Public Class
Form1 Dim ThisDevice As Device '描画エンジン Dim Vertexes As VertexBuffer '頂点の集合 Dim ThisTexture As Texture 'テクスチャ(面に貼り付ける画像) Dim IsAlive As Boolean 'Trueのときは処理を続行する。 Dim BMPFileName As String = "C:\Flowers.bmp" '画像ファイルのフルパス |
Private Sub
Form1_Load(ByVal sender
As Object, ByVal
e As System.EventArgs)
Handles Me.Load Me.ClientSize = New System.Drawing.Size(400, 300) '▼前処理 If InitializeGraphics() = False Then MsgBox("Direct3Dを初期化できませんでした。プロジェクトは終了します。", MsgBoxStyle.Critical) Else Me.Show() Me.Activate() IsAlive = True End If '▼メインループ Do While IsAlive Render() Application.DoEvents() Loop '▼後処理 Me.Close() End Sub |
Private Sub
Form1_FormClosing(ByVal sender
As Object, ByVal
e As System.Windows.Forms.FormClosingEventArgs)
Handles Me.FormClosing If IsAlive Then IsAlive = False e.Cancel = True End If End Sub |
Public Function InitializeGraphics()
As Boolean Try Dim Params As PresentParameters = New Microsoft.DirectX.Direct3D.PresentParameters Params.Windowed = True Params.SwapEffect = SwapEffect.Discard ThisDevice = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, Params) AddHandler ThisDevice.DeviceReset, AddressOf Me.OnResetDevice Me.OnCreateDevice(ThisDevice, Nothing) Me.OnResetDevice(ThisDevice, Nothing) Return True Catch ex As Exception Return False End Try End Function |
Public Sub OnCreateDevice(ByVal sender
As Object, ByVal
e As EventArgs) Dim dev As Device = DirectCast(sender, Device) '空の4つの頂点を準備 Vertexes = New VertexBuffer(GetType(CustomVertex.PositionTextured), 4, dev, 0, CustomVertex.PositionTextured.Format, Pool.Managed) '頂点作成イベントの割り当てと呼び出し AddHandler Vertexes.Created, AddressOf Me.OnCreateVertexBuffer Me.OnCreateVertexBuffer(Vertexes, Nothing) End Sub |
Public Sub OnResetDevice(ByVal
sender
As Object, ByVal
e As EventArgs) Dim dev As Device = DirectCast(sender, Device) dev.RenderState.CullMode = Cull.None 'カリングをオフにする。(オンの場合はポリゴンの前面だけしか描画されない) dev.RenderState.Lighting = False 'ライトなし ThisTexture = TextureLoader.FromFile(dev, bmpfilename) 'テクスチャ画像の読み込み End Sub |
Public Sub OnCreateVertexBuffer(ByVal
sender
As Object, ByVal
e As EventArgs) Dim vb As VertexBuffer = DirectCast(sender, VertexBuffer) Dim verts() As CustomVertex.PositionTextured = DirectCast(vb.Lock(0, 0), CustomVertex.PositionTextured()) '4つの頂点の座標とそれぞれのテクスチャマップを設定する。 verts(0).Position = New Vector3(2.0F, 2.0F, 0.0F) verts(0).Tu = 0.0F verts(0).Tv = 0.0F verts(1).Position = New Vector3(-2.0F, 2.0F, 0.0F) verts(1).Tu = 1.0F verts(1).Tv = 0.0F verts(2).Position = New Vector3(2.0F, -2.0F, 0.0F) verts(2).Tu = 0.0F verts(2).Tv = 1.0F verts(3).Position = New Vector3(-2.0F, -2.0F, 0.0F) verts(3).Tu = 1.0F verts(3).Tv = 1.0F vb.Unlock() End Sub |
Private Sub
Render() If IsNothing(ThisDevice) Then Return End If If Me.WindowState = FormWindowState.Minimized OrElse Me.Visible = False OrElse Not IsAlive Then Return End If ThisDevice.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0F, 0) '▼シーン開始 ThisDevice.BeginScene() SetupMatrices() 'カメラアングル調整 ThisDevice.SetTexture(0, ThisTexture) 'テクスチャ用意 ThisDevice.SetStreamSource(0, Vertexes, 0) '頂点用意 ThisDevice.VertexFormat = CustomVertex.PositionTextured.Format '頂点の属性をセット ThisDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2) 'ポリゴン生成 ThisDevice.EndScene() '▲シーン終了 ThisDevice.Present() End Sub |
Private Sub SetupMatrices() '▼時間経過による回転 Dim iTime As Integer = Environment.TickCount Mod 1000 Dim fAngle As Single = iTime * (2.0F * CSng(Math.PI)) / 1000.0F ThisDevice.Transform.World = Matrix.RotationY(fAngle) '▼カメラの位置と方向 '手前に引いて少し上から原点を見下ろす感じ ThisDevice.Transform.View = Matrix.LookAtLH(New Vector3(0.0F, 3.0F, -5.0F), New Vector3(0.0F, 0.0F, 0.0F), New Vector3(0.0F, 1.0F, 0.0F)) '▼2次元への投影 ThisDevice.Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI) / 4, 1.0F, 1.0F, 100.0F) End Sub |
Protected Overrides Sub OnKeyPress(ByVal
e As System.Windows.Forms.KeyPressEventArgs) '[ESC]キーが押されたら終了する If CByte(AscW(e.KeyChar)) = System.Windows.Forms.Keys.Escape Then IsAlive = False End If End Sub End Class |
■リスト1:DirectXによる3次元的なグラフィックスの例
DirectX未経験の方には見たこともないようなコードだと思います。このあたりがVBだけ極めても何もできないという理由です。
コードを貼り付けたら実行する前に画像を用意してください。私は花の画像をC:\Flowers.bmpに保存して利用しました。みなさんはそれぞれ好きな画像を用意していただければ問題ありません。画像ファイルはプログラム中の変数BMPFileNameで指定しているので必要に応じてこの値を変更してください。
画像の形式は純粋なbmp形式に限ります。gifやjpegを指定することはできません。また、あまり巨大な画像だと処理が遅くなるので注意してください。
これですべての準備が整いました。実行すると3次元的に回転する花の画像を表示されます。
このプログラムでは四角形をくるくる回転させています。四角形を定義するために4つの頂点を準備しています。この4つの頂点はOnCreateVertexBufferメソッド内で位置を指定しているのでここで位置の指定を変更すると四角形以外の図形が表現できます。
たとえば、最初の頂点の座標を次のように変更すると四角形ではなく三角形になります。
verts(0).Position = New Vector3(0.0F, 0.0F, 0.0F) |
■リスト2:1つ目の頂点の位置を変更する。
3次元空間なので座標を表す数値は3つあります。
頂点の数を変更することもできますが、それにはプログラムを何箇所か修正する必要があります。たくさんの頂点を設定すれば平面的な四角形だけではなくさまざまな立体を表現することもできます。
ただし、ゲームなどで使用される複雑な3Dのキャラクターはこのようにプログラムで生成するのではなくあらかじめ定義したファイルを読み込む形で構成されます。頂点の数を増やしてすべてをプログラムで表現することもできるのですがこの方法はかなり大変です。
カメラアングルの回転はSetupMatricesメソッドで行っています。回転する速度を調節するにはこのメソッドの中に2箇所登場する「1000」という値を変更します。たとえば、次のように変更するとゆっくり回転するようになります。
'▼時間経過による回転 Dim iTime As Integer = Environment.TickCount Mod 4000 Dim fAngle As Single = iTime * (2.0F * CSng(Math.PI)) / 4000.0F |
■リスト3:回転速度を遅くする。
今回紹介した例はシンプルさを重視しましたが、DirectXを使うと光源の設定や、面の質感の設定などいろいろなことができます。特に光源を利用するとプログラムが一挙にリアルに感じられるようになりはじめてのプログラマには感慨深いものがあるでしょう。
■画像4:光源を設定した場合の実行例(全体的に暗くして、上の方に光を当ててみました)
光源を使用する場合は面の向きを定義するために法線ベクトルを指定する必要があります。あなたは数学の知識を利用して面の法線ベクトルを求めることができますか?内積や外積を利用すべきでしょうか?3次元図形を移動・回転させるためには行列による座標変換も必要になります。こういう話をはじめるとわくわくする方もいらっしゃるのではないですか?
高校数学では机上の理論であったものが、今DirectXを介してあなたの目の前に一つの現実として現れます。
DirectXについてさらに勉強したい方はDirectXに付属のドキュメントを参照してください。
http://msdn.microsoft.com/library/ja/DirectX9_m/directx/dx9intro.asp
数学の知識の観点から考えると中学生にとってDirectXの制御かなり難しいものとなるでしょう。しかしチャレンジする価値はあります。
データベースとはデータをためておく場所のことですが、私たちが属しているプログラミングの世界で単に「データベース」といった場合は、コッド博士のリレーショナルデータベース理論(1970年)を基に発展した一連のソフト群を指します。
※非リレーショナルデータベースの製品も存在します。
現在、普及しているこのようなデータベースソフトのうち代表的なものを表にまとめました。
ソフト | 読み方 | 説明 |
---|---|---|
Access | アクセス | マイクロソフト社が一般向けに提供しているデータベース製品。あまり知識がなくても簡単にデータベースを構築できる。 |
SQL Server | エスキューエル サーバー | マイクロソフト社が提供する上級データベース製品。人類の英知の結晶の1つ。機能限定の無償版もある。 |
Oracle | オラクル | オラクル社が提供する上級データベース製品。人類の英知の結晶の1つ。機能限定の無償版もある。 |
■表3:主なデータベース製品
VBでデータベースを利用するプログラムを行う場合は、これらのデータベースソフトの種類をあまり気にしないでどのようなデータベースあれ似たような手法でプログラムをすることができます。
発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 はじめての方はよく誤解してしまうので念のためにもう少し正確にデータベースについて説明しておきます。 まず、「データベース」とは単にデータをためておく場所に過ぎません。Windows上ではデータベースの実体は1つまたは複数のファイルです。データベース上のデータは壊れてはいけませんし、読み書きするときもできるだけすばやく行わなければならないので各社はデータベースの構造をよく研究してそれぞれ独自の形式を採用しています。 データベースのデータを読んだり書いたりするのはデータベースエンジンと言う種類のソフトです。たとえばAccessの場合はJet(ジェット)というデータベースエンジンが使用されています。みなさんが作るVBのプログラムは直接データベースのデータを読んだり書いたりすることはなく必ずデータベースエンジンに命令して処理を行います。そのためデータベースの構造が各社で異なっていてもプログラマは同じような命令をするだけでデータベースに間接的にアクセスすることができるのです。 AccessやSQL ServerのManagement Studio(旧バージョンではEnterprise Manager)はこのように間接的にデータベースを管理する画面であってデータベースそのものではありません。特にAccessについて誤解が多いのはこの点です。これは小さな子供がディスプレイのことをパソコン本体であるのと勘違いしてしまうのと似たような誤解です。 Accessのデータベースを読み書きするのはJetです。みなさんが操作する見慣れた(?)Accessの画面は人間の便宜のために提供されているだけであって、あれがなくてもデータベースとしての機能は完全なのです。 お詫び:以前、この囲み記事ではAccessやEnterprise ManagerはデータベースではなくRDBMSであるという趣旨のことを書いていましたがこれは間違いでした。「RDBMS」という言葉についての完全な私の誤解によるものです。ご迷惑をお掛けしたことをお詫びいたします。本当のRDBMSの意味についてはWikpediaの解説をゆだねます。 |
VBではデータベースにアクセスするためにADO.NET(読み方:ADO.NET = エイディーオゥドットネット)というライブラリ(=クラスの集合)を使用します。ADO.NETはVBをインストールした時点ですでに組み込まれていますのでいきなり使い始めることができます。
今回はもっとも身近にあるデータベース製品であるAccessで使われるmdb形式のデータベースファイルを使ってデータを読み込んで表示する例を紹介します。
「Accessのmdbファイル」と言うとAccessがないと使えないように思ってしまうかもしれませんが、AccessがなくてもVBがあればmdbファイルを読み書きすることは可能です。これはmdb自体がデータベースであってAccessはそれを管理するソフトに過ぎないことを意味しています。このあたりの事情は上の囲み記事を参照してください。
以下の例ではマイクロソフトのサイトからサンプルとしてダウンロード可能なNwind.mdbを使用します。
このファイルは架空の航空会社ノースウィンドウのデータベースです。Accessを持っていればAccessでこのmdbファイルを開いていろいろとデータやプログラムを見ることができますが、今回はあくまでもVBから操作しますのでAccessは必要ありません。
それではサンプルを作成しましょう。コピー&貼り付けを使えば3分くらいでできあがるはずです。
まず、フォームにDataGridViewコントロールを貼り付けてください。DataGridViewコントロールはVB2005から新たに追加されたコントロールなのでVB.NET2002、VB.NET2003の場合は代わりにDataGridコントロールを貼り付けます。
そして名前を「Grid1」にしてください。
あとは以下のプログラムを貼り付けるだけです。
Private Sub Form1_Load(ByVal
sender As System.Object,ByVal e
As System.EventArgs)
Handles MyBase.Load Dim Cn As New OleDb.OleDbConnection Dim MDBFile As String = "C:\Nwind.mdb" Dim St As String St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=admin;" St &= "Jet OLEDB:Database Password=" Cn.ConnectionString = St Dim sqlSelect As New OleDb.OleDbCommand("SELECT LastName, FirstName, Address, HomePhone, Photo FROM Employees", Cn) Dim Adapter As New OleDb.OleDbDataAdapter(sqlSelect) Dim Table As New DataTable Adapter.Fill(Table) Grid1.RowTemplate.Height = 100 '←VB.NET2002,2003の場合はこの行をコメントにする! Grid1.Dock = DockStyle.Fill Grid1.DataSource = Table End Sub |
■リスト4:データベースからデータを読み込む例
MDBファイルのパスを指定している部分はダウンロードしたNwind.mdbのパスを指定します。みなさんの環境に合わせて変更してください。
VB2005で実行すると次のような画面が表示されます。
■画像5:リスト4をVB2005で実行したところ
VB.NET2002とVB.NET2003ではGrid1.RowTemplate.Height = 100の行をコメントにしてください。この行のせいではありませんが、残念ながら実行しても画像は表示されません。
このプログラムはデータベースからデータを読み込んできますが、読み込んでくるデータを指定するのにSQLという独特な命令を使用しています。SELECT LastName, FirstName...の部分がこのSQLです。SQLはデータベースプログラミングの世界では必須の要素です。本格的なデータベースプログラミングをしないとしても、これからはSQLの知識が必要となってくることでしょう。
参考までに今回のSQLを簡単に眺めておきましょう。
SELECT LastName, FirstName, Address, HomePhone, Photo FROM Employees |
このSQL文は「EmployeesテーブルからLastName, FirstName, Address, HomePhone, Photoの情報を取得しなさい」という意味になります。EmployeesテーブルとはNwind.mdbの中で従業員の情報を保存しているデータベースの一部分です。
データベース上ではすべてのデータをごちゃごちゃに持っているのではなく、意味のある単位ごとに分けて保存しています。この単位を「テーブル」と呼びます。Excelのシートのような表をイメージしていただければ近いです。
SQLを使うとこのように情報を取得するだけではなく、情報を書き込んだり削除したりすることができます。つまりデータベースに対するほとんどの命令はSQL文だけで可能なのです。
このSQL文をデータベースに渡して結果を受け取ったり忙しく働くのがADO.NETです。
今回の例ではOleDbConnectionクラス(読み方:OleDbConnection = オーエルイーディービーコネクション)、OleDbCommandクラス(読み方:OleDbCommand = オーエルイーディービーコマンド)、OleDbDataAdapterクラス(読み方:OleDbDataAdapter = オーエルイーディービーデータアダプター)、それとDataTableクラス(読み方:DataTable = データテーブル)がこのADO.NETの一部です。
このようにデータベースを扱うプログラムではADO.NETとSQL文を使って処理を進めることになります。そしてテーブルなどのデータベース自体に関する知識も必須になります。
VBを使ってExcelに書き込んだり、Excelから値を読み込んだりしたいという話はよく聞きます。Excelは最も多くの人が使っている業務用ソフトですからこのような要求がでてくるのも当然です。
幸いなことにExcelとVBはとても相性がよくこのような連携がとても簡単に行えます。
これはもともとはOLEオートメーションと言うテクノロジで、Excel以外でもこのテクノロジに対応しているソフトとならば自由に連携することが可能です。Excel以外ではWordやFrontPage, Outlook, Accessなどさまざまなソフトがこのテクノロジに対応しており、マイクロソフト社以外の製品でも多くの製品が対応しています。
話を広げすぎると収拾がつかなくなってしまうので今回は特に需要の多いExcelとの連携例として、Excelのワークブックに値を書き込んで保存する例を紹介します。
まず、プロジェクトを作成してExcelに参照設定をしてください。Excelは.NET Framework上で動作しているわけではないので参照設定するときはCOMの欄から「Microsoft Excel 11.0 Object Library」を選びます。「11.0」のところはバージョンなので少しくらい数字が異なっていても構いません。
後は次のようにプログラムするだけです。
'この3行がエラーになる場合は、下の囲み記事を参照 Dim Excel As New Microsoft.Office.Interop.Excel.Application Dim Book As Microsoft.Office.Interop.Excel.Workbook Dim Sheet As Microsoft.Office.Interop.Excel.Worksheet '▼前処理 Book = Excel.Workbooks.Add '新規ワークブックを作成 Sheet = Book.Worksheets(1) '最初のワークシートを選択 '▼セルに値を書き込んでいく Sheet.Cells(1, 1) = "名前" Sheet.Cells(2, 1) = "マクシミヌス・トラックス" Sheet.Cells(3, 1) = "ゴルディアス1世" Sheet.Cells(1, 2) = "説明" Sheet.Cells(2, 2) = "最初の軍人皇帝" Sheet.Cells(3, 2) = "元老院議員出身" '▼見栄えを整える Sheet.Range("A1:B1").Interior.ColorIndex = 40 '1行目をオレンジにする Sheet.Range("A:B").EntireColumn.AutoFit() '列幅を調節する '▼後処理 Book.SaveAs("C:\VB\Test.xls") '保存 Book.Close() 'ワークブックを閉じる Excel.Quit() 'Excelを終了する |
■リスト5:Excelに書き込んで保存する
この例を実行するとC:\VB\Test.xlsというファイルが作成されます。このファイルではいくつかのセルに文字が書き込まれ、また色が塗られています。
ただし、Officeインストール時の設定によってはこのプログラムの冒頭3行がエラーになり、修正が必要になる場合があります。
その場合修正する箇所は冒頭の3行ででてくるMicrosoft.Office.Interop.…のところです。以下のコードをそのまま貼り付けてうごかない場合はこの部分を削って単純にAs New Excel.Applicationや、As Excel.WorkBookなどとしてください。この作業の意味は下の囲み記事を参照してください。
何を言っているかわかりにくいと思うので画像も載せておきます。
参照設定をしているのに、このように冒頭の3行がエラーになる場合は、
このように修正する。 この意味は上のコードがOfficeのPIAがインストールされている場合の例、下のコードがそうでない場合の例です。 PIAとは「プライマリ相互運用機能アセンブリ」のことで、これはVBなどの.NET環境からExcelなどのCOMを操作する場合の正式に検証された橋渡し役のアセンブリ(機能の単位)を意味します。 正式なものでなくとも良いというのであれば下のコードのように書き換えることで動作させることもでき、だいたいの場合問題なく動作するようです。 しかし、PIAが提供されているのであればやはりメーカーが正式に提供するPIA経由で操作するのが信頼性の高い方法です。Excelに関してもPIA経由での操作が正式なものであって、そうでないものは非公式であるとマイクロソフトは言っているようです。 XPに関するものですが資料 http://support.microsoft.com/kb/328912/ja
PIAがインストールされていない場合はコントロールパネルのプログラムのアンインストールまたは変更画面で「.NET プログラミング サポート」を選択すればインストールされます。※インストールの要件・条件等はマイクロソフトの公式情報を参照してください。
■画像6:Excel 2003でのPIAのインストール 以上、このサンプルがエラーになる場合があることについての報告、およびPIAについての情報は掲示板にていただきました。ご協力くださった方々ありがとうございます。 |
発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 上の例では.NET Framework上でExcelのオブジェクトを開放するプログラムを行っていません。世間ではこのようなオートメーションを利用したプログラムを行う際は最後にSystem.Runtime.InteropServices.Marshal.ReleaseComObjectメソッドを使ってオブジェクトを開放するのが標準となりつつあるように思えますが、この開放作業は必須ではありません(それに面倒なので私が個人的にやりたくありません)。 Excelなどの外部のアプリケーションを使って業務で使用するなど本格的な機能をプログラムする際はオブジェクトの開放についてもちゃんと理解しておいてください。 |
Excelがどのようなクラスを持っていて、どのような命令を受け付けるのかは調べるしかありません。主な資料はやはりMSDNライブラリです。またはExcelのマクロ機能を使ってVBAのソースコードを作成してからそれをVBに移植することも可能です。
この例のようにExcelなど外部のアプリケーションをVBから操作する場合の最大の困難は情報の不足です。どのような命令があってどのように使用するのかわからなければとてもプログラムできません。
しかし、適切な情報さえあればあたかもそのアプリケーションがVBの一部であるかのように簡単にプログラムすることができるのです。ここで私がExcelを例にとって紹介したからと言ってこの手法がExcelにしか通用しないように誤解しないでください。このテクノロジはとても応用範囲が広く、VBからさまざまなことを可能にします。
COMテクノロジの可能性を示すために小さな例ですがもう1つだけ紹介しておきましょう。Microsoft Speech Object Libraryに参照設定して次のコードを実行するとコンピュータがしゃべります。Microsoft Speech Object Libraryが参照設定の一覧にない人は環境がないのでこの機能を利用することはできません。
まずはVBで以下の通りプログラムして実行してみてください。
Dim
Computer As New SpeechLib.SpVoice Computer.Speak("Hello, こんにちは。I am " & Environment.UserName) |
■リスト6:コンピュータをしゃべらせる。日本語がしゃべれない環境の場合は「こんにちは。」は無視される。
たいていの環境で英語の部分はしゃべってくれると思います。
Microsoft Speech Object LibraryにはPIAは提供されていないのでリスト6の書き方が唯一の書き方です。大多数のCOMオブジェクトはPIAが提供されていません。 |
日本語の部分をしゃべらせるには日本語の音声合成エンジンが必要です。お使いのパソコンで使用可能な音声合成エンジンを列挙するには次のようにプログラムします。
Dim Computer
As New SpeechLib.SpVoice Dim voiceInfo As SpeechLib.ISpeechObjectToken Dim st As String = "" For Each voiceInfo In Computer.GetVoices st &= voiceInfo.GetAttribute("Name") & " " & voiceInfo.GetAttribute("Language") & vbNewLine Next MsgBox(st) |
■リスト7
このプログラムでは日本やアメリカを表すのに文字列でなく数字によるコードをつかっているのでぱっと見では何語をしゃべるエンジンなのかわかりません。
この一覧にLH KenjiやLH Naokoといった日本語の音声合成エンジンが表示されればご使用の環境では日本語をしゃべらせることができます。これらの音声合成エンジンはExcel 2002やExcel 2003で読み上げ機能をインストールするとインストールされるようです。Office 2000やOffice 2007にはこの機能はないようです。
■画像7:たとえばExcel 2003の読み上げ機能をインストールすると日本語でしゃべれるようになる。
LH Naokoが利用できる環境でLH Naokoにしゃべらせるには次のようにプログラムします。
Dim Computer
As New SpeechLib.SpVoice 'LH Naokoにしゃべらせる For Each voice As SpeechLib.ISpeechObjectToken In Computer.GetVoices If voice.GetAttribute("Name") = "LH Naoko" Then Computer.Voice = voice Exit For End If Next Computer.Speak("Hello,こんにちは。 I am " & Environment.UserName) |
■リスト8
ところで、すばらしいことにVB2008以降ではCOMを使わなくても.NET Franeworkの標準の機能でコンピューターにしゃべらせることができます。System.Speechに参照設定すれば次のプログラムでしゃべらせることができます。
Dim Computer As New Speech.Synthesis.SpeechSynthesizer Computer.Speak("Hello,こんにちは。 I am " & Environment.UserName) |
■リスト9
さらに、次のコードではしゃべった内容をwavファイルに保存することができます。
Dim Computer
As New Speech.Synthesis.SpeechSynthesizer Computer.SetOutputToWaveFile("C:\VB\MySpeech.wav") Computer.Speak("Hello,こんにちは。 I am " & Environment.UserName) Computer.Dispose() |
■リスト10
内部的には.NET版もCOMのMicrosoft Speech Object Libraryを使ったときと同じ仕組みが使われており、音声合成エンジンも共通です。ですのでやり方は異なっていてもできることは一緒で、wavファイルへの保存もCOM版でも可能ですし、.NET版でもCOMを使ったときと同じように使用できる音声合成エンジンを列挙したり、LH Naokoを選択したりといったこともできます。
ただ、やはり.NET版の方がVBから扱いやすくできています。
なお、COMで日本語の音声合成エンジンが利用できない場合はSystem.Speechでも利用できません。
ほとんどのCOMオブジェクトはProgIDという独特の文字列で識別可能になっています。これを利用すると参照設定しなくともCOMを呼び出すことができます。今回紹介したSpVoiceのProgIDはSAPI.SpVoiceです。これを使った例を紹介します。
■リスト11 |
以上4つのテクノロジを具体的な例をあげて説明しました。しかし主だったテクノロジはこの4つだけではありません。
たとえば、Webアプリケーションは.NET Frameworkの中でも大きな一角を占めるテクノロジです。
Webアプリケーションはインターネットエクスプローラなどのブラウザ上で操作するアプリケーションです。ブラウザ上での操作を前提としているため、インターネットで公開して世界中の人に使ってもらうこともできますし、学校などの限られたネットワーク内で情報を共有するために使用することもできます。
Webアプリケーションはクライアントであるブラウザ上ではHTMLコードとして実行され、VBで書いたプログラムの部分はサーバー上で実行されるのが大きな特徴です。
Webアプリケーションではセキュリティについて理解することも必要となります。Webアプリケーションは不特定多数が使用する場合がありますし、一般に公開された回線を使用してプログラムが動作する場合があるので外部の悪い人に攻撃されることがあるからです。
なお、VB2005のExpress EditionではWebアプリケーションを作成できません。この場合は代わりにやはり無償で提供されているVisual Web Developer 2005 Express Editionを使用します。Visual Web Developerを使うとVBまたはC#を使ってWebアプリケーションを作ることができます。
細かいレベルで見ると最初に表で挙げたようにもっといろいろなテクノロジがあります。すべての分野を深く追求することはかなりの困難が伴い実用的ではありません。みなさんは自分の方向性を定めて優先順位をつけて学習していくのがよいでしょう。
たとえば、ゲームやマルチメディア関連に興味ある方はDirectXを勉強すべきですし、データベースに興味があるならばADO.NETとSQLは欠かせません。
このようにプログラマにはいろいろな選択肢が用意されていますが、どのような選択肢を選んだとしても基本となるVBの知識は必須です。また、VBの基盤ともいえる.NET Frameworkの知識も必ずや役に立つでしょう。
今回はいろいろなテクノロジを概観できて即効性はなくても意義の深い説明になったと思います。これらの説明がみなさんの将来のための参考になることを願います。