はじめに
Microsoft Accessには、データベース開発者がデータベース内の既存のデータをクエリして新しいデータを入力する際にユーザーをガイドできるデータ入力フォーム、レポート、およびクエリを作成できるようにするための多くの機能が含まれています。さまざまなクエリビルダーおよびウィザードツールにより、この開発プロセスが容易になります。ただし、これらのツールを使用しても、開発者がMSAccess開発ツールでまだ提供されていない機能をさらに追加したい場合があります。たとえば、開発者は、データベースに保存する前に不良データを自動的に修正したり、ビジネスルールに違反した場合にアラートを表示したり、ユーザーが1つのデータ入力フォームから別のデータ入力フォームに移動したり、カスタムフィルターを使用してレポートを起動したりすることができます。このようなカスタマイズを実現する方法は、Visual BasicforApplicationsプログラミング言語を使用してコードを追加することです。
Visual Basic for Applications(VBA)は、ExcelやAccessなどのMicrosoftOfficeファミリのソフトウェア製品で使用されているプログラミング言語です。 VBA言語は、1964年に発明され、1970年代にパーソナルコンピュータで普及した「基本」言語から派生しています。名前の「ビジュアル」部分は、MicrosoftWindowsでのBasicプログラミング言語の使用を反映するためにMicrosoftによって追加されました。
基本的なプログラミングを紹介するチュートリアルはたくさんあります。このチュートリアルでは、MSAccessで使用されるVBA言語の機能の小さなサブセットに焦点を当てます。
コンテンツ
- MicrosoftAccessのイベント
- VBAコードの例:名前が適切な場合にあることを確認する
- VBA言語–変数、条件文、コメントの宣言と割り当て
- VBA言語–関数、メソッド、および例
- VBA言語–プロパティ
- VBAコーディング演習
- VBAでのエラーの処理
- VBAでのカスタムSQLクエリの実行
次のページでは、MicrosoftAccessのイベントを紹介します。
MicrosoftAccessのイベント
Accessでは、VBAプログラミングコードがフォームとレポートに添付され、特定の時間に、または特定のイベントに反応して実行されるように設定できます。このスタイルのプログラミングは、「イベントベース」プログラミングと呼ばれることもあります。これは、開発者が作成したコードが何らかのイベントに応答して実行されることを意味します。 。
フォームがフォームビューに表示されると、通常、基になるテーブルから既存のデータをクエリし、ユーザーが何かをするまでアイドリング状態で待機します。たとえば、ユーザーはナビゲーションボタンの1つをクリックして次のレコードに移動したり、テキストボックスをクリックして新しいデータの入力を開始したり、[閉じる]ボタンをクリックしてフォームを閉じたりすることができます。これらの各アクションにより、イベントが発生します フォームで起こっています。マウスをクリックするか、キーボードをストロークするたびに、イベントとして処理されます。
ほとんどの場合、イベントにはデフォルトの動作があります。 「次のレコード」ナビゲーションボタンをクリックすると、フォームが次のデータレコードにスクロールします。カーソルがテキストボックス内にあるときに文字「C」を入力すると、文字「C」がテキストボックスに表示されます。 Tabキーを押すと、カーソルがフォーム上の次のテキストボックス(またはコントロール)にジャンプします。プログラマーは、このデフォルトの動作をオーバーライドまたは拡張し、イベントに応答して実行される独自のコードを挿入できます。
アクセスフォームとレポートでのVBAプログラミングは、主にさまざまなイベントに応答するコードの記述に重点を置いています。
イベントの詳細に飛び込む前に、簡単な例を実装することは有益かもしれません。動作中のコードを確認するために、このチュートリアルの次のセクションでは、データ入力フォームにVBAコードを追加するためのウォークスルーを提供します。
VBAコードの例:名前が適切な場合にあることを確認する
以下は、MSAccessのデータ入力フォームにVBAコードを追加する比較的簡単で簡単な例です。簡潔にするために、いくつかの詳細はスキップされます。この例の後、このチュートリアルの残りの部分でそれらの詳細を入力します。
この例では、顧客を使用しています AdvancedMSAccessFormsチュートリアルでカスタマイズされたデータ入力フォーム。続行する前に、そのチュートリアル(または少なくとも顧客データ入力フォームを扱う部分)を完了することをお勧めします。
新しい顧客情報を入力するときは、顧客の名前が「適切な大文字小文字」で入力されていることを確認したいと思います。つまり、名前の最初の文字は大文字で、残りの名前は小文字にする必要があります。ユーザーが「joe」と入力した場合、フォームはこれを適切なケース「Joe」に自動的に修正します。
イベントに関しては、顧客フォームの[名]フィールドの[更新後]イベントに接続するコードを追加します。これは、後を意味します 何かが変更されました(更新 )[名]フィールドで、[更新後]イベントがトリガーされ、入力した名前が適切な大文字と小文字に変換されることを確認するために、作成するコードが実行されます。
次の手順で、このコードを配置します。
- デザインモードでの顧客データエントリを開きます。
- FirstNameを右クリックします テキストボックスを選択し、プロパティを選択します ポップアップメニューから。
- プロパティシートの場合 が表示されたら、[イベント]タブをクリックします。これを次の図に示します。
表示されるイベントのリストに注意してください。それぞれが、 FirstNameに発生する特定のイベントに応答するようにプログラムできます。 テキストボックス。
- After Updateイベントの右側にある3つのドットをクリックして、新しいイベントハンドラーを作成します。
- ビルダーを選択 ウィンドウが表示されます。 コードビルダーを選択します 次に、[ OK]をクリックします ボタン。
- VBAコード編集ウィンドウが表示されます。 Accessは、Private Subという単語で始まり、End Subという単語で終わるサブルーチンスタブをすでに作成していることに注意してください。
サブルーチンの名前は、フォームコントロールの名前(FirstName)とこのサブルーチンが応答するイベント(AfterUpdate)。End Sub行は、この特定のサブルーチンが終了する場所です。
- PrivateSubとEndSubの間の空の行に次のコードを追加します。
FirstName = StrConv(FirstName, vbProperCase)
完了すると、コードは次のように表示されます。
この新しいコード行は次のことを行います:
StrConvは、FirstNameテキストボックスの内容を受け取り、この例ではvbProperCaseである2番目のパラメーターに従って変換する関数です。この変換が完了すると、結果は(等号を使用して)FirstNameテキストボックスに割り当てられます。これにより、現在FirstNameテキストボックスにあるものがすべて上書きされます。たとえば、この関数は「sally」を取得し、それを「Sally」に変換してから、「Sally」をFirstNameテキストボックスに入力します。
- ファイルをプルダウンして、この新しいコードを保存します メニューをクリックして保存を選択します 。
- 新しいコードをテストします。 MicrosoftAccessデザインモード画面に戻ります。ビューをフォームビューに変更します。
- 空のレコードに移動します。 FirstNameフィールドをクリックし、すべて小文字で名前を入力します。
- タブを押します 次のテキストボックスに移動するためのキー。以下に示すように、ジョーの名前を「ジョー」に変更する必要があります。
- エラーが発生した場合は、VBAコードエディタに戻り、コードのすべての部分のスペルが正しいことを確認してください。 実行をプルダウンする必要がある場合があります メニューからリセットを選択します VBAコードの実行を停止するため。
上記の例では、フォームの動作をカスタマイズして、ユーザーが適切にフォーマットされたデータをデータベースに入力できるようにする方法を簡単に説明しました。この例ではいくつかの詳細がスキップされました。これらの詳細については、このチュートリアルの残りの部分で説明します。
VBA言語
このセクションでは、MSAccessで使用されるVBA言語の主要部分を簡単に紹介します。 VBAの包括的な概要は、このチュートリアルの範囲を超えています。このチュートリアルの最後に、より包括的な書籍や資料への参照が記載されています。
変数の宣言
変数 プログラマーがデータを格納できるプレースホルダーに付けられた名前です。たとえば、変数を使用して数値を格納し、その変数に対していくつかの数学演算を実行したり、その値を他の変数と比較したりする場合があります。特定のデータ型の値を保持するように変数を宣言できます 整数、文字列、日付など。新しい変数を宣言するには、Dimステートメントを使用します。たとえば、 MyNameという名前の新しい変数を宣言するには 文字列(文字)を保持するように設定するには、次の手順を実行します。
文字列としてstrMyNameを薄暗くする
「AccountBalance」という名前の新しい変数を宣言し、小数点以下の数値を格納するように設定するには、次を使用します。
Dim dblAccountBalance As Double
値の割り当て
値は、等号を使用してフォーム上の変数またはコントロールに割り当てることができます。たとえば、名前「Alex」をMyName変数に格納するには、次を使用します。
strMyName =“ Alex”
FirstNameテキストボックスの内容をMyName変数にコピーするには、次を使用します。
strMyName =[FirstName]
値は、割り当てられる前に計算することもできます。たとえば、次の式は、現在の顧客のアカウント残高を[Balance]テキストボックスから取得し、1%の利息を追加し(残高に1.01を掛けて)、結果を$10減らします。最後に、結果がAccountBalance変数に割り当てられます。
dblAccountBalance =([バランス] * 1.01)– 10.00
条件文
条件ステートメントは、論理テストを使用して、次に実行するコード行を決定します。 If…Then条件文は非常に頻繁に使用されます。例:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
論理式AccountBalance<1000が評価されます。この式がtrueの場合(たとえば、AccountBalanceが$ 400の場合)、Thenの後の次の行が実行されます。この例では、MonthlyFee=10です。
この式がFalseの場合、Elseの後の行が実行されます。
論理式には、ブール演算子OR、AND、およびNOTによって接続されるいくつかの部分を含めることができます。ブール式の詳細については、このプログラミングチュートリアルを参照してください。たとえば、アカウントが1年未満の場合、月額料金を免除するとします。アカウントの月数としてAccountAgeがあると仮定します。その場合、コードは次のようになります。
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
If…ThenステートメントとIf…Thenステートメントで複数行のコードを実行できます。
コメント
プログラミング言語でプログラミングする場合は、コードを説明するコメントを含めることをお勧めします。 VBAでは、一重引用符で始めることでコメントを含めることができます。上記を例にとると、次のコメントを追加できます。
VBA言語のその他の部分については、次のページで説明します。
VBA言語–続き
機能
VBA言語には、数学関数(sin、cos、tan)、文字列関数などのさまざまなタスクを実行するために使用できる多数の組み込み関数とメソッドがあります。関数には通常、関数で使用される1つ以上の入力パラメーターがあります。たとえば、関数Cos(45)では、「45」は余弦関数が動作する入力角度です。 StrConv関数には、変換する文字列と変換スタイルの2つの入力パラメーターが必要です。
StrConv(FirstName、vbProperCase)
いくつかの便利な機能は次のとおりです。
MsgBox(プロンプト、ボタン、タイトル) | プロンプトテキスト、ボタン、タイトルを含むポップアップメッセージボックスを表示する |
StrConv(expression、style) | 文字列式を大文字、小文字、または適切な大文字小文字に変換します |
Left(expression、characters) | 文字列式から左端の文字を取得します |
Mid(expression、start、characters) | 開始から始まる文字列式から文字の中央のセットを取得します |
IsNull(式) | 文字列式(またはテキストボックス)に内容がない(nullである)かどうかをテストします |
Nz(expression、value_if_null) | 式がnullの場合、デフォルト値を入力します |
Now() | 現在の日付と時刻を返します |
Round(expression、decimals) | 数値式を小数点以下の桁数に丸めます |
RGB(赤、緑、青) | 赤、緑、青の組み合わせに基づいて色の整数を返します |
メソッド
VBAのメソッドは関数に似ていますが、フォームまたはレポート上のコントロールまたはその他のオブジェクトに接続されています。
いくつかの便利な方法は次のとおりです。
DoCmd.CancelEvent | 処理中の現在のイベントをキャンセルします |
DoCmd.Close | 現在のフォーム(またはデータベース)を閉じます |
DoCmd.OpenForm | 新しいフォームを開きます |
DoCmd.OpenReport | 新しいデータや更新されたデータの保存、変更の取り消し、フォームの終了などのMSAccessコマンドを実行します |
.SetFocus | フォームのコントロールにフォーカスを設定します |
。元に戻す | 最新の変更またはコマンドを元に戻す |
.Refresh | フォームの基礎となるすべてのデータを更新します |
.Requery | フォームに提供されたデータを再クエリします |
.Repaint | フォームのすべてのコントロールを再描画します |
このMicrosoftサイトには、さらに多くの機能とメソッドがリストされています。
次の一連の例では、さまざまな関数とメソッドをさまざまな組み合わせで使用しています。
例
アカウントの残高が1,000ドル未満の場合は、ユーザーに警告を表示します
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
フォームのFirstNameテキストボックスに何かが含まれている場合は、適切な大文字と小文字を区別して変換します
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
次のページでは、さまざまなオブジェクトのプロパティを紹介します。
プロパティ
データ入力フォームまたはレポートの各要素には、一連のプロパティがあります それに関連付けられています。プロパティは、各コントロールの配置、色、フォント、背景、その他の外観およびフォーマット属性を制御します。たとえば、TextBoxの多くのプロパティには次のものがあります。
表示 | フォームにテキストボックスが表示されているかどうかを判断します |
ロック済み | テキストボックスのデータを変更できるかどうかを判断します |
タブインデックス | ユーザーがTabキーを押してフォームをナビゲートするときの各コントロールの順序 |
ラベル | テキストボックスに関連付けられているラベルの名前を識別します |
幅、高さ、上下の位置 | テキストボックスの相対的な位置とサイズを示します |
背景のスタイルと色 | テキストボックスの背景スタイルと色を設定します |
境界線のスタイルと色 | テキストボックスの周囲の境界線のスタイルと色を設定します |
フォントのサイズ、太さ、下線、斜体、色、配置 | フォントとスタイルを設定します |
マージンとパディング間隔–テキストボックスの内側のマージンとパディングを設定します |
プロパティは、デザインビューを使用して設定し、フォームまたはレポートとともに保存できます。フォームの実行中にVBAコードを使用してプロパティを変更することもできます。 VBAのプロパティにアクセスするには、コントロールの名前、ピリオド、プロパティの名前の順に使用します。たとえば、次のコードは、CustomerIDテキストボックスのフォントの色を赤に変更します。
CustomerID.ForeColor =vbRed
次のセクションでは、VBAプログラミング言語のさまざまな部分を組み合わせて、さまざまなデータ入力フォームの動作をカスタマイズするいくつかの演習を提供します。
VBAコード演習
フォームをカスタマイズする次の演習を試してください。現在の演習に合わせて調整できるコードの例については、前のセクションに戻って参照してください。
演習1
CustomerDataEntryフォームを変更して、名と名前を適切な大文字と小文字に変換する2つのAfterUpdateイベントハンドラーを追加します(テキストボックスごとに個別のAfterUpdateハンドラーを作成します)。テキストを変換する前に、テキストボックスがnullでないことを最初に確認するコードを記述します。
演習2
AccountsDataEntryフォームを変更して、アカウントの残高が5,000ドル未満の場合に警告メッセージボックスを表示するAfterUpdateイベントハンドラーを追加します。また、[バランス]テキストボックスのフォントの色を赤にします。
演習3
顧客データ入力フォームを変更します。ユーザーが何も入力せずにFirstNameテキストボックスを離れた場合に、FirstNameテキストボックスのラベルを赤(vbRed)にするOnLostFocusサブルーチンを作成します。テキストボックスに何かがある場合は、ラベルを青(vbBlue)に設定します。以下の例では、FirstNameテキストボックスに何も入力されていないため、ユーザーは次のテキストボックスにタブで移動し、FirstNameラベルが赤に変わります。
このチュートリアルの次のページでは、VBAコードのエラーを処理する方法について説明します。
VBAでのエラーの処理
時折、VBAコードでエラーが発生することがあります。たとえば、テキストボックスが空で、テキストボックスの内容を適切な大文字と小文字に変換しようとすると、StrCnv関数は失敗します。もう1つの例は、ゼロ除算が発生した場合です。エラー処理がないと、これらの問題によりVBAプログラムがクラッシュする可能性があります。エラーが発生すると、特別なコードが起動してエラーを処理し、VBAコードの処理を続行できます。
VBAの2つの主要なエラー処理機能は、OnErrorGotoステートメントとResumeNextステートメントです。これらの2つのVBAコードステートメントは連携して、VBAがアプリケーションをクラッシュさせないようにします。
On Error Gotoステートメントは、サブルーチンでエラーが発生したときに何をすべきかをVBAに通知します。ステートメントのGoto部分は、VBAが引き続き機能するコード内の他の場所のラベルを参照しています。 VBAプログラムがラベルに到達すると、エラーはErrというオブジェクトに表示されます。プロパティErr.Descriptionには、発生した最新のエラーのテキスト説明が含まれます。 Resume Nextステートメントにより、VBAプログラムはエラーが発生した後の時点から実行を継続します。
次の例は、このチュートリアルの最初に紹介したFirstName_AfterUpdateルーチンを拡張したものです。これで、VBAプログラムは、プログラムで発生する可能性のあるエラーを処理できます。
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
このチュートリアルの次のセクションでは、VBA内にSQLコードを含める方法について説明します。
VBAでのカスタムSQLクエリの実行
構造化照会言語(SQL)は、MS Access、SQL Server、Oracleなどのリレーショナルデータベースで使用されるプログラミング言語です。 SQLステートメントを使用して、テーブルからデータレコードを挿入、更新、削除、および取得(選択)することができます(他の多くの機能の中でも)。 SQLステートメントの簡単な例は次のとおりです。
SELECT customerid, firstname, lastname FROM customer
SQLコードはVBA内で記述し、適切なタイミングで実行できます。たとえば、VBAサブルーチンを記述して、Customerテーブルにクエリを実行し、最高のCustomerIDを見つけることができます。次に、この番号に1を追加して、新しいレコードの新しい未使用のCustomerIDを取得できます。
このタイプのタスクを実行するための一般的な手順は次のとおりです。
SQLステートメントを作成する
開いているデータベース接続(VBAではCurrentDbという名前)を使用してSQLステートメントを実行します
結果のレコードを取得し、取得したデータを使用します
このVBAサブルーチンを作成するには、CustomerDataEntryフォームを開き、CustomerIDフィールドのプロパティを取得します。 [イベント]タブで、OnDblClickイベントの右側にある3つのドットをクリックします。コードビルダーを選択すると、スタブが次のように作成されます。
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
次のコードを追加します:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
すべてが配置されると、コードは次のようになります。
ファイルを保存してから、CustomerDataEntryフォームを表示します。新しいレコードに移動し、CustomerIDフィールドをダブルクリックします。新しいCustomerIDが自動的に作成されます。