トップ > スキル : アプリケーション > VBA for Access > 応用編(マクロをVBAに変換)

VBA_Access

マクロをVBAに変換

Accessは、Excelなどの他のOffice製品と違って、マクロとVBAは分けて存在します。よって、マクロ=VBAという考えではありませんので、マクロをVBAに変換する必要があります。

VBAへ変換

フォームをデザインビューで開きます。
[データベースツール]タブを選択して、[マクロ]グループの[フォーム マクロをVisual Basicに変換]ボタンをクリックします。

[フォーム マクロの変換]ウィンドウが表示されます。そのまま[変換]ボタンをクリックします。

「変換が終了しました。」メッセージが表示されます。[OK]ボタンをクリックします。

これでマクロからVBAへの変換操作は終わりです。ここでフォームを保存しないで閉じてしまうと、変換された情報は消えてしまいますので、変換した内容を残したい場合は上書き保存をします。もし、必要でなければ上書き保存をしないで閉じてください。

VBE画面でコードを確認

フォームのコンボボックスを選択して、プロパティシートを確認します。イベントの更新後処理プロパティが[イベントプロシージャ]となっていることを確認します。

右端の…ボタンをクリックします。

VBE画面に切り替わり「Form_DM表示フォーム(コード)」のコードウィンドウが表示されます。
また、[プロジェクトエクスプローラ]ウィンドウには、「Form_DM表示フォーム」クラスモジュールが表示されていることも確認します。

クラスモジュールなので、マクロからVBAへ変換されたプロシージャはイベントプロシージャとなります。つまり、フォームまたはレポート内の限定されたアクションのみに利用されるプログラムとなります。

※プロジェクト エクスプローラのボタン類

このウィンドウの上には3つのボタンが配置されています。左から[コードの表示]、[オブジェクトの表示]、[フォルダの切り替え]となっていて、[フォルダの切り替え]ボタンをクリックすると、モジュールごとにフォルダ形式で表示します。

[コードの表示]ボタンは、選択したモジュールの[コード]ウィンドウを表示したい時にクリックします。
[オブジェクトの表示]ボタンは、選択されているプロシージャが設定されたオブジェクトがAccess画面に切り替って表示されます。

コードの確認

記述内容を確認してみましょう。

◆ 《Cmd選択_AfterUpdate》プロシージャ
【コメント】

行頭に「’」(シングルクォーテーション)がある行は、コメント行となります。この行は、動作には全く関係ない注釈となります。コメントを書くことで、第三者にもどのような記述内容であるかを、簡潔に伝えることができます。既定では、緑色で表示されます。


【プロシージャ名】

「Private Sub cmb選択_AfterUpdate()」からプログラム開始となります。cmb選択がプロシージャ名で、AfterUpdate()がイベント名となります。

※ 標準モジュールの場合、イベントには割り当てないので、プロシージャ名だけとなる。
     例) Sub テスト()


【エラートラップ】

「On Error GoTo cmb選択_AfterUpdate_Err」
On Errorステートメントで、エラー処理を行いたい時に利用します。これにより、プログラム実行中にエラーが発生した場合、指定した位置にプログラムの制御を移すことができます。

【書式】 On Error GoTo Line

Line:エラーが発生した時に制御を移す位置(行ラベル指定)

通常、Lineの箇所には、エラー処理のための位置を指定した行ラベルを記述します。
「On Error GoTo cmb選択_AfterUpdate_Err」であれば、「cmb選択_AfterUpdate_Err」が行ラベル名になります。End Subから3行上に「cmb選択_AfterUpdate_Err:」と記述しています。最後の「:」は、ラベル行であることを意味します。つまり、「:」がインデックスのような働きを指定する記号となります。
もし、エラーが発生した場合は、「cmb選択_AfterUpdate_Err:」へ処理が移動して、MsgBox Error$を実行します。


【本動作】

txtタイトル = DLookup("[DM題名]", "DMテーブル", "DM_ID=[cmb選択]")
txt内容 = DLookup("[内容]", "DMテーブル", "DM_ID=[cmb選択]")

この2行が[DM表示フォーム]のコンボボックスでの動作になります。


【行ラベル】
	cmb選択_AfterUpdate_Exit :
		Exit Sub
        
	cmb選択_AfterUpdate_Err :
		MsgBox Error$
		Resume cmb選択_AfterUpdate_Exit
    

行末に「:」がある行が行ラベルになります。
On Errorステートメントで記述されたラベルは、「cmb選択_AfterUpdate_Err:」なので、エラーが発生した時は、この行ラベルにジャンプして、MsgBox Error$を実行します。これはErrorコードを表示しなさいという意味です。

次の「Resume cmb選択_AfterUpdate_Exit」はエラー処理ルーチンであるResumeステートメントを利用しています。

ステートメント 説明
Resume[0] エラーが発生したコードに戻る
Resume Next エラーが発生した次のコードに戻る
Resume Line 指定した行ラベルに戻る

ここでは、「cmb選択_AfterUpdate_Exit」ラベルへジャンプしなさいという意味になります。
「cmb選択_AfterUpdate_Exit:」行ラベルにジャンプしたら、「Exit Sub」を実行します。これは、このプロシージャから脱しなさい(終了しなさい)という意味になります。


※「cmb選択_AfterUpdate_Exit:」行ラベルと「cmb選択_AfterUpdate_Err:」行ラベルの配置

エラーが発生した場合、最初は一番下のラベルにジャンプして、次にその上のラベルにジャンプするエラートラップとなります。単純に、「cmb選択_AfterUpdate_Err:」行ラベルのルーチンの最後に「Exit Sub」を記述すれば、「cmb選択_AfterUpdate_Exit:」行ラベルは不要に感じます。しかし、プログラムは上から順番に処理を行うことになるので、正常に動いても「MsgBox Error$」を実行してしまいます。よって、正常に動いた(エラーがない)場合、本動作が処理された後にこのプロシージャから抜け出す仕組みが必要になります。よって、このような記述となるので、このエラー処理の記述方法は覚えておく必要があります。

※ エラー番号

ErrorオブジェクトのNumberプロパティとDescriptionプロパティを利用すると、エラー番号と内容が表示されて、原因を探しやすくなります。

【書式】 Err.Number
【書式】 Err.Description

※ On Error Resume Next

実行時エラーが発生してもプログラムを中断せずに、エラー発生したステートメントの次のステートメントから実行を継続できます。エラーが発生しても問題がない場合に利用しますが、安易に利用してしまうとプログラミングミスを見逃すことにもなります。

※ エラー処理ルーチンを無効化

エラー処理ルーチンを無効にするには、「On Error GoTo 0」と記述します。

◆ 《btn印刷_Click》プロシージャ

2つ目のプロシージャである、btn印刷_Clickは、フォームの[印刷]コマンドボタンをクリックした時のアクションです。On Errorステートメントとエラートラップは、先ほどの「Private Sub cmb選択_AfterUpdate()」と同様の動作を取り、ラベル名が異なるだけです。

本動作(処理)は1行の長い構文になっています。DoCmdオブジェクトを使用したステートメントで、マクロからVBAに変換したイベントプロシージャは、通常はこのDoCmdeオブジェクトのメソッドとして扱われます。このプロシージャは、OpenReportメソッドを使用しています。

OpenReportメソッド(レポートを開く)

【書式】 DoCmd.OpenReport reportname[,view][,filtername][,wherecondition][,Windowsmode]

reportname:開くレポートの名前を文字列で指定
view:acViewDesign,acViewNomal(既定値),acViewPreviwのいずれかを指定
filtername:クエリの名前を文字列で指定
wherecondition:SQL Where句を文字列で指定。Whereを指定する必要はない。
windowsmode:Windowsモードの指定。通常はacNormal

DM表示フォームのコンボボックスで指定されたDM_IDのレコードをDMテーブルから同じDM_IDのレコードを指定(抽出)して、[DM印刷レポート]を印刷プレビューで開く処理となります。


※ 1行の構文を改行して2行にする

一般的に処理は1行で書き切る必要があります。命令文を途中で改行してしまうとエラーが発生します。

しかし、長い命令文を1行で書くと、度々横スクロールをすることになり、操作しにくくなります。
本来は1行となるが、それを2行にして記述する方法があります。
方法は、2行目にしたい箇所に半角スペースと「_」(アンダースコア)の記号を入力して改行します。

2行にわたってステートメントを記述しますが、この記述方法を利用すると、コンピュータは1行として扱ってくれます。