10秒目をつむったら…

いつもお世話になっております。

未だ初心者のものです。

表題ではわかりにくいと思いますが、ああしか書けなかったのでお許し下さい。

本題ですが、人員の情報フォーム(フォームA)に、コマンドボタンを設け、他のフォーム(フォームB)を開く作りにしています。
コマンドボタンを作成するときに自動起動されるウィザードにしたがって、人員のIDとマッチするデータを表示するよう、コマンドボタンは設定されています。

フォームBの元になっているテーブルに、その人員のIDと付帯情報が入っていればフォームBはうまく表示されるのですが、まだ付帯情報が入っていない場合、当たり前ですが空白のフォームが現れます。

そこでご相談なのですが、フォームBの元テーブル(あるいはクエリ)にデータがない場合はフォームB用のデータ入力をさせるフォーム(フォームC)を表示させる様にはできませんでしょうか?

これだけの情報ではイメージできないかも知れませんので、追加情報が必要であれば、逆質問をお願いします。

よろしくご回答のほど、お願いします。

A 回答 (1件)

幾つか方法はありますが、比較的わかりやすいと思われる、DCount関数で


レコードの有無を確認し、If文で条件分岐、という方法をご紹介します:

'【ウィザードで作られたVBA(コマンドボタン名=コマンド3)】
Private Sub コマンド3_Click()
On Error GoTo Err_コマンド3_Click

  Dim stDocName As String
  Dim stLinkCriteria As String

  stDocName = "フォームB"
  
  stLinkCriteria = "[ID]=" & Me![ID]
  DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_コマンド3_Click:
  Exit Sub

Err_コマンド3_Click:
  MsgBox Err.Description
  Resume Exit_コマンド3_Click
  
End Sub

'【加筆修正したコード】
Private Sub コマンド3_Click()
On Error GoTo Err_コマンド3_Click

  Dim stDocName As String
  Dim stLinkCriteria As String
  
  stLinkCriteria = "[ID]=" & Me![ID]

  'DCountの結果で、開くフォーム名(→stDocName)を切替
  If DCount("*", "フォームBの元テーブル", stLinkCriteria) = 0 Then
    stDocName = "フォームC"  'レコード不在(=0)時はフォームCを指定
    DoCmd.OpenForm stDocName  'stLinkCriteriaは使用しません
  Else
    stDocName = "フォームB"  'レコード存在時はフォームBを指定
    DoCmd.OpenForm stDocName, , , stLinkCriteria
  End If

Exit_コマンド3_Click:
  Exit Sub

Err_コマンド3_Click:
  MsgBox Err.Description
  Resume Exit_コマンド3_Click
  
End Sub

・・・以上です。
なお、コードの理解を最優先に考え、「ID自体が空白(Null)」といった場合の
例外処理は入れていません。
(呼び出しもとのフォームAが、そういうデータを表示しない場合、杞憂という
 ことにもなりますので・・・)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

コードを読み解きまして、「ID」フィールドを「文字列」とするよう、改造した結果、うまく分岐してくれるようになりました。

本当に助かりました^^

ありがとうございました。

お礼日時:2010/03/01 11:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す