AccessVBA の変更点


*Access VBA [#h72cd1c3]

#contents

**オブジェクトの参照方法 [#ece40a6e]
 Forms!フォーム名
 Reports!レポート名

**プロパティの参照方法 [#ea59bff0]
 Forms!フォーム名.プロパティ名の英語表記
 Reports!レポート名.プロパティ名の英語表記

 Forms!フォーム名!コントロール名.プロパティ名の英語表記
 Reports!レポート名!コントロール名.プロパティ名の英語表記
 
***プロパティの参照方法(例) [#rc61f59a]
[F_顧客登録]フォーム上にある[cmd実行]コントロールの[標題]プロパティを参照する。
 Forms!F_顧客登録!cmd.実行.Caption

**主なプロパティ名 [#s2d760ec]
|プロパティ|英語表記|意味|
|標題|Caption|タイトルバーに表示する文字列。ラベルに表示する文字列|
|レコードソース|RecordSource|レコードのデータソース|
|コントロールソース|ControlSource|コントロールに表示するデータ|
|可視|Visible|コントロールに表示するかどうか|
|使用可能|Enabled|コントロールにフォーカスを移動できるかどうか|
|値集合タイプ|RowSourceType|コンボボックスまたはリストボックスに表示するデータの種類|
|値集合ソース|RowSource|コンボボックスまたはリストボックスに表示するデータ|
|ソースオブジェクト|SourceObject|サブフォームのソースになるオブジェクト|

**Meプロパティを利用する。 [#x6ff9a90]
参照するオブジェクトがプログラムを実行しているフォームまたはレポートの場合は
 Forms!フォーム名 または Reports!レポート名
 の代わりに
 Me!フォーム名    または Me!レポート名
のように使用する事ができます。

**Option Explicit [#z22d41ca]
宣言していない変数を利用できないようにする命令

***Option Explicitを必ず追加するには [#s7e83322]
Visual Basic Editorで[ツール]⇒[オプション]⇒編集タブの「変数の宣言を強制する」にチェックしておくと、~
モジュールを作成した時に自動的にOption Explicitステートメントが追加されます。


**コントロールに値を代入する [#f1d7b0f2]
[F_顧客]フォームの[顧客ID]コントロールに「100」を代入する。
 Forms!F_顧客!顧客ID = 100
[F_顧客]フォームの[顧客名]コントロールに「2008/02/14」を代入する。
 Forms!F_顧客!顧客名 = #02/14/2008#

-日付の書式:シャープ(#)で囲んだ値は、日付または時刻データとして解釈されます。
 書式 #月/日/年#

**四則演算 [#k6e4f5ba]
|演算子|意味|例|計算結果|
|+|たし算|10 + 3|13|
|-|ひき算|10 - 3|7|
|*|かけ算|10 * 3|30|
|/|わり算|10 / 3|3.33333.....|
|\|わり算の商|10 \ 3|3|
|Mod|わり算の余り|10 Mod 3|1|
|^|べき乗|10^ 3|1000|

**文字の連結 [#p8ce5801]
&演算子を利用すると文字を連結する事ができます。~
Forms!フォーム!あいさつコントロールには「こんにちは」が代入される。
 Forms!フォーム!あいさつ = "こん" & "にちは"

**変数のデータ型 [#z18b1f24]
小数点を含まない値が&color(red){整数};小数点を含んだ値が&color(red){実数};
|データ型|表記|データの種類・値の範囲|
|ブール型|Boolean|TureまたはFalse|
|バイト型|Byte|整数(0〜255)|
|整数型|Integer|整数(-32768〜32767)|
|長整数型|Long|整数(-2147483648〜2147483647)|
|単精度浮動小数点数型|Single|実数(-3.402826E38〜-1.401298E-45)|
|~|~|実数(1.401298E-45〜3.402823E38)|
|倍精度浮動小数点数型|Double|実数(-1.79769313486231E308〜-4.9406564584124E-324)|
|~|~|実数(4.94065645841247E-324〜1.79769313486232E308)|
|通貨型|Currency|通貨(-922337203685477.5808〜922337203685477.5807)|
|日付型|Date|日付(西暦100年1月1日〜西暦9999年12月31日)|
|文字列型|String|文字|
|バリアント型|Variant|すべのデータの種類|

*制御構造 [#a4a2e4f2]

**If...Endifステートメント [#e0393c37]
書式
 If 条件式 Then
   実行する処理
 EndIf

***If...Endifステートメント(例) [#y6cd2526]
 Private Sub cmd確認_Click()
 Dim intA As Integer
 	intA = Me!txtA
 	
 	If intA >= 0 Then
 		MsgBox "正の数"
 	EndIf
 End Sub

**If...Then...Elseステートメント [#fcb0c341]
書式
 If 条件式 Then
 	Trueの時の処理
 Else
 	Falseの時の処理
 End If

***If...Then...Elseステートメント(例) [#jc164417]
 Private Sub cmd確認_Click()
 	Dim intA As Integer
 	intA = Me!txtA
 	
 	If intA >= 0 Then
 	MsgBox "正の数"
 	Else
 		MsgBox "負の数"
 	End If
 End Sub
 
**If...Then...ElseIfステートメント [#y8b0dd16]
書式
 If 条件式A Then
 	条件式AがTrueの処理
 ElseIf 条件式B Then
 	条件式BがTrueの処理
 ElseIf 条件式C Then
 	条件式CがTrueの処理
 Else
 	条件式A・B・CがFlaseの時の処理
 End If

**条件式のAndとOr [#w74164b6]
例
 変数Aの値が100〜200の場合True、それ以外はFalse
 If (A >= 100) And (A <= 200) Then
 
 変数Aの値が100もしくは200の場合True、それ以外はFalse
 If (A = 100) Or (A = 200) Then

**Select Case ステートメント [#f662c156]
書式
 Select Case 変数A
 	Case 定数1 :
 		変数Aの値が定数1と等しい時の処理
 	Case 定数2 :
 		変数Aの値が定数2と等しい時の処理
 	Case 定数3
 		変数Aの値が定数3と等しい時の処理
 	Case Else
 		変数Aの値が上記以外の時の処理
 End Select

-Caseの書き方
--値を複数指定する。
 Select Case A
 	Case ,2,3,

--範囲を指定する(1から10まで)
 Select Case A
 	Case 1 To 10

--範囲を指定する(AからFまで)
 Select Case A
 	Case A To F

***Select Case ステートメント(例) [#m9163984]
 Private Sub cmd計算_Click()
 	Dim sngAns As Single
 	
 	Select Case Me!txt演算
 		Case "+","+" :	sngAns = 10 + 3
 		Case "-" :	sngAng = 10 - 3
 		Case "*","*" :	sngAng = 10 * 3
 		Case "/","/" :	sngAng = 10 / 3
 		Case "\","¥" :	sngAng = 10 \ 3
 		Case "Mod" :sngAng = 10 Mod 3
 		Case "^" :	sngAng = 10 ^ 3
 		Case Else
 			Beep
 			MsgBox "演算子が間違っています"
 	End Select
 End Sub

**For...Nextステートメント [#scf95b2c]
書式
 For カウンタ = 初期値 to 最終値 [Step ステップ]
	実行する処理
 Next カウンタ

***For...Nextステートメント(例) [#z2a84613]
MsgBoxで0から9まで表示する。
 Private Sub cmdカウンタ_Click()
 	Dim i As Integer
 	For i = 0 To 9
 		MsgBox	i
 	Next i
 End Sub
MsgBoxで0,2,4,6,8と表示する。
 Private Sub cmdカウンタ_Click()
 	Dim i As Integer
 	For i = 0 To 9 Step 2
 		MsgBox	i
 	Next i
 End Sub

**Do...Loopステートメント [#s1cbea4c]
書式(前判断)
 Do {While | Until} 条件式
 	実行する処理
 Loop
書式(後判断)
 Do
 	実行する処理
 Loop {While | Until} 条件式
 
***Do...Loopステートメント(例) [#fa8d3880]
MsgBoxで10から一つずつ減らしながら表示する。
 Private Sub cmd前判断_Click()
	Dim cnt As Integer
	cnt = 10
	
	Do While cnt > 0
		MsgBox	cnt
		cnt = cnt -1
	Loop
 End Sub

**ループを途中で終了する処理 [#b75fb9d6]
 Exit For
 Exit Do


**マクロのアクションを実行する。 [#m125b56a]
書式
 DoCmd.メソッド 引数1,引数2,引数3・・・・

[[AccessVBA/メソッド>AccessVBA/メソッド]]

*Visual Basicの組み込み関数を使用する。 [#u0cfff18]
書式
 戻り値 = 関数(引数1,引数2,引数3・・・・・)

**MsgBox関数 [#p73d3ab8]
書式
 retvalue = MsgBox(prompt [, buttons] [,title]
 
 retvalue : 戻り値(Integer型). 選択したボタンを表す定数
 		[OK]ボタン			:1		vbOK
 		[キャンセル]ボタン               :2		vbCancel
 		[中止]ボタン			:3		vbAbout
 		[再試行]ボタン			:4		vbRetry
 		[無視]ボタン			:5		vblgnore
 		[はい]ボタン			:6		vbYes
 		[いいえ]ボタン			:7		vbNo
 
 prompt		:メッセージボックスに表示する文字列
 buttons	:(省略可能)ボタンとアイコンの種類
 		-ボタンの種類と個数
 		vbOkOnly			0			[OK]
 		vbOkCancel			1			[OK][キャンセル]
 		vbAbourtRetrylgnore	        2			[中止][再試行][無視]
 		vbYesNoCancel			3			[はい][いいえ][キャンセル]
 		vbYesNo				4			[はい][いいえ]
 		vbRetryCancel			5			[再試行][キャンセル]
 
 		-アイコンの種類
 		vmCritical			16			警告[X]
 		vbQuestion			32			問い合わせ[?]
 		vbExclamation			48			注意[!]
 		vbInfomation			64			情報[i]
 		
 		-デフォルトボタン
 		vbDefaultButton1		0			第1ボタン
 		vbDefaultButton1		256			第2ボタン
 		vbDefaultButton1		512			第3ボタン
 
 title		:(省略可能)メッセージボックスのタイトルバーに出力する文字列

*プロシージャ [#t869d6b1]
「マウスがクリックされた」「キー入力」されたなどがイベント~
プロシージャはイベントが発生した時に、自動的に実行するプログラム


**ジェネラルプロシージャ [#v4d32e87]

-Subプロシージャ~
そこに記述した処理を実行するだけ。処理の結果を返さないプロシージャ

--書式
 [Call] Subプロシージャ名[(引数1,引数2,引数3・・・)]

---例
cmdSubをクリックして、SubプロシージャCalcを実行する。
 Private Sub Calc()
 		MsgBox Me!txt!
 End Sub
 
 Pribate Sub cmdSub_Click()
 		Call Calc
 End Sub

-Functionプロシージャ~
組み込み関数のように、処理の結果を返すプロシージャをFunctionプロシージャと呼びます。~
※Functiionプロシージャには必ず戻り値のデータ型の宣言が必要です。


--書式
 戻り値 = Functionプロシージャ名[(引数1,引数2,引数3・・・)]

---例
cmdFuncをクリックして、FunctionプロシージャCalcの戻り値を表示。
 Private Function Calc() As Integer
   Dim intA As Integer
   Dim ans As Integer
   intA = CInt(Me!txtA)
   ans = intA * 2
   Calc = ans
 End Function
 
 Private Sub cmdFunc_Click()
   Dim ret As Integer
   ret = Calc()
   MsgBox ret
 End Sub

-引数の受け渡し~
cmdFuncをクリックして、Function Calcに引数を渡し戻り値を受け取る。
 Private Function Calc(A As Integer, B As Integer) As Integer
   Dim ans As Integer
   ans = A * B
   Calc = ans
 End Function
 
 Private Sub cmdFunc_Click()
   Dim ret As Integer
   ret = Calc(10, 5)
   MsgBox ret
 End Sub

*変数の適応範囲 [#wc563b57]

**プロシージャレベル変数 [#sad23b45]
Dimステートメントを使って宣言した変数は、そのプロシージャ内だけで有効です。~
プロシージャを終了すると、変数が保持していた値は破棄されます。

-例~
下記の例ではプロシージャを実行する度にretの値が初期化さえます。~
その為、メッセージボックスは常に「1」です。
 Private Sub cmd_Click()
   Dim ret As Integer
   ret = ret + 1
   MsgBox ret
 End Sub

**静的変数 [#wba5bb25]
Staticステートメントを使って宣言した変数は、そのモジュールを終了するまで有効です。

-例~
下記の例では変数retは、このフォームを閉じるまで有効です。~
その為、コマンドボタンをクリックする度に値が加算されます。
 Private Sub cmd_Click()
   Static ret As Integer
   ret = ret + 1
   MsgBox ret
 End Sub

**モジュールレベル変数 [#rcb48fbb]
モジュールの宣言セクションで宣言した変数は、そのモジュールに含まれるすべてのプロシージャから利用する事ができます。~
宣言した変数はそのフォームを閉じるまで値が保持されます。

-例~
cmdとcmd2のどちらのボタンをクリックしても変数の値が増えていきます。
 Option Compare Database
 Private ret As Integer
 
 Private Sub cmd_Click()
   ret = ret + 1
   MsgBox ret
 End Sub
 Private Sub cmd2_Click()
   ret = ret + 1
   MsgBox ret
 End Sub

**パブリック変数 [#ra7e0504]
データベースに含まれるすべてのプロシージャから参照する事ができます。

-例~
フォーム1のcmdとフォーム2のcmdどちらをクリックしても値が増えていきます。
 'フォーム1
 Option Compare Database
 Public ret As Integer
 
 Private Sub cmd_Click()
   ret = ret + 1
   MsgBox ret
 End Sub
 
 'フォーム2
 Private Sub cmd_Click()
   ret = ret + 1
   MsgBox ret
 End Sub

*プロシージャの適応範囲 [#m07c13ee]
変数と同じように、プロシージャにも、それを利用できる範囲があります。

**Privateプロシージャ [#a700d614]
同じモジュールだけで利用できるプロシージャ
 Private Sub Sample()
 ・
 ・
 End Sub

**Publicプロシージャ [#w58e0cbf]
データベースに含まれるすべてのモジュールから利用できるプロシージャ

 Public Sub Sample()
 ・
 ・
 ・
 End Sub

**プロシージャを途中で終了する [#xd5740a6]
書式
 Exit Subステートメント
 Exit Functionステートメント

-例~
cmdクリック時にテキストtxtAの値がNullだった場合、「数値を入力してください」を表示。~
値が入っていれば、2倍して表示。
 Private Sub cmd_Click()
   Dim intA As Integer
   If IsNull(Me!txtA) Then
     Beep
     MsgBox "数値を入力してください"
     Exit Sub
   End If
   
   intA = CInt(Me!txtA)
   ret = intA * 2
   
   MsgBox ret
 End Sub

*デバッグとエラー処理 [#xe140525]

**イミディエイトウィンドウ [#k2ac8f1c]
Visual Basic Editorで [表示] - [イミディエイトウィンドウ] を選択~
イミディエイトウィンドウとは、プログラムのデバッグを行うウィンドウです。~
プログラムを実行しているときに、変数の値を確認したり、作成したFunctionプロシージャを実行したりすることができます。

**イミディエイトウィンドウに値を出力する。 [#o35e9489]
書式
 Debug.Print 変数1,変数2,変数3・・・・

-例~
 Private Sub cmd2_Click()
   Dim i As Integer
   For i = 0 To 9
     Debug.Print i & "です。"
   Next i
   Beep
 End Sub

**イミディエイトウィンドウでプロシージャを実行する [#q1cd76fc]
-Visual Basicの組み込み関数、Functionプロシージャを実行する。
 ?関数名(引数1,引数2,引数3・・・)
--例
 ?Time()
 午前 12:00:00

-Functionプロシージャを実行する場合
 ?モジュール名.プロシージャ名(引数1,引数2,引数3・・・)

-[計算フォーム]フォームのクラスモジュールに作成したCalcプロシージャを実行する
 ?Form_計算フォーム.Calc()

-マクロのアクションを実行する。~
計算フォームを開く
 DoCmd.OpenForm "計算フォーム"

-Subプロシージャを実行する~
イミディエイトウィンドウで実行できるのは、標準モジュールにPublicプロシージャとして作成したSubプロシージャだけです。
 Sample(10,2)

**プログラムを1行ずつ実行する。 [#k59fc141]
コードウィンドウで [F8]キーを押すと1行ずつ実行できます。

ブレークポイントを設定した状態で実行すると、ブレークポイントの直前までプログラムを実行した後、一時中断します。

**ローカルウィンドウ [#m46ef319]
ローカルウィンドウは、プログラム実行中の変数の値を表示するウィンドウです。

Visual Basic Editorで [表示] - [ローカルウィンドウ] 選択で表示できます。

**エラー処理の作り方 [#b476c25d]
-エラートラップ
 On Error Goto ラベル

例
 Public Sub フォーム開_Click()
 On Error GoTo フォーム開_Err            'エラートラップ
   DoCmd.OpenForm "顧客登録"
 
 フォーム開_Exit:                        '正常終了処理
   Exit Sub
 
 フォーム開_Err:                         'エラー処理
   MsgBox Error$
   Resume フォーム開_Exit
 End Sub

**エラーの種類を調べる [#oa652c79]
書式
 Err.Number
 Err.Description

-例
 MsgBox Err.Number & " : " & Err.Description

**エラー処理の後にプログラムを継続する [#n4bc0ba0]
Resumeステートメントは、指定した位置にプロシージャの制御を移動する処理を行います~
エラーが発生した次の行から再度プロシージャを継続するには以下の書式を利用する。~
書式
 Resume Next

-例
 Public Sub フォーム開_Click()
 On Error GoTo フォーム開_Err
   DoCmd.OpenForm "顧客登録"
 
 フォーム開_Exit:
   Exit Sub
 
 フォーム開_Err:
   MsgBox Err.Number & " : " & Err.Description
   Resume Next
 End Sub

*ADO(ActioveX Data Object)、DAO(Data Access Object) [#w4cb5ee8]
ADOとDAOはどちらもVisual Basicでデータベースを操作する為のオブジェクトです。

**ADO(ActioveX Data Object) [#q4b51550]
OLE DBプロバイダを通して、AccessデータベースやSQL Server、Oracleなどいろいろなタイプのデータベースに接続するオブジェクトです。

[[AccessVBA/ADO]]

[[AccessVBA/ADOX]]

**DAO(Data Access Object) [#v9e04d60]
Microsoft Jetデータベースエンジンを経由してAccessデータベースに接続し、データベース操作を行う為のオブジェクトです。
[[AccessVBA/DAO]]

*SQLステートメントを使ったデータベース操作 [#r916041a]
SQLステートメントはデータベースを操作する為の言語です。~
特定の条件を満たすレコードだけを抽出できます。~
またたくさんのレコードを一度に編集することもできます。~
[[AccessVBA/SQLステートメントを使ったデータベース操作]]

*実例集 [#dcb21679]

[[AccessVBA/実例集]]

*参考サイト [#g6da0623]
[[http://www.feedsoft.net/access/>http://www.feedsoft.net/access/]]