例)
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
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
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)
定義域集計関数
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 フィールド名;
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クエリ"
方法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
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
記載例)
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
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