プロジェクトとは
DBファイルに保存されているモジュールをまとめて管理するもの。
3種類のモジュールがある
・Microsoft office Access クラスオブジェクト
(フォームモジュール、レポートモジュール)
・標準モジュール
・クラスモジュール
モジュールとは
プロシージャを記述・格納するためのオブジェクト
・フォームモジュール、レポートモジュール
・標準モジュール
・クラスモジュール
プロシージャとは
プログラムを構成する最小単位
プログラムとは、コンピュータを演算する処理を行わせる手続き全般で、プロシージャはそれらの処理に対する命令を手順としてまとめたもの
オブジェクトとは
VBAにおける処理の対象となるアプリケーションの構成要素を指す
プロパティとは
オブジェクトが持つ属性
例:フォームオブジェクトの場合
配置する位置やサイズ、背景色などがプロパティにあたる
メソッドとは
オブジェクトが行うことができる動作
メソッドには「引数」と呼ばれる、どのように動作を行うかを指定する値がある
演算子とは
・算術演算子
・比較演算子
・文字列連結演算子
・論理演算子
・代入演算子
算術演算子
+、ー、*、/、Mod、¥、^
比較演算子
=、<、<=、>、>=、<>、Is、Like
文字列連結演算子
&、+
論理演算子
And、Or、Not、Xor、Eqv、Imp
代入演算子
=
キーワードとは
VBAにとって特別な意味を持つ文字列
ステートメント名、関数名、演算子などがあり、キーワードと同じ文字列をプロシージャ名や変数名に用いることはできない
テーブルの正規化
複数のテーブルにデータを分割し、お互いが連携しながらDBのデータを活用する
・繰り返し項目を削除することでDBサイズが小さくなる
・各テーブルの目的が明確になる
・データ管理が容易になる
第1正規化から第3正規化まである
第1正規化
繰り返し項目を無くす
第2正規化
主キーの一部によって決まる項目を他テーブルに分離する
第3正規化
主キー以外の項目によって決まる項目を含むテーブルを他のテーブルに分離する
結合の種類
・内部結合
2つのテーブルに共通する値のみ表示する
・左外部結合
左側のテーブルの全てと右側のテーブルで共通する値のレコードを表示する
・右外部結合
右側のテーブルの全てと左側のテーブルで共通する値のレコードを表示する
静的変数とは
プロシージャレベル変数でプロシージャ終了後も値を保持したいときに使用する宣言
Staticステートメント
オブジェクト変数の宣言
・固有オブジェクト型
例)
・Dim オブジェクト変数 As Form
・Dim オブジェクト変数 As Label
・Dim オブジェクト変数 As TextBox
・総称オブジェクト型
例)
・Dim オブジェクト変数 As Object
固有オブジェクトで宣言した方がエラーの発見をしやすく、少しだけ実行速度が速い
キャリッジリターン文字
vbCr
chr(10)
ラインフィード文字
vbLf
chr(13)
改行文字
vbCrLf
vbNewLine
chr(10) &chr(13)
For…Nextの構文
For 変数=初期値 To 最終値 (Step 加算値)
繰り返し実行する処理
Next 変数
Do…Loopの構文(実行前判断)
Do(While又はUntile) 条件式
繰り返し実行する処理
Loop
Do…Loopの構文(実行後判断)
Do
繰り返し実行する処理
Loop(While又はUntile) 条件式
Whileキーワード
条件を満たしている間
Untilキーワード
条件を満たすまで
ループの実行前判断と実行後判断の違い
条件を満たしていないとき、実行前判断では一度もループ処理を実行しない
実行後判断では必ず一度ループ内の処理を実行する
For Each…Nextの構文
For Each 要素変数 In 配列またはコレクション
繰り返し実行する処理
Next 要素変数
For Eachの例(全テキストボックスを消去)
Dim MyControl As Object
For Each MyControl In Me.Controls
If Mycontrol.ControlType = acTextBox then
MyControl.Value=""
End if
Next MyControl
For Eachで使用する要素変数のデータ型
配列の場合はバリアント型
コレクションの場合はバリアント型かオブジェクト型
コレクションとは
Accessが持っているオブジェクトの集合体
例えば「Forms」というコレクションは、現在開いているフォーム全てに対して一括処理すいることができる
コレクション「Reports」
現在開いているすべてのレポート
コレクション「Printers」
システムで使用可能なすべてのプリンタ
コレクション「Me.Controls」
フォーム、レポート上のすべてのコントロール
コレクション「CurrentProject.AllForms」
DB内にあるすべてのフォーム
コレクション「CurrentProject.AllReports」
DB内にあるすべてのレポート
Exitステートメント
処理を抜け出すことができる
・Exit Do
・Exit For
・Exit Sub
・Exit Function
特殊なクエリ(SQLクエリ)
・ユニオンクエリ
・パススルークエリ
・データ定義クエリ
宣言セクションとは
モジュールの先頭から最初のプロシージャを記述するまでの領域。
この領域に宣言した変数は、パブリック変数またはモジュールレベル変数となる
変数を宣言するステートメント種類
・Public
・Private
・Dim
パブリック変数
ステートメント:Public
宣言場所:標準モジュールの宣言セクション
適用範囲:全てのモジュール全てのプロシージャ
モジュールレベル変数
ステートメント:Dim又はPrivate
宣言場所:宣言セクション
適用範囲:宣言されたモジュール内の全てのプロシージャ
プロシージャレベル変数
ステートメント:Dim
宣言場所:プロシージャ内
適用範囲:宣言されたプロシージャ内からのみ
パブリック定数
ステートメント:Public Const
宣言場所:標準モジュールの宣言セクション
適用範囲:全てのモジュール全てのプロシージャ
モジュールレベル定数
ステートメント:Const
宣言場所:宣言セクション
適用範囲:宣言されたモジュール内の全てのプロシージャ
プロシージャレベル定数
ステートメント:Const
宣言場所:プロシージャ内
適用範囲:宣言されたプロシージャ内からのみ
Staticステートメント
プロシージャレベル変数でプロシージャ終了後も値を保持したいときに使用する宣言
ステートメント:Static
宣言場所:プロシージャ内
有効範囲:パブリック変数と同じ
Static MyId As String
Set ステートメント
オブジェクト変数にオブジェクトの参照を代入する
Set オブジェクト変数 = 参照するオブジェクト
例)
Dim MyForm As Form
Docmd.OpenForm "Fオブジェクト変数"
Set MyForm=Forms("Fオブジェクト変数")
MyForm.詳細.Backcolor = vbCyan
MyForm.txt1.Value=ABCDE"
配列 Option Baseステートメント
配列のインデックス番号の最小値を「0」ではなく「1」に変更することができる
Option Base 最小値(0又は1の数値)
※宣言セクションに記述
配列 Toステートメント
モジュール内の全ての配列変数ではなく個々の配列変数ごとに設定したい場合に使用する
Dim 変数(最小値 To 最大値) As データ型
動的配列とは
要素数は設定せずに配列の宣言のみ行うこと
ReDimステートメントで要素数を設定する
Dim 変数() As データ型
ReDimステートメント
実際に使用する段階で要素数を設定する
ReDim 変数(要素数-1)
※それまで格納されていた値は初期化される
Preserveステートメント
それまで格納されていた値を初期化することなく要素の最大値を変更することができる
ReDim Preserve 変数(新しい要素数-1)
Eraseステートメント
配列に格納されて値を一気に初期化する
Erase 配列変数
ユーザ定義型とは
ユーザが独自に型の定義を行うことができる機能
任意の数の要素を設定でき、各要素のデータ型もそれぞれ異なるものを設定可能
Typeステートメント
ユーザ定義型を定義するステートメント。
標準モジュールの宣言セクションで行う
例)
Type ユーザ定義型名
要素名1 As データ型1
要素名2 As データ型2
要素名3 As データ型3
End Type
ユーザ定義型の宣言方法
Typeステートメントで定義したユーザ定義型を通常の変数宣言と同様に宣言します
Dim ユーザ定義型の変数 As ユーザ定義型名
例)
Dim MySyain() SyainType
----------------------------------------
Private Sub Form_AfterUpdate()
Static i As Long
ReDim Preserve MySyain(i)
MySyain(i).社員番号=Me.txt1.Value
MySyain(i).部署コード=Me.txt2.Value
MySyain(i).社員名=Me.txt3.Value
プロシージャの種類は
標準プロシージャ
イベントプロシージャ
標準プロシージャとは
特定のイベントに関連付けられていない汎用的な処理を記述するプロシージャ
SubプロシージャとFunctionプロシージャの2種類がある
処理の結果を返す必要がない場合はSub
返す必要がある場合はFunction
イベントプロシージャとは
フォームやレポートのイベントによって実行するプロシージャ。
全てSubプロシージャとなる
Functionプロシージャの呼び出し方
変数 = プロシージャ名()
または
変数 =プロシージャ名(変数)
例)
sub Test()
Dim MyStr As String
MyStr=Func("※※※")
Msgbox MyStr
End Sub
Function Func(MyStr As String) As String
Func = MyStr % "AAA"
End Function
引数とは
プロシージャを呼び出す際に、呼び出し先のプロシージャに渡される値
戻り値とは
呼び出されたプロシージャの処理が終わった後に、呼び出し元のプロシージャに渡される値
値渡しとは
変数のコピーを渡すこと
ByValキーワードを使用する
例)
Sub プロシージャ名(ByVal 引数 As データ型)
又は
Function プロシージャ名(ByVal 引数 As データ型)
参照渡しとは
変数をそのまま渡す
渡し先で変更されれば元の変数も変更される
ByRefキーワードを使用する
例)
Sub プロシージャ名(ByRef 引数 As データ型)
又は
Function プロシージャ名(ByRef 引数 As データ型)
Optionalキーワードとは
引数を省略可能にできる
Function Func1(Optinal ByVal MyStr As String = "BBB")
Func = MyStr & "***"
End Function
-------------------------------------------------
Sub Test()
Debug.Print Func("AAA")
Debug.Print Func()
-------------------------------------------------
結果
AAA***
BBB***
引数を省略した場合に初期値が適用される
フォーム・レポートを参照する構文
対象となるオブジェクトのモジュールから参照
Me.メソッド(又はプロパティ)
それ以外のモジュールから参照
Forms("フォーム名").メソッド(又はプロパティ)
様々なフォーム参照の構文
Forms!フォーム名
Forms![フォーム名]
Forms.フォーム名
Forms!フォーム名!コントロール名
Forms("フォーム名")("コントロール名")
Forms("フォーム名").Controls("コントロール名")
サブフォーム・サブレポートを参照する構文
対象となるオブジェクトのモジュールから参照
Me.サブフォーム.Form.メソッド(又はプロパティ)
それ以外のモジュールから参照
Forms("フォーム名").サブフォーム名.Form.メソッド(又はプロパティ)
メインフォームを参照する場合
Me.Parent.メソッド(又はプロパティ)
Me.Parent.コントロール名.メソッド(又はプロパティ)
OpenArgdプロパティとは
Docmd.OPenFormのプロパティ
どのフォームから開かれたか調べることができる
例)
Private Sub btn_Click()
Docmd.OPenForm "F_フォーム",,,,,,Screen.ActiveControl.Name
End Sub
-------------------------------------
Private Sub Form_OPen
Me.txt.Value="[" & OpenArgs & "]ボタンより開かれました"
End Sub
KeyPressイベントとは
キーボードのANSIキーが押された時に発生する
ANSIキーが押されると、
KeyDown→KeyPress→Change→KeyUpの順でイベントが発生する
例)
Rrivate Sub KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 8,9,13
Exit Sub
Caee Else
If KeyAscii >=Asc("0") And KeyAscii <= Asc("9") Then Me.Lbl.Cartion ="数字キーが押されました"
End If
GetFocusイベントとは
コントロールにフォーカスが移った時に発生する
フォーカスを取得した際に他のコントロールから値を取得したりテキストボックスのカーソル位置を指定したり。
例)
Private Sub txt_GetFocus()
If IsNull(Me.txt.Value) Then
Me.txt.Value=Me.txt5.Value
Me.txt.SelStart = Nz(Len(Me.txt.Value),0)
End If
SelStartプロパティとは
テキストボックス内のカーソル位置を指定する
(0から総文字数の範囲で)
Me.txt.SelStart = Nz(Len(Me.txt.Value),0)
テキストボックス内の文字を数えて、その文字数の最後尾にカーソルを設定する
BeforeUpdateイベントとは
データを更新する前に発生し、入力された値が不正なときやデータ更新のキャンセルを行うことができる
データを更新すると、BeforeUpdate → AfterUpdateの順番でイベントが発生する
Loadイベントとは
フォームに読み込まれる時に発生する
フォームが開かれると
Open→Load→Activeの順にイベントが発生する
コンポーネントとは
特定の機能を持つプログラムの部品
外部のライブラリファイルを読み込むことでAccess VBAにない機能を利用することができる
参照設定
事前バインディングとは
利用したい外部ライブラリファイルをあらかじめ選択し、オブジェクト変数にオブジェクトへの参照を格納する
Dim オブジェクト変数 As 特定のオブジェクト型
Set オブジェクト変数 = New 特定のオブジェクト型
実行時バインディングに比べてコード の実行が早い
固有オブジェクト型による宣言
実行時バインディングとは
CreateObject関数を利用して、コード 実行時にオブジェクトを参照する
参照設定ダイアログでライブラリファイルを選択する必要はない
Dim オブジェクト変数 As Object
Set オブジェクト変数=CreateObject(オブジェクトのクラス名)
総称オブジェクト型による宣言
カレントデータベースのパスと名前
パス
CurrentProject.Path
名前
CurrentProject.Name
CurrentDb.Name
フォルダのパスとファイルの名前を同時に取得できる
CurrentProject.Pathと
CurrentProject.Name
を両方あわせた感じ
FileSystemObjectの概要
8つのオブジェクト種類
Driveオブジェクト
Driveコレクション
Folderオブジェクト
Folderコレクション
Fileコレクション
Fileオブジェクト
TextStreamオブジェクト
FileSystemオブジェクトの事前バインディング記載方法
Dim オブジェクト変数 As FileSystem
Object
Set オブジェクト変数=New FileSystemobject
FileSystemオブジェクトの実行時バインディング記載方法
Dim オブジェクト変数 As Object
Set オブジェクト変数 =CreateObject(”Scripting.FileSystemObject")
FileSystemObjectのオブジェクト
copyFile
CopyFolder
CreateFolder
CreateTextFile
DeleteFile
DeleteFolder
DriveExists
FileExists
FolderExists
GetDrive
GetFile
GetFolder
MoveFile
MoveFolder
OpenTextFile
Driveオブジェクトの内容
オブジェクト.GetDrive(ドライブ名)
DriveLetter…ドライブ名取得
DriveType…ドライブ種類の数値取得
FileSystem…ファイルシステムの種類「FAT」「NTFS」「CDFS」のいずれかを取得
FreeSpace…使用可能なディスク空き容量
IsReady…ドライブが準備できているかどうか
Path…ドライブのパス
ShareName…ドライブのネットワーク名
TotalSiza…ドライブの総容量
Driveオブジェクト
DriveTypeプロパティの数値種類
0 不明
1 リムーバブルディクス
2 ハードディスク
3 ネットワークドライブ
4 CD-ROM
5 RAMディスク
Folderオブジェクトの内容
オブジェクト.GetFoler(フォルダのパス)
■プロパティ
Attributes…フォルダ属性の取得
DateCreated…フォルダ作成の日時
DateLastAccessed…フォルダが最後にアクセスされた日時
DateLastModiffed…フォルダが最後に更新された日時
Drive…フォルダが含まれているドライブ名
Files…フォルダ内のすべてのファイル取得
IsRoolFolder…ルートフォルダかどうか調べる
Name…フォルダの名前を取得
Path…フォルダのパスを取得
Size…フォルダ内のサイズを取得
SubFoldrs…すべてのサブフォルダを取得
■メソッド
Copy…フォルダをコピー
Delete…フォルダを削除
Move…フォルダを移動する
CreateTextFile…新しいテキストファイル作成
Fileオブジェクトの内容
オブジェクト.GetFile(ファイルのパス)
■プロパティ
Attributes…ファイル属性の取得
DateCreated…ファイル作成の日時
DateLastAccessed…ファイルが最後にアクセスされた日時
DateLastModiffed…ファイルが最後に更新された日時
Drive…ファイルが含まれているドライブ名
Name…ファイルの名前を取得
Path…ファイルのパスを取得
Size…ファイル内のサイズを取得
Type…ファイルの種類を取得
■メソッド
Copy…ファイルをコピー
Delete…ファイルを削除
Move…ファイルを移動する
OpenAsTextStreem…テキストファイルを開く
TextStramオブジェクトの内容
オブジェクト.CreateTextFile(ファイル名、上書き)
記載例)
Dim FSO New FileSystemObject
Dim MyText As TextStreem
Dim MyPath as Dtring
MyPath=CurrentProject.Path & "¥test"
Set MyText = FSO.OPenTextFile(MyPath & "¥01.txt",Forwriting)
MyText.Erite "12345"
MyText.Close
FileDialogオブジェクトの内容
ファイルまたはフォルダを参照するダイアログボックスを表示し、選択したファイル等へのパスを格納する
■ファイルを格納
Dim オブジェクト変数 As FileDiaLog
Set オブジェクト変数 = Application.FileDialog(msoFileDialogFilePicker)
■フォルダを格納
Dim オブジェクト変数 As FileDiaLog
Set オブジェクト変数 = Application.FileDialog(msoFileDialogFolderPicker)
FileDialogオブジェクト
プロパティとメソッドの種類
■プロパティ
Title…ダイアログボックスのタイトル
ButtonName…操作ボタンに表示される文字列
AllowMultiSelect…操作ファイルの選択が可能か指定
InitialFileName…初期表示されるフォル名やフォルダパスを指定
InitialView…ファイル等の初期表示を指定
Filers…選択できるファイルの種類を指定
FilerIndex…表示されるファイルの種類を指定
SelectedItems…選択したファイルパスを表示
■メソッド
Show…
ダイアログボックスを表示する
キャンセルボタンを押すと「0」、それ以外は「−1」を返す
FileDialogオブジェクト
InitialViewプロパティのクラス定数
msoFileDialogViewDetails…詳細表示
msoFileDialogViewLargeicons…大きいアイコン
msoFileDialogViewList…一覧表示
msoFileDialogViewPreview…プレビュー表示
msoFileDialogViewProperties…プロパティ表示
msoFileDialogViewSmallIcons…小さいアイコン
msoFileDialogViewThumbnail…縮小表示
OLEオートメーションの意味
Object Linking and Embeddingの略称
アプリケーション間でオブジェクトをやり取りするための規格
EXCELとの連携
事前バインディング
Dim オブジェクト変数 As Excel.Application
Set オブジェクト変数=New Excel.Application
EXCELとの連携
実行時バインディング
Dim オブジェクト変数 As Object
Set オブジェクト変数=CreateObject("Excel.Application")
OLEオートメーションのExcelオブジェクトの種類
Excel.Application…Excel本体
Excel.Sheet…Excelワークシート
Excel.Chart…Excelグラフ
VBAの高速化
定義域集計関数とRecordsetオブジェクト
Recorset(SQL)が高速
定義域集計関数
MyStr=Dlookup("社員名","社員マスタ","社員番号1=’S08000’")
↓↓↓
高速化書き換え例
Set DB=CurrentDb()
SQL="SELECT 社員名 FROM 社員マスタ WHERE 社員番号='S08000'"
Set rs = DB.OpenRecordset(SQL)
MyStr = rs.Filds("社員名")
VBA高速化
DatabaseオブジェクトとRecordsetオブジェクト
Datebaseオブジェクト
For i=1 To 1000
SQL=””INSERT INTO 社員マスタ
SQLのパターンマッチング
ワイルドカードの記載例
フィールド名 Like "パターン文字"
種類
* 任意の文字数 Like "*本"
? 任意の1文字 Like "?本"
# 任意の1文字の数字 Like "#組"
[文字リスト] 文字リスト内の1文字
Like "g[eo]t"
[!文字リスト] 文字リスト以外の1文字
Like "p[!eo]t"
[文字1-文字2] 文字1~2の範囲の1文字
Like "b[a-c]t"
[!文字1-文字2] 文字1~2の範囲以外の1文字
Like "b[!a-c]t"
ANSI-89とANSI-92の違い
ANSI-89…通常やDAOで使用 * ?
ANSI-92…ADOで使用 % -
SQLレコード化 GROUP BY句
のグループ化記載例
SELECT * FROM テーブル名 GROUP BY フィールド名;
SQL GROUP BY句使用時のSQL集計関数種類
SELECT 集計関数(フィールド名) As 別名 FROM テーブル名 GROUP フィールド名;
Count(フィールド名)
Avg(フィールド名)
Sum(フィールド名)
Min(フィールド名)
Max(フィールド名)
SQL GROUP BY句使用時の条件指定
HAVING句を使用
SELECT * FROM テーブル名 GROUP BY フィールド名 HAVING 条件式;
SQL 内部結合
INNER JOIN句の構文
SELECT *
FROM テーブル名
INNER JOIN
テーブル名 ON テーブル名.結合フィールド=テーブル名.結合フィールド
SQL 外部結合
LEFT JOIN句
RIGHI JOIN句
SELECT *
FROM テーブル名
LEFT JOIN
テーブル名 ON テーブル名.結合フィールド=テーブル名.結合フィールド
SQL 不一致レコードの抽出方法
外部結合で抽出条件にNUllを指定することで不一致レコードを抽出することができる
SELECT *
FROM テーブル名
LEFT JOIN
テーブル名 ON テーブル名.結合フィールド=テーブル名.結合フィールド
WHERE テーブル名.フィールド名=IS NULL;
SQL テーブル定義の変更
新しいフィールドを追加
ALTER TABER テーブル名 ADD COLUMN フィールド名 データ型(サイズ);
SQL テーブル定義の変更
既存フィールドの属性変更
ALTER TABER テーブル名 ALTER COLUMN フィールド名 データ型(サイズ);
SQL テーブル定義の変更
既存フィールドの削除
ALTER TABER テーブル名 DROP COLUMN フィールド名;
SQL インデックスを作成する
CREATE INDEX インデックス名 ON テーブル名(フィールド名1、フィールド名2…)
例)
Dim StrSQL As String
StrSQL ="CREATE INDEX idx備考 ON T在庫マスタ(備考;"
Current.QueryDafs("Qクエリ").SQL = StrSQL
Docmd.OpenGuery "Qクエリ"
SQL インデックスを削除する
DROP INDEX インデックス名 ON テーブル名
ADOのオブジェクト
7種類
・Connection
データベースへの接続を保持する
・Command
データベースのコマンドを保持する
・Recordset
レコードの集まりを保持する
・Field
フィールドを保持する
・Paramater
パラメーターを保持する
・Property
プロパティを保持する
・Error
エラーを保持する
ADO
データベースへの接続例
Dim オブジェクト変数 As ADODB.Connection
※カレントDBへの接続
Set cn=Currentproject.Connection
※カレントDB以外へ接続
Set cn=New ADODB.Connection
cn.ConnectionString="Provider=Microsoft.ACE.CLEDB.12.0;" & _
"Date Source=データベースファイルのパス"
cn.Open
ADO
Recordetオブジェクトの記載例
■方法1RecordsetでOpenする
Dim rs As ADODB.Recordet
Set rs=New ADODB.Recordset
rs.Open ソース,cn,カーソルタイプ,ロックタイプ
以下の書き方でもOK
Dim rs As New ADODB.Recordset
rs.Open ソース,cn,カーソルタイプ,ロックタイプ
■ConnectionでExecuteする
Dim rs As ADODB.Recordset
Set rs=cn.Execute(コマンド)
※コマンド…テーブル、クエリ、SQlなど
ADO
Recordsetオブジェクトのカーソルタイプ種類
・adOpenForwardOnly
前方スクロールのみ。前方向のみの移動なので高速。その他は静的カーソルと同じ
・adOpenKeyset
他のユーザによる追加・削除は確認できない。その他は動的カーソルと同じ
・adOpenDynamic
動的カーソル。すべての方向に移動可能。他のユーザによる追加、更新、削除を確認できる
・adOpenStatic
静的カーソル。すべての方向に移動可能。他のユーザによる追加、更新、削除を確認できない
ADO
Recordsetオブジェクトのロックタイプ
・adLockReadOnly(規定)
読み取り専用
・adLockPessimistic
レコード単位の排他ロック
・adLockOptimistic
レコード単位の共有ロック
・adLockBatchOptimistic
共有的バッチ更新
・adLockUnspectified
ロックタイプを指定しない
ADO
Recordsetオブジェクトのメソッド種類
・Open
・Close
・Move
・MoveFirst
・MoveLast
・MoveNext
・MovePrevious 戻る
ADOの記載例 2種類
方法1------------------------------
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = Currentproject.Connection
Set rs = cn.Excute(テーブルなど)
方法2------------------------------
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = Currentproject.Connection
Set rs = New ADODB.Recordset
rs.Open "テーブル等"cn,adOpenStatic
ADO
レコードの更新方法
Updateメソッドを使用する
① rs.Update フィールド1,値
② rs("フィールド").Value = 値
※Fieldオブジェクトの参照パターン
rs!(フィールド名).Value
rs.Fields("フィールド名").Value
rs("フィールド名").Value
ADO
レコードの追加方法
rs.AddNew
rs("フィールド").Value=値
rs.Update
ADO
レコードの削除
rs.Delete
ADO
レコードの検索
Findメソッドを使用する
rs.Find 検索条件,スキップ行,検索方向,開始位置
記載例)
Do
rs.Find "住所1='愛知県'"
If Not rs.EOF Then
Debug.Print rs("社員名"), _
rs("住所")
rs.MoveNext
Else
Exit Do
End If
FindメソッドでのNull検索
rs.Find "フィールド名=Null"
ちなみにSQLでは
フィールド名 Is Null
ADO
レコードの並べ替え
Sortプロパティを使用する
rs.Sort="フィールド名 ASCまたはDESC"
※並べ替えを行うには
CutsorLocationプロパティに「adUserClient」を設定する必要あり
ADO
レコードの抽出方法
Filterプロパティを使用します
rs.Filter="フィールド1=検索条件1 And フィールド2=検索条件2"
ADO
レコードセットをフォーム表示等に使用する使用する例
フォーム表示やコンボボックス、リストボックスに使用可能
この場合は、CursorLocationプロパティに「adUseClient」を設定する必要あり
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = Currentproject.Connection
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "テーブル名",cn
Set Me.コンボ1.Recorset=rs
コンボボックスの内容を解除
Set Me.コンボ1.Recordset = Nothing
Me.コンボ1.Requery
ADO
トランザクションの実装方法
以下のメソッドを使用
BeginTrans…トランザクションを開始
CommitTrans…変更内容を更新
RollBackTrans…変更を取り消して元の状態に戻す
記載例)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = Currentproject.Connection
Set rs = New ADODB.Recordset
rs.Open "テーブル名",cn,adOpenKeySet,adLockOptimistic
On Error GoTo ErrExit
cn.BeginTrans
Do Until rs.EOF
Loop
cn.CommitTrans
Msgbox "トランザクションを確定しました"
Exir Sub
ErrExit:
cn.RollbackTrans
Msgbox "トランザクションを取り消しました"
ADO
Excelブックへの接続方法
記載例)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim MyPath As String
MyPath = CurrentProject.Path & "¥"
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & MtPath & "test.xlsx;" & _
"Extended Properties='Excel 12.0;HDR=YES'"
Set rs= cn.Excute("SELECT * FROM [Sheet1$])
Do Until rs.EOF
Loop
ADO
例外処理 Errorオブジェクト
Error オブジェクトのプロパティ
・Number
・Description
・Source
記載例)
Dim MyErr As ADODB.Error
rs.Open "テーブル名",cn,adOpenKeyset,adLockOptimistic
on Error GoTo ErrExit
ErrExit:
For Each MyErr In cn.Errors
Msgbox "発生したエラー情報は次の通り” & vbCrLf & _
MyErr.Number & vbCrLf & _
MyErr.Source & vbCrLf & _
MyErr.Description
Next
DAOとADOの違い
DAOにはテーブルやクエリを作成する機能あり
Access単体で使用するのみ向いている
参照設定する必要はない
ADOはAccessのみでなく、SQLServerなどのデータベースにも接続できる
DAOでのデータベース接続方法
Set DB = CurrentDb
カレントDB以外
Set DB= OpenDatabase("データベースファイルパス")
DAO
テーブル・クエリの作成方法
新規テーブルの作成
CreateTableDefメソッドを使用する
新規クエリの作成
CreateQueryDefメソッドを使用する
DAO
CreateTableDefの記載例
Dim DB As DAO.Datadase
Dim TD As DAO.TableDef
Set DB = CurrentDb
Set TD = DB.CreateTableDef("T在庫マスタ")
TD.Fields.Append TD.CreateField("商品番号",dbText,4)
TD.Fields.Append TD.CreateField("在庫数",dbLong)
TD.Fields.Append TD.CreateField("在庫区分",dbText,4)
DB.TableDefs.Append TD
Set TD=Nothing:Set DB=Nothing
DAO
CreateQueryDefの記載例
Dim DB As DAO.Datadase
Dim QD As DAO.TableDef
Set SQL As String
Set DB = CurrentDb
SQL="SELECT * FROM T社員名簿 WHERE 年齢>=50;"
Set QD = DB.CreateQUERYDef("Q50以上社員",SQL)
Set TD=Nothing:Set DB=Nothing
エラーの種類
コンパイルエラー
文法の誤りなど
実行時エラー
コード実行時に処理継続できないエラー
論理エラー
プログラムが目的通りに動作しない
On Errorステートメントとは
エラーが発生した時に実行する処理を指定するステートメント
On Error Gotoステートメント
On Error Resume Nextステートメント
On Error Goto 0ステートメント
On Errorステートメント
On Error Gotoステートメントとは
エラーが発生したときに行ラベルの場所に移動して以降の処理を実行する
例)
Dim MyNumber As Long
On Error Goto ErrExit
MyNumber = InputBox("数字を入力" )
MsgBox MyNumber & "の値が入力されました"
Exit Sub
ErrExit:
MsgBox "数値が入力されませんでした"
End Sub
On Errorステートメント
On Error Resume Nextステートメントとは
エラーが発生してもエラーを無視して処理を継続する
例)
On Error Resume Next
Debug.Print 100/0
Debug.Print 100/1
Debug.Print 100/2
Debug.Print 100/4
End Sub
「100/0」は0除算エラーだがエラーメッセージは表示されない
On Errorステートメント
On Error Goto 0ステートメントとは
エラートラップを無効とする
Resumeステートメントとは
エラーが発生した際、処理を再実行する時に使用するOn Error Gotoステートメントが有効な時、エラー処理ルーチンでエラー処理を行った後、指定の場所から処理を再実行します
Resume
Resume Next
Resume 行ラベル
Resume ステートメント
Resumeとは
エラーが発生した場所から処理を再実行する
例)
Sub Test()
Dim MyNumber As Long
On Error Goto ErrExit
MyNumber = InputBox("数値を入力")
MsgBox MyNumber & "の値が入力されました"
ErrRetry:
ExitSub
ErrExit:
Select Case MsgBox("もう一度入力する?")
case vbYes
Resume
Case vbNo
Resume Next
Case vbCancel
Resume ErrRetry
End Select
End Sub
Errオブジェクトとは
実行時エラーが発生するとErrオブジェクトにエラーを識別する為の情報が格納される
Number…エラーの番号を返す
Description…エラーの情報を返す
エラー番号とエラー情報の種類
6…オーバーフローしました
7…メモリが足りません
9…インデックスが有効範囲にありません
11…0除算しました
13…型が一致しません
17…要求された操作は実行できません