豚吐露@wiki

Access2007

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可






【フォーム関係】
画面上アイテムの空文字とNull
textboxが空のとき、textbox.valueは『null』または『空文字』になるらしい。
どうも環境によって変化するため、一概にNull!!とか空文字!!とか言えんらしい。
そういう時のためにNz関数がある。これは与えた値がNULLだったら『""』を返してくれる。
なので画面上の入力アイテム(e.g. textboxや空欄のあるcmbbox)は必ずNz関数を使った方が良い
ただし、textbox.textは空欄だと必ず『""』になるみたい。
値読む前にsetFocusせんといけんのがめんどくさいけどね。(´Д`)

入力規則の使い方
各アイテムのプロパティにある『入力規則』の使い方。
『Len([【制限対象object】])<=【桁数】』とするとその条件に当てはまらない場合『エラーメッセージ』で指定した文字列がpopupされる。
この時指定したエラーメッセージは指定できない。

サブフォームのCheckBox
サブフォームにcheckboxがある時、そのサブフォームに関連付けたtableに主キーが無いと、チェックできない。

accessからtableにアクセスする
accessで使うtableには必ず主キーを設定する事。
設定の無いtableにはaccessから操作できません。
SQLで言えばwhere句で条件指定をする時の『DELETE』や『UPDATE』も主キーが無いと怒られます。

Textboxで自動改行される
accessではtextboxの高さに対して文字の高さがある程度小さいと勝手に折り返しされる仕様らしい。
e.g.)
文字サイズ12p、Textboxの高さ0.65cm ⇒ 折り返される
文字サイズ12p、Textboxの高さ0.60cm ⇒ 折り返されない

サブフォームで並べ替えたい
サブフォームにレコード突っ込む時、orderbyしててもサブフォームの好きなように並べ変えられる。
任意の項目について並べ替えたい時は...
サブフォームをデザインビューで開き、フォームのプロパティを表示。
『並べ替え』という項目があるのでそこに『hoge』っていれると『hoge』について昇順に、『hoge DESC』って入れると『hoge』について降順に並べられる。
ただし『読み込み時に並べ替え』って項目を『はい』にすること。

【VBA関係】
textboxのtextとvalue
textboxのtextとvalueの違いはほぼ無い。違うのはtextがそのobjectにフォーカスが当たってないと取れないのに対し、valueはいつでも取れる。
e.g.)Text
txtTest.setForcus
txtTest.text
e.g.)Value
txtTest.Value
ちなみに、textboxのobjectを指定して直接渡した場合、textbox.valueが渡された事になる。
また、textとvalueで格納できる文字列数も異なる。
text:  2048
value: 65535
空欄の時に値を取得しようとした場合も挙動が違う。
text:  必ず『""』が取れるみたい。
value: 『""』が取れる場合と『null』が取れる場合とあるみたい。

Variant型のコスト
なんでも入るvariant型は便利だが、variant以外の型に比べてコストが高いのでvariant型はなるべく使わないようにする。

Option Compare Database
VBAの各file冒頭に定義。
このoption設定時は、大文字と小文字を区別しない

Option Explicit
VBAの各file冒頭に定義。
このoption設定時は、変数宣言が無いと怒られる

Left、Mid、Right
上記関数を使う場合のindexの最小値は『0』でなく『1』。
『0』を指定すると落ちる。(´Д`)

if文にnullが入ると...
その判定自体がFalseになるらしい。
nullの判定ができるのはIsNull関数だけらしい。
なので、例えば
If "" <> txtTemp.value Then
	msgbox "True"
Else
	msgbox "False"
Endif
ってやってると、txtTempに入力が無い場合、txtTemp.valueはNULLとなる場合があるので判定は無条件にFalseとなる。
入力がある場合は、当然Trueとなる。
あたかも正しいように見えてしまうが、実際はたまたま動いているだけなので注意。

if文にNothingが入ると...
Nothing判定とその判定対象値を使う判定を書いてると...
Nothingだった時に落ちる。(´Д`)
e.g.)
if hoge is nothing or hoge.eof then
とかアウト。
Cとかと違ってif内の左側から順番に評価というプロセスは取ってないらしい。
※nullも同じみたいなので注意。

コンボボックスのクリア
cmbTemp.RowSource = ""

配列長の取得
len = UBound(array)
※array:配列, len:配列長

『print』と『?』
イミディエイトウィンドウで『Hoge』って変数の値を見たい場合、
print Hoge
ってやるが、これと
?Hoge
ってやるのは一緒らしい。

数値を切捨てるには?
少数をCInt()したり、整数型の変数に代入すると
『10/3=3.333… ⇒ 0』『20/3=6.666… ⇒ 1』
と、勝手に四捨五入される。
これを防ぐにはCInt()では無くInt()を用いて処理する。
e.g.)
CInt(20 / 3) = 7
Int (20 / 3) = 6
割り算をするところでは四捨五入されることを前提に処理を考える必要がある。

form_openでformを開くのを中断する
FormA→FormB って開いてるとする。
FormBのform_openには引数『Cancel』があるが、これが処理を中断するFlg。
で、これに『0以外』を突っ込む。こいつはIntegerなので、0以外じゃったらなんでもokっぽぃ。
e.g.)
Cancel = true
ただし、中断した場合、その画面の呼び出し元(FormA)ではエラーが発生する。
なので、キャンセルが来る可能性があるところでは、必ずErrorTrap処理を入れる事。

On Error Gotoで飛んだ場合、ErrorTrap内で処理はしちゃダメ
On Errorで飛んだ先の処理は極力簡素にする。
例えば、err.numberを返却するだけとか...
On Errorで飛んだ先でエラーが出るとError Trapできないので、想定外の動作をすることになる。
betterな形は、最小機能単位でプロシージャを作り、プロシージャ内でerror trap。
上位ではその戻り値等から判断するようにする。

【SQL】
Database.Openrecordsetの使い方
OpenrecordsetでSELECT文を実行する場合、複数テーブルから値取る場合は取得カラムに別名付ける方が無難。

Insert文の使い方
『insert into 【table名】』の後の入力対象カラム名は省略できんらしい。

ACCESSからカラム名等に別名を付けたSQLを走らせる時
通常、別名設定時の『AS』は省略可能だが、AccessからSQLを実行するときは省略不可らしい。

コンボボックスに複数行ある時の任意の列の取り方。
'任意のコンボボックスにfocusを当てる。当てないとListIndex指定時、『Err.Number=7777』で落ちる。
cmbTemp.SetFocus
'任意のデータを選んで
cmbTemp.ListIndex = 0
'任意のカラムの値を表示 ※カラムは0から始まる
print cmbTemp.Column(0)

副問合せについて
FROM句んトコに副問合せ使えないらしい。
※DB ServerがMSDE2000の場合だけ?

Access経由で日付の絞り込みを行いたい
Access経由でSQL鯖へSQLを送るとき、WHEREとかにDATETIME型のカラムとの比較が入ってたとする。
この時『where tmp_tbl.update_date<'2010/01/01'』とかすると、型が違うって怒られる。
Accessでは『where tmp_tbl.update_date<#2010/01/01#』このように記述せんといけんらしい...
ただし、docmd.runsqlでは効かないらしい。

『DoCmd.RunSQL』と『DAO.Database.Execute』では動作が違う
SQLを実行する方法には『DoCmd.RunSQL』と『DAO.Database.Execute』があるが...
RunSQLはネットワークが切断されててもerrorが発生しないことがある。
※外部DBにアクセスするような形になってる場合。
ExecuteではINSERT文実行時に一意制約違反時にerrorが発生しない。

『Print』で改行したくない
fileへ出力する場合『Print』を用いるが、普通に書くと末尾に勝手に改行が入る。
末尾に改行を付けたく無い場合は、Print文の末尾に『;』を付ける。
e.g.)
Print #fn, strin;	'改行されない
Print #fn, strin	'改行される
謎な仕様だ...(´Д`)




【BOF】
Begin Of File
File始端に達した。Accessの場合、カーソルが最初のrecordを超えたって事を意味する。

【EOF】
End Of File
File終端に達した。Accessの場合、カーソルが最後のrecordを超えたって事を意味する。




更新日: 2010年07月08日 (木) 11時05分01秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー