DB、Table関係
Q1:VBAでレコード追加を行うと時、システムが確認メッセージを必ず表示する。これを抑止したい。
A1:システムは、A、Bテーブルの先頭フィールドから、いちいち比較しながら複写しているらしい。
そのため、追加フィールドのところで、A、Bが不一致になった。
対策は、「書式メニュー」内に「列の非表示」コマンドがある。それで、A、B量テーブルの構造を同じにしてから、
コピーすると問題ない。
A: メニューの[ツール]-[オプション]の設定を変更すればよい。これをVBで行うには
Dim ac Variant
ac= Application.GetOption("ConfirmAction
Queries")
If ac Then
Application.SetOption "Confirm Action
Queries", False
End If
で、処理が終われば、下記のコードで最初の状態に復帰させる。
If acThen
Application.SetOption "Confirm ActionQueries",
True
End If
Q2:テーブルAに新規フィールドを追加し、Bを作成した。このとき、データシートビューで、
AのデータをすべてBへコピーしようとしたら、「データ型、フィールドサイズが不一致エラー」になった。
A2:システムは、A、Bテーブルの先頭フィールドから、いちいち比較しながら複写しているらしい。
そのため、追加フィールドのところで、A、Bが不一致になった。
対策は、「書式メニュー」内に「列の非表示」コマンドがある。それで、A、B量テーブルの構造を同じにしてから、
コピーすると問題ない。
Q3:VBAを使用して最適化したい。
A3:まず、最適化をする上での注意事項。
対象となるDBは必ず閉じる。
・最適化する前にまずバックアップを作成する。最適化でDBが壊れたと言う例がある。
実際のコーディングはは下記の通り。
gDBname = フルパス名称 (c:\.....xxxx.mdb)
bname = バックアップ名称 (c:\.....xxxx.bak)
newdb = 最適化直後の名称。(c:\.....xxxxnew.mdb)
という形式である。
bname = Mid$(gDBname, 1, InStr(gDBname, ".mdb"))&
"BAK"
newdb = Mid$(gDBname, 1, InStr(gDBname, ".mdb")-
1) & "new.mdb"
On Error Resume Next
Kill bname
'* ファイルが見付からないエラーの場合には無視する。
If Err <> 0 And Err <> 53 Then
GoTo ERR_COMPACT
End If
On Error GoTo ERR_COMPACT
'* バックアップを作成する。
FileCopy gDBname, bname
'* データベースを最適化する。
Me.Hourglass = True
DBEngine.CompactDatabase gDBname, newdb
Me.Hourglass = False
'*現在のmdbを削除し、最適化したmdbを現在のmdbとする。
Kill gDBname
Name newdb As gDBname
注意:もし他のユーザが使用中ならば、FileCopy
の段階で、エラー70 書き込みできないエラーになる。
FORM関係
Q1:入力されたデータの組合せが既存のものには無い。で,入力エラーを示し,
再入力をさせたい。再入力が無い間は,フォーカスを他のコントロールへ移したくない。
A1:BeforeUpdate イベントプロシジャを使用する。
このプロシジャで入力チェックをすればよい。
If IsNull([フィールド名]) Then
if ここでデータのチェック
MsgBox "このデータは未登録です。"
Cancel = True
End If
この例では入力の有無をチェックしている。ここで重要なのは
Cancelフラグのセットである。Trueに設定することにより,当該イベントをキャンセルできる。ということは,イベントが発生する以前の状態に戻ることになる。具体的には,フォーカスが移動しない。
Cancel = trueである限り,フォーカスは移動しない。
Q2:日付フィールドで比較したい。
A2:
where 条件で
[入力日] = #1996/12/09#
とする。前後に #を付加するところが重要な点。
例)
da = yyyy/mm/dd 形式の日付。
rn = レポート名称
req = acNormal,acReview
Sub DayPrint(rn$, req$, da$)
'* Report でもトラップしているが,OpenReportの戻り値がエラーなので。
On Error GoTo DAY_ERR
DoCmd.OpenReport rn, req, , "[入力日]
=#" & da & "# "
Exit Sub
DAY_ERR:
If Err <> 2501 Then
MsgBox "レポートの処理中にエラーが発生しました。"
& Chr(10) & "errcode = "
& Err
End If
End Sub
Q3:帳票形式のフォームで,カレントの移動に応じた処理をしたい。カレントレコードが移動したことをどうやって検知できるのか?
A3:
From.Current イベントプロシジャを使用する。
Current イベントは,そのレコードがカレントになったときに発生する。フォームが開いたときと,フォーカスがレコード間を移動したときのいずれの場合にも発生する。さらに再クエリを実行したときにも発生する。
Current イベントプロシジャは最初のレコード又は次のレコードが表示される前に実行される。したがって,これを使うとカレントレコード内容に依存した処理ができる。
record1
↓
record2
このときにイベントが発生する。でこのイベントプロシジャでカレントを参照すると,record2
が得られるわけである。
Q4:テキストボックス日付入力。
1999/10/01 としたい。
A4:
2個所のプロパティを変更する。
1)「書式」プロパティの変更
yyyy/mm/dd
とする。
2)「定型入力」プロパティの変更。
1)の変更で該当データの形式でDB登録ができる。ただし,入力時の形式はベタ入力になる。
そこで,ここを下記のように設定する。
9999/99/99 すると ____/__/__ と入力できるようになる。
ちなみに,9999/99/99;1;"_" が正式な指定方法。このうち中央の数値は
0,1 の指定が可能。省略時は1。1の時は入力されたデータだけがDBへ入る。つまり,
/ は入力されない。0 なら / まで入力される。
しかし,たとえ 1 の場合でも。テーブルフィールドの書式設定が
yyyy/mm/dd となっていれば,こう表示されるので,0
指定と同じこと。
省略時解釈は1である。入力文字のみが保存される。
/ は保存されない、と言うこと。
定型入力:InputMask
テキストボックスにデータをどのように入力して,どのように表示するかを決める。DBに保存される内容を決める。
書式:Format
数値,日付,時刻,テキストを表示または印刷するときの形式を決める。
DB内への保存処理へは関与しない。