こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access2003でフォームにあるコマンドボタンで更にフォームを開く

Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。


Access2003で社員情報管理のデータベースを作成中です。
社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。

この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。

Private Sub コマンドボタン_Click()

DoCmd.OpenForm "詳細情報フォーム"

Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号]

End Sub

【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。

困っているのは、

1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう

2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。
(つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。)

【詳細情報】は、
1.データを入力する社員としない社員とがいる
2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある

ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。
ぜひぜひよろしくお願いします。

投稿日時 - 2010-05-06 13:19:33

QNo.5875433

すぐに回答ほしいです

質問者が選んだベストアンサー

> "詳細情報フォーム"のもととなるテーブルに、1行でも
> レコードがあると、それが出てきてしまう。

これに関しては、
 a)詳細情報フォームのレコードソースに使用している
  テーブルから、基本情報フォームのデータを絞り込み
  条件とするクエリを作成し、これを詳細情報フォーム
  のレコードソースにする
 b)詳細情報フォームを開くときに、基本情報フォームの
  データでフィルタを掛ける
の、おおまかに2種類の対処方法があります。

使い勝手などからすると「a」の方がよいのですが(→「b」
の方法だと、右クリックメニューなどでフィルタを解除すると
現状と同じになってしまう)、現状からの改変が少ない分、
わかりやすいと思われる、「b」の方法を以下に提示します:
(英数混じりの場合への対処も組み込み済みです)

Private Sub コマンドボタン_Click()

  '変数の宣言
  Dim strCode As String

  '『社員番号』を「"」(ダブルクォート)で囲んだ形で記録
  '(→既定値やフィルタ条件に文字列を指定するには必須)
  strCode = Chr(34) & Me![社員番号] & Chr(34)

  '社員番号をフィルタ条件として指定して詳細情報を表示
  '(詳細情報未登録の社員の場合は、空のレコードが表示されます)
  DoCmd.OpenForm "詳細情報フォーム", , , "社員番号=" & strCode

  '既定値(DefaultValue)を設定
  '(既定値への代入なら、入力済みのデータは変更されません)
  Forms![詳細情報フォーム]![社員番号].DefaultValue = strCode

End Sub


・・・以上です。
コード中のコメントにも書きましたが、文字列を既定値やフィルタ
条件に使用する場合は、ダブルクォート(場合によってはシングル
クォート)を括ってやる必要がある、ということです。
(そうしないと、社員番号が「ABC123」の場合、その文字列では
 なく「ABC123」というフィールドやコントロールの値が参照されます
 (→そして該当するものがないので「#Name?」エラーが発生、と))

なお、日付/時刻型のデータを扱い場合は、今度は「#」で値を
括ってやる必要があります(「#2010/05/06#」など)ので、併せて
今後の参考まで。

投稿日時 - 2010-05-06 14:40:42

お礼

回答ありがとうございます。
教えていただいたとおりの記述で無事うまくいきました。
ありがとうございました。

投稿日時 - 2010-05-10 03:33:28

このQ&Aは役に立ちましたか?

18人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号]

以下にしてみてどうなりますか。

Forms!詳細情報フォーム![社員番号].DefaultValue = "'" & Me![社員番号] & "'"


また、社員番号で絞込み表示するには、以前のご質問での
InputBoxで読み込み&絞込みを応用してみてください。
その処理の部分で、呼び出し元を参照した既定値設定をしてみてください。

  stName = "'" & Forms!基本情報フォーム![社員番号] & "'"
  Me![社員番号].DefaultValue = stName
  Me.Filter = "社員番号=" & stName
  Me.FilterOn = True

とか(この場合は呼び出し元での既定値設定は要りません)

投稿日時 - 2010-05-06 14:59:33

お礼

回答ありがとうございます。
今回は#1さんの方法でやってみました。
またよろしくお願いいたします。

投稿日時 - 2010-05-10 03:34:27

あなたにオススメの質問