- ベストアンサー
accessのVBAの記述についていくつか質問です。
質問が複数あるため、箇条書きにいたします。(質問の仕方がまちがってたらごめんなさい)どれも基本的な質問で申し訳ありません。 (1)エラートラップはすべてにつけたほうがいいのでしょうか? 極端に言えば、フォームを開くだけの時にもつけるものなのですか? みなさんはどのような基準でつけているのでしょうか。 (2)FUNCTIONプロシージャは「結果を返す」時に使うものとありますが いまいち意味がわかりません。SUBプロシージャでもできるのでは ないでしょうか?どのようなときに役立つものなのでしょうか? (3)ADO,DOAもマスターしたいと思っているのですが、参考書を見ても いまいち理解ができません(T T) なにかいい勉強方法、コツ、よい参考書があったら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
(2)について 組み込みのVBA関数なんかでIsDate()やらNow()やらありますよね。 IsDate()はカッコの中に入れた変数の中身が日付として評価できるならTrueを、日付として評価できない値ならFalseを返します。 自前でFunctionを作るので一番多いのは「入力された文字列をチェックする」です。 例えば・・・ 日付型のフィールドにデータを入れるためのテキストボックスがあったとして、その値が日付かどうかは先のIsDate関数でもできちゃいます。 だけど「日付だったらなんでもいいの?」という、そのデータベースだけで通用するルールも存在するわけです。 従業員名簿なら定年が60歳だから誕生日フィールドに今から61年以上前の日付は入らないし、16歳から入社できるならそれよりも後の日付も入らない。 こういうチェックをするために自前のFunctionを作りますね。 もとのイベントプロシージャ内に記述するとゴチャゴチャしちゃうでしょ? [更新]ボタンのイベントプロシージャには単純にデータを更新するためのコードしか書かない。 値をチェックするコードは別途Functionプロシージャに書いてイベントプロシージャから呼び出してあげれば、イベントプロシージャ内のコードがすっきりする。 Functionを呼び出す部分に「日付をチェック」とかコメントを書けば済んじゃう。 (3)について 今は意味がわからなくても、とにかくサンプルをどんどん経験して行くしかないと思います。 Access自体の入門書ではADOやDAOまで載ってませんから、ADO自体の書籍か、VB+ADOの書籍を狙ったらいいと思います。 ちなみにDAOは古い技術ですからなかなか見つからないと思いますが・・・ そして「オブジェクトの構造」を覚えちゃえば簡単ですって。 ADOであれば、Connectionオブジェクトって言う「データベースに接続するためのオブジェクト」があって、ConnectionStringプロパティに「接続するための情報」を文字列で指定する。Access2000以降であれば単純に Dim cn As ADODB.Connection Set cn = CurrentProject.Connection ってやるだけで全部済んじゃう。 テーブルやクエリーで開いたレコードのかたまりを取得したければRecordsetオブジェクトを使う。 Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "テーブル名またはクエリー名またはSQL文字列", cn ってするだけでOK。 そこから実際に各フィールドの値を取りたければ rs.Fields("フィールド名").Valueの値を取ればいい。 「あるレコードの中の特定のフィールドの値」なんだから見たまんまでしょ? ADOやDAOで開いている全てのレコードの値を取る場合はレコードを1件ずつループさせながら行う。 例えば10件あるレコードの場合、頭の中にエクセルのシートを思い浮かべる。 ちなみに今見てる行を「カレントレコード」って言います。 rs.MoveFirst Do Until rs.EOF MsgBox rs.Fields("フィールド1の名前").Value MsgBox rs.Fields("フィールド2の名前").Value ・・・ rs.MoveNext Loop こうやって、「レコードのかたまり」の最初の行から最後の行まで1行ずつループさせて、フィールド1つずつ値を取ってゆく。 まぁあせらずゆっくり勉強してくださいな。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
(3)の簡単な例を挙げます。これを色々な場合に修正し、繰り回して使いこみすれば、相当使えます。丸暗記するべきですが、意味も参考書で調べて習得してください。前半は他の質問に答えたもの、後半はADOとDAOの比較形式にしています。('の行がDAOの場合の表現) 内容はテーブル(マンション)を読んで、一部(販売フィールド、yes/no型のyes分)をアウトプットテーブル(売却済マンション)に追加しています。 (1)DAO Sub test01() Dim db As Database Dim rs As Recordset Dim ors As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("マンション", dbOpenDynaset) Set ors = db.OpenRecordset("売却済マンション", dbOpenDynaset) rs.MoveFirst While Not rs.EOF '------------ If rs!販売 = True Then ors.AddNew ors!マンション = rs!マンション ors.Update ' MsgBox rs!マンション End If '----------- rs.MoveNext Wend rs.Close ors.Close End Sub '=============================== (2)ADO Sub test02() Dim cn As ADODB.Connection ' Dim db As Database Set cn = New ADODB.Connection ' Set db = CurrentDb '--------- Dim rs As ADODB.Recordset 'Dim rs As Recordset Dim ors As ADODB.Recordset ' Dim ors As Recordset '-------- cn.ConnectionString = "provider=microsoft.jet.OLEDB.4.0;" & _ "data source=c:\My Documents\db7.mdb" ' db7データベース cn.Open '--------- Set rs = New ADODB.Recordset rs.Source = "マンション" 'マンションテーブル rs.ActiveConnection = cn rs.CursorType = adOpenDynamic rs.Open 'Set rs = db.OpenRecordset("マンション", dbOpenDynaset) Set ors = New ADODB.Recordset ors.Source = "売却済マンション" '売却済マンションテーブル ors.ActiveConnection = cn ors.CursorType = adOpenStatic ors.LockType = adLockOptimistic ors.Open ' Set ors = db.OpenRecordset("売却済マンション", dbOpenDynaset '--------- rs.MoveFirst ors.MoveLast While Not rs.EOF '------------ If rs!販売 = True Then ors.AddNew ors!マンション = rs!マンション ors.Update ' MsgBox rs!マンション End If '----------- rs.MoveNext Wend '-------- rs.Close 'rs.Close Set rs = Nothing ors.Close ' ors.Close Set ors = Nothing '------- Set cn = Nothing End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 (1)はただ開くだけなら、私は付けません。 (Open時の処理で、エラーの出る可能性がある場合は別です) (2)はSubでも出来ますが、「テーブル名と検索文字を渡すとテーブル内を検索してデータの個数を返す」とか、そういうロジックを複数の Sub で何度も使うような場合に、その都度 Sub の中に書いても良いけど Function にしてしまえば1つだけで済み、修正が必要な場合でもそこだけ直せばOKとなります。 例では、1.05 を 1.07 に直す必要が出来た時に Function 内だけの修正で済みます。 (簡単な例なのでその都度書いても対した手間ではないけど、、、) Function PLUS(i As Currency, j As Currency) As Currency PLUS = (i + j) * 1.05 End Function Sub a() MsgBox PLUS(100, 200) End Sub Sub b() MsgBox PLUS(300, 400) End Sub Sub C() MsgBox PLUS(500, 1400) End Sub (3)は他の方にお任せします。(^^;