Microsoft Access 掲示板

メインフォームに入力しないとサブフォームに入力できないようにしたい

28 コメント
views
4 フォロー

win10pro64
microsoft365access

【メインフォーム】F_受注入力_メイン
【サブフォームコントロール名】受注明細

メインフォームにあるコントロール「取引先コード」にデータが入力されて初めてサブフォームにデータが入力できるようにしたいのですがどのようにしたらできますか?
恐らく更新前処理のイベントプロシージャに「受注明細」のEnabledを制御するコードを書くと良いかと思いトライしようとしてますが全くダメです・・・。

恐れ入りますがお助けください。

涼子
作成: 2021/08/31 (火) 10:55:31
通報 ...
1

「取引先コード」テキストボックスの更新後処理のイベントプロシージャに下記のコードでどうでしょうか。

Private Sub 取引先コード_AfterUpdate()
   If IsNull(Me.取引先コード.Value) Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If
End Sub
2

hatena様

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

教えて頂いたコードを書いてみましたが「取引先コード」が空欄状態でも「受注明細」のコントロールにデータが入力できてしまいます。
理想は「F_受注入力_メイン」を開いた時は「受注明細」内のコントロールには入力できなくしたいので、上記コードを書いたうえで「受注明細」のプロパティーの使用可能をいいえにしたのですが、今度は「取引先コード」に入力しても「受注明細」が使用できないままの状態になってしまいます。

どうすればよろしいでしょう?
どうか宜しくお願い致します。

3

フォームのレコード移動時のイベントプロシージャにも同じコードを記述したらどうでしょう。
同じコードを記述のはちょっという場合は、取引先コード_AfterUpdate をCallすればいいでしょう。

Private Sub Form_Current()
    Call 取引先コード_AfterUpdate
End Sub
4

ありがとうございます。

フォームのレコード移動時のイベントプロシージャに同じコードを入れてみましたが「取引先コード」にデータ入力しても「受注明細」のEnabledがFalseのままで入力できない状態です。
因みに「取引先コード」のAfterUpdateをCallしてみても同じ状態でした。
先にコードが入っているのでそれの影響があるのでしょうか?

Private Sub Form_Current()

   If Me.NewRecord = False Then Exit Sub
       Dim AutoID As String
       Dim MaxID As Variant
       AutoID = Format(Date, "yyyymmdd")
       MaxID = DMax("受注コード", "T_受注", "Left(受注コード,8)=" & AutoID)
   If IsNull(MaxID) Then
       Me.受注コード.DefaultValue = AutoID & "001"
   Else
       Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
   End If
   If IsNull(Me.取引先コード.Value) Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If

End Sub

現状この状態ですが上記の動作になってしまいます。
何が原因でしょう?

5

If Me.NewRecord = False Then Exit Sub
これがあると新規レコード以外ではこれ以降のコードが実行されません。
このコードの前に、サブフォーム操作のコードを移動させてください。

Private Sub Form_Current()
   If IsNull(Me.取引先コード.Value) Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If

   If Me.NewRecord = False Then Exit Sub
       Dim AutoID As String
       Dim MaxID As Variant
       AutoID = Format(Date, "yyyymmdd")
       MaxID = DMax("受注コード", "T_受注", "Left(受注コード,8)=" & AutoID)
   If IsNull(MaxID) Then
       Me.受注コード.DefaultValue = AutoID & "001"
   Else
       Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
   End If

End Sub
6

ありがとうございます。

If Me.NewRecord = False Then Exit Subの前にコードを移動させました。
開いた時入力できない状態ですが、「取引先コード」に入力後も入力できない状態です。
因みに、「取引先コード」にも

Private Sub 取引先コード_AfterUpdate()
   If IsNull(Me.取引先コード.Value) Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If
End Sub

が入っている状態ですが、これを消しても動作が同じ状態です。
「レコード移動時」に書いたコードを消すと「受注明細」には常に入力できる状態になります。

原因はなんでしょう?

7
hatena 2021/09/02 (木) 11:09:18 修正 >> 6

「取引先コード」フィールドのデータ型はなんでしょうか。
また、規定値の設定はどうなってますか。
また、ルックアップの設定はどうなってますか。

8

おはようございます。

「取引先コード」のデータ型は[短いテキスト]
[規定値]は空欄
[ルックアップ列]はデータベース規定

となっています。
よろしくお願いします。

9

取引先コードの更新後処理を下記のように変更して
取引先コードに入力してから、サブフォームで入力できるか確認してください。
次に、取引先コードを削除して、サブフォームで入力できるか確認してください。
結果を返信ください。

Private Sub 取引先コード_AfterUpdate()
   If Nz(Me.取引先コード.Value)="" Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If
End Sub
10

ありがとうございます。

最初フォームを開いた時に「取引先コード」にデータ入力してない状態でもサブフォームに入力が出来る状態です。
「取引先コード」にデータ入力してもサブフォームに入力ができる状態です。
「取引先コード」のデータを削除したらサブフォームに入力が出来ない状態になります。

よろしくお願いします。

11

では、フォームのレコード移動時のコードを下記のように修正してください。

Private Sub Form_Current()
   If Nz(Me.取引先コード.Value)="" Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If

   If Me.NewRecord = False Then Exit Sub
       Dim AutoID As String
       Dim MaxID As Variant
       AutoID = Format(Date, "yyyymmdd")
       MaxID = DMax("受注コード", "T_受注", "Left(受注コード,8)=" & AutoID)
   If IsNull(MaxID) Then
       Me.受注コード.DefaultValue = AutoID & "001"
   Else
       Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
   End If

End Sub
12

【解決】
ありがとうございます!
望む動きになりました!

フォームのレコード移動時と「取引先コード」の更新後処理の両方に入れたら無事に動きました。
本当にありがとうございます!

また、相談させてください!
ありがとうございました。

13
涼子 2021/09/03 (金) 16:40:04 1a64f@e5635

【問題発生】
恐れ入ります・・・・
なぜか突然動作不良になってしまいました・・・。

「取引先コード」の更新後処理とフォームのレコード移動時両方に以下のコードがある状態で、「受注明細」が入力できない状態になります。

Private Sub Form_Current()
   If Nz(Me.取引先コード.Value) = "" Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If
   If Me.NewRecord = False Then Exit Sub
       Dim AutoID As String
       Dim MaxID As Variant
       AutoID = Format(Date, "yyyymmdd")
       MaxID = DMax("受注コード", "T_受注", "Left(受注コード,8)=" & AutoID)
   If IsNull(MaxID) Then
       Me.受注コード.DefaultValue = AutoID & "001"
   Else
       Me.受注コード.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
   End If
End Sub

Private Sub 取引先コード_AfterUpdate()
   If Nz(Me.取引先コード.Value) = "" Then
        Me.受注明細.Enabled = False
   Else
        Me.受注明細.Enabled = True
   End If
End Sub

フォームのレコード移動時のコードのみを消した場合、常に「受注明細」に入力できます。
「取引先コード」の更新後処理のコードを消しても「受注明細」には入力が出来ない状態です。
変わった事と言えば、その後、このフォームにコマンドボタンを一つ作りコードを書きましたが、原因追及のためボタンもコードも削除しました。
その他は触ってないはずなのですが、急に動作しなくなってしまいました。

他に何か考えられる原因はあるでしょうか?
どうぞよろしくお願いいたします・・・。

14
りんご 2021/09/03 (金) 17:24:17 c564b@0e907

変わった事と言えば、その後、このフォームにコマンドボタンを一つ作りコードを書きましたが、原因追及のためボタンもコードも削除しました。

おかしくなったので、コードを消したら、『フォームを閉じて、再度、開く』までやってみる。
元に戻らないなら、例えば、わかりやすいように、Msgboxをコードに入れてみる。

Private Sub ほにゃらら()
   Msgbox Me.取引先コード.Value
   If Nz(Me.取引先コード.Value) = "" Then
        Me.受注明細.Enabled = False
        Msgbox “あああ”
   Else
        Me.受注明細.Enabled = True
        Msgbox “いいい”
   End If
End Sub

ダメなら、テーブルのコピーを別に残して、元データを全部削除してみるとかやってみるのはどうですか?

15

リンゴ様

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

フォームのレコード移動時の部分の「Msgbox"あああ"」のみフォームを開いた時に現れます。
「取引先コード」に入力しても「Msgbox"いいい"」は現れません。
「取引先コード」の更新後処理の部分に入れた「Msgbox"あああ"」と「Msgbox"いいい"」はフォームのレコード移動時に入れたMsgboxを削除しても現れません。

また、元テーブルのデータを全て削除しましたが変わりがありません。

新たに作り直すしかないでしょうか?

16
りんご 2021/09/04 (土) 11:45:06 c564b@0e907

「取引先コード」の更新後処理の部分に入れた「Msgbox"あああ"」と「Msgbox"いいい"」はフォームのレコード移動時に入れたMsgboxを削除しても現れません。

 フォームを開き、デザインビューに切り替え、取引先コードを右クリック、プロパティをクリック。プロパティシートが表示されたら、イベントタブの更新後処理が空欄のままになっていないか見てください。
 もしも、空欄のままでしたら、[イベントプロシージャ]とする。(ビルダーの選択:コードビルダー)
 どうなりましたか?

17

取引先コードのプロパティーの更新後処理は「イベントプロシージャ」になってます・・・。

18

フォームを削除して新しく作り直して同じコードを書いてみましたがやはり同じ動作となってしまいます。
何が原因なんでしょう??

19
りんご 2021/09/04 (土) 15:45:43 c564b@0e907

 取引先コードを入力して更新後処理イベントを発生させるけれど、Msgbox、例えば、「Msgbox"更新後、使用可能になりました"」と「Msgbox"更新後、使用不可能になりました"」のどちらも出てこない。
 もしそうであるならば、更新後イベントのコードが期待通りに動いていないように見えるので、条件式等を簡略化して、If構文を制御出来るように試行錯誤するのですが。

Public Sub 取引先コード_AfterUpdate()
   Msgbox Me.取引先コード.Value
   If Me.取引先コード.Value = 1 Then
        Msgbox “取引先コードは、1です。”
   Else
        Msgbox “取引先コードは、1ではありません。”
   End If
End Sub

 返信の際は、『Msgbox Me.取引先コード.Valueのメッセージ』も教えて下さい。

20
涼子 2021/09/04 (土) 16:51:34 1a64f@e5635

新しく作った方のフォームで試しました。
お教えいただいたコードを「取引先コード」の更新後処理に書いてみました。
「取引先コード」にデータを入力しても全く何もメッセージが出てきません。
この状態でフォームの移動時のコードはそのままの時は「受注明細」には入力できません。
どうしてなのでしょう・・・。

21
りんご 2021/09/04 (土) 19:03:11 c564b@0e907

 「取引先コード」にデータを入力して、更新後処理発生(取引先コード以外をクリック等)しても、全く何もメッセージが出てきませんか?
 やっぱり何もメッセージが出なければ、ごめんなさい、此方の力及ばずでした。

23

リンゴ様

「取引先コード」に入力後、ほかの部分をクリックしても同様です・・・。
色々お力添え頂きありがとうございます。

22

外部からは判断の難しい状況になっているようですね。
実際のファイルを見ないと原因究明は難しいかもしれません。

この掲示板の右カラムの一番下に「ファイル送信フォーム」があります。
そこからファイルを送信することができますので、
うまくいかない現状のファイルを送ってもらえたら、
原因がわかるかもしれません。

24

hatena様

ありがとうございます。
ではファイルを送ります。
どうか宜しくお願い致します。

25

ファイルを見ましたが、
「T_受注」と「T_受注明細」がリンクテーブルの為、フォームを開くことができません。

ローカルテーブルに変更したものを、再度、送付してもらえませんか。

26

大変失礼いたしました・・・。
再送しました。
宜しくお願いします。

27

再送ファイルを見てみました。

「F_受注_メイン」フォームのことだと思いましたので、そのフォームを開いて試してみました。
開いた直後は、取引先コードは未入力なので、サブフォームは操作できません。
取引先コードにコードを手入力したら、サブフォームは操作できるようになりました。
コードを削除したら、サブフォームは操作できなくなります。
メインでレコード移動して、移動先が取引先コードが未入力ならサブフォームは操作できない、入力済みなら操作できます。
問題ない動作のようです。

ただし、取引先コードの横にコマンドボタンがあり、そこから別フォームを開いて、取引コードを選択して入力できるようになっていますが、それで入力した場合、サブフォームは操作できるようになりません。
このようにVBAでテキストボックスの値を更新した場合、更新後処理は発生しないためです。
下記のように別フォームを開いた後で、更新後処理を呼び出せば、別フォームで入力したときも正常に動作するようになります。

Private Sub コマンド_取引先検索_Click()

  DoCmd.OpenForm "F_取引先マスタ_抽出_受注", , , , , acDialog
  Call 取引先コード_AfterUpdate
  
End Sub
28

【解決】
hatena様

ありがとうございます!
おっしゃっている通りの動作が再現出来ました!
「VBAで値を更新した場合・・・」そうなのですね!?
大変勉強になりました。

今回も本当にありがとうございました!