AccessVBA

Access VBA

オブジェクトの参照方法

Forms!フォーム名
Reports!レポート名

プロパティの参照方法

Forms!フォーム名.プロパティ名の英語表記
Reports!レポート名.プロパティ名の英語表記
Forms!フォーム名!コントロール名.プロパティ名の英語表記
Reports!レポート名!コントロール名.プロパティ名の英語表記

プロパティの参照方法(例)

[F_顧客登録]フォーム上にある[cmd実行]コントロールの[標題]プロパティを参照する。

Forms!F_顧客登録!cmd.実行.Caption

主なプロパティ名

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

Meプロパティを利用する。

参照するオブジェクトがプログラムを実行しているフォームまたはレポートの場合は

Forms!フォーム名 または Reports!レポート名
の代わりに
Me!フォーム名    または Me!レポート名

のように使用する事ができます。

Option Explicit

宣言していない変数を利用できないようにする命令

Option Explicitを必ず追加するには

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

コントロールに値を代入する

[F_顧客]フォームの[顧客ID]コントロールに「100」を代入する。

Forms!F_顧客!顧客ID = 100

[F_顧客]フォームの[顧客名]コントロールに「2008/02/14」を代入する。

Forms!F_顧客!顧客名 = #02/14/2008#
  • 日付の書式:シャープ(#)で囲んだ値は、日付または時刻データとして解釈されます。
    書式 #月/日/年#

四則演算

演算子意味計算結果
+たし算10 + 313
-ひき算10 - 37
*かけ算10 * 330
/わり算10 / 33.33333.....
\わり算の商10 \ 33
Modわり算の余り10 Mod 31
^べき乗10^ 31000

文字の連結

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

Forms!フォーム!あいさつ = "こん" & "にちは"

変数のデータ型

小数点を含まない値が整数小数点を含んだ値が実数

データ型表記データの種類・値の範囲
ブール型BooleanTureまたは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すべのデータの種類

制御構造

If...Endifステートメント

書式

If 条件式 Then
  実行する処理
EndIf

If...Endifステートメント(例)

Private Sub cmd確認_Click()
Dim intA As Integer
	intA = Me!txtA
	
	If intA >= 0 Then
		MsgBox "正の数"
	EndIf
End Sub

If...Then...Elseステートメント

書式

If 条件式 Then
	Trueの時の処理
Else
	Falseの時の処理
End If

If...Then...Elseステートメント(例)

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ステートメント

書式

If 条件式A Then
	条件式AがTrueの処理
ElseIf 条件式B Then
	条件式BがTrueの処理
ElseIf 条件式C Then
	条件式CがTrueの処理
Else
	条件式A・B・CがFlaseの時の処理
End If

条件式のAndとOr

変数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 ステートメント

書式

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 ステートメント(例)

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ステートメント

書式

For カウンタ = 初期値 to 最終値 [Step ステップ]
	実行する処理
Next カウンタ

For...Nextステートメント(例)

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ステートメント

書式(前判断)

Do {While | Until} 条件式
	実行する処理
Loop

書式(後判断)

Do
	実行する処理
Loop {While | Until} 条件式

Do...Loopステートメント(例)

MsgBoxで10から一つずつ減らしながら表示する。

Private Sub cmd前判断_Click()
	Dim cnt As Integer
	cnt = 10
	
	Do While cnt > 0
		MsgBox	cnt
		cnt = cnt -1
	Loop
End Sub

ループを途中で終了する処理

Exit For
Exit Do

マクロのアクションを実行する。

書式

DoCmd.メソッド 引数1,引数2,引数3・・・・

AccessVBA/メソッド?

Visual Basicの組み込み関数を使用する。

書式

戻り値 = 関数(引数1,引数2,引数3・・・・・)

MsgBox関数

書式

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		:(省略可能)メッセージボックスのタイトルバーに出力する文字列

プロシージャ

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

ジェネラルプロシージャ

  • 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

変数の適応範囲

プロシージャレベル変数

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


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

静的変数

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


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

モジュールレベル変数

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


  • 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

パブリック変数

データベースに含まれるすべてのプロシージャから参照する事ができます。


  • フォーム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

プロシージャの適応範囲

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

Privateプロシージャ

同じモジュールだけで利用できるプロシージャ

Private Sub Sample()
・
・
End Sub

Publicプロシージャ

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

Public Sub Sample()
・
・
・
End Sub

プロシージャを途中で終了する

書式

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

デバッグとエラー処理

イミディエイトウィンドウ

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

イミディエイトウィンドウに値を出力する。

書式

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

イミディエイトウィンドウでプロシージャを実行する

  • 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行ずつ実行する。

コードウィンドウで [F8]キーを押すと1行ずつ実行できます。

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

ローカルウィンドウ

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

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

エラー処理の作り方

  • エラートラップ
    On Error Goto ラベル

Public Sub フォーム開_Click()
On Error GoTo フォーム開_Err            'エラートラップ
  DoCmd.OpenForm "顧客登録"

フォーム開_Exit:                        '正常終了処理
  Exit Sub

フォーム開_Err:                         'エラー処理
  MsgBox Error$
  Resume フォーム開_Exit
End Sub

エラーの種類を調べる

書式

Err.Number
Err.Description
  • MsgBox Err.Number & " : " & Err.Description

エラー処理の後にプログラムを継続する

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)

ADOとDAOはどちらもVisual Basicでデータベースを操作する為のオブジェクトです。

ADO(ActioveX Data Object)

OLE DBプロバイダを通して、AccessデータベースやSQL Server、Oracleなどいろいろなタイプのデータベースに接続するオブジェクトです。

AccessVBA/ADO

AccessVBA/ADOX

DAO(Data Access Object)

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

SQLステートメントを使ったデータベース操作

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

実例集

AccessVBA/実例集

参考サイト

http://www.feedsoft.net/access/