Microsoft Access 掲示板

views
4 フォロー
6,283 件中 3,241 から 3,280 までを表示しています。
21
りんご 2021/09/04 (土) 19:03:11 c564b@0e907

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

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

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

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のメッセージ』も教えて下さい。

18

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

17

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

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

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

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

15

リンゴ様

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

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

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

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

11

ODBCのドライバですが、[ODBC Driver 17 for SQL Server]をインストールし、
ADODBの接続に"Provider=MSOLEDBSQL";としてもダメでした。
(ちなみにSQLOLEDBも試しましたが同様でした。)

おや。
MSOLEDBSQL プロバイダは ODBC ではなく、OLEDB ドライバーではなかったでしょうか。
Microsoft OLE DB Driver for SQL Server

あと、念の為に申し上げておきますと
ODBCドライバが関係するのは、「 リンクテーブル 」です。
ADO で SQLServer に接続しているコードにおいては
OLEDB接続のため、ODBCドライバは関係ありません。
  

DAO接続では正しく動作したのでそうすればよいのですが、
修正箇所が多く…またデータ量が多いうえ
多人数で使用するシステムなので出来ればADO接続の方が良いのかなと考えています。

私はクロさんと見解が少し異なります。

ADO は【 SQLServerに接続し、操作するミドルウェア 】という点においては
確かに DAO より優位であると考えています。
ですが、Access フォームに SQLServer のデータをバインドする
という状況下では、利用しないでしょう。

ADO を利用しない理由としては、Access のフォーム
つまり Me.Recordset が DAO そのものであるから、です。
( Me.Recordset が ADO でいられるのは、現在は利用できない ADP だけですね )

なので、Set Me.Recordset = rs というコードは
ADO.Recordset が DAO.Recordset に暗黙変換されて
Access のフォームにバインドされます。
動作原理はリンクテーブルと似たりよったりでしょう。

したがって、パフォーマンスをお求めの場合はリンクテーブルではなく
パススルークエリをフォームのレコードソースに指定することをお薦めします。
  

' イケてないADO 接続(テキストボックスに#Name?が表示される)

以下のようにコードを変更して原因を探ってみてはいかがでしょう。

Private Sub cmdADODB_Click()
    '■ 参照設定を Microsoft ActiveX Data Objects 6.X Library に変更
    
    Dim rs As ADODB.Recordset '■ Nothingの状態に移行出来ないため、宣言時にNewはつけない。
    Dim strSQL As String
    
    strSQL = "SELECT * FROM SQLServer上のテーブル WHERE DATA1 LIKE '%みかん%'"
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient '■ クライアントカーソルに変更
    rs.Open strSQL, cn, adOpenStatic, adLockOptimistic
    
    Set rs.ActiveConnection = Nothing '■ RecordsetをSQLServerと切り離して独立させる
    Set Me.Recordset = rs
    
    If rs.EOF = False And rs.BOF = False Then
        Me.txtData1.ControlSource = rs![Data1].Name
        Me.txtData2.ControlSource = rs![Data2].Name
    End If
    
    Set rs = Nothing
End Sub
10
りんご 2021/09/03 (金) 21:19:44 c564b@0e907

ODBCのドライバですが、[ODBC Driver 17 for SQL Server]をインストールし、ADODBの
接続に"Provider=MSOLEDBSQL";としてもダメでした。(ちなみにSQLOLEDBも試しましたが同様でした。)

ODBCドライバーをインストールしたけれど、ADO接続が上手く出来ない、という事ですが、もしかしてOLEDBドライバーも要るのかも?正直、サーバー接続までやったことがないので、間違えならごめん。
Access を SQL Server に接続する - Microsoft Support
画像

9
くろ 2021/09/03 (金) 18:32:50

すみません、私の勘違いがありましたので、訂正と報告です。

データはSQLServer上にあり、リンクテーブルからADOdbで読んでいます。

これはリンクテーブルではなく、SQL Server上のテーブルから読んでいました。
rsがADODBで接続されているので当然の事でした。

同じくAccess上にリンクテーブルも張られていましたが、こちらはクエリを使用するためで
試しにリンクテーブルをすべて削除しても動作変わらずでした。(リンク先が無いエラーにはなりませんでした。)

ODBCのドライバですが、[ODBC Driver 17 for SQL Server]をインストールし、ADODBの
接続に"Provider=MSOLEDBSQL";としてもダメでした。(ちなみにSQLOLEDBも試しましたが同様でした。)
また、ODBCデータソースアドミニストレータ(64ビット)において、インストールした
ODBC Driverを使ってシステムDSNを構成し、このDSNを使って接続した場合も結果同じでした。

mayu様より、リンクテーブルを使ってDAOで読めば良いとのアドバイスをいただき試したところ、
この場合は正しく動作しました!ありがとうございます!!

DAO接続では正しく動作したのでそうすればよいのですが、修正箇所が多く…またデータ量が
多いうえ多人数で使用するシステムなので出来ればADO接続の方が良いのかなと考えています。

64bitAccessへの移行はすぐに絶対対応しないといけないと言うわけでもないため、引き続き
良い解法が無いか探しています。
引き続き良いアイデアがあればアドバイスいただけますと幸いです。

以下、試行中のイケた接続とイケてない接続方法です。

' イケてないADO 接続(テキストボックスに#Name?が表示される)
Private Sub cmdADODB_Click()
    Dim rs As New ADODB.Recordset
    Dim strSQL As String

    strSQL = "SELECT * FROM SQLServer上のテーブル WHERE DATA1 LIKE '%みかん%'"
    rs.Open strSQL, cn, adOpenStatic, adLockOptimistic
    ' cn はADODB.Connection としてSQLServerに接続しています。

    Set Me.Recordset = rs

    If rs.EOF = False And rs.BOF = False Then
        Me.txtData1.ControlSource = rs![DATA1].Name
        Me.txtData2.ControlSource = rs![DATA2].Name
    End If

    Set rs = Nothing

End Sub

' イケたDAO接続(でも修正箇所多く、処理速度に不安あり)
Private Sub cmdDAO_Click()
    Dim rs As DAO.Recordset
    Dim strSQL As String

    Set db = CurrentDB
    ' dbはDAO.Databaseとして宣言されています。

    strSQL = "SELECT * FROM リンクテーブル WHERE DATA1 LIKE'%いちご%'"
    SET rs = db.OpenRecordset(strSQL)

  Set Me.Recordset = rs
    ' これが無いと#Name? になりました。

    If rs.EOF = False And rs.BOF = False Then
        Me.txtData1.ControlSource = rs![DATA1].Name
        Me.txtData2.ControlSource = rs![DATA2].Name
    End If

    Set rs = Nothing
    Set db = Nothing

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

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

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 (金) 14:23:20 ddfe5@73ff2

hatena様
回答ありがとうございました。全てアドバイス通りにしましたら問題なく実行できました。解決しました! 私が記述ルールを理解してなかったのと名前がごっちゃになっていたのですね。色々してたら混乱してしまって・・・本当にありがとうございました。すっきりしました。
朱色様へ
私の説明不足(分かりにくい表現等)の中、何度も回答頂きありがとうございました。大変お手数かけました。大変勉強になりました。本当に感謝です。

ACCESSはなんて便利だろうと思って使っているのですが、奥が深いですね・・・

6

なるほど
サイズコードを軸に組み立てれば管理できそうですね。
テーブル設計例まで考えていただきありがとうございます。
期首日を利用しての管理方法は考えていなかったので、盛り込んで検討してみます。

3
Access初心者 2021/09/03 (金) 13:33:34 3e392@b524f

連投申し訳ありません。
レポートの件ですが作成しなくてもよくなったので取消いたします。
テーブル1のフォームにテーブル2.3のサブフォームを埋め込むというアドバイスを頂き誠にありがとうございました。
こちらで引き続き作成していきたいと思います。
こちらのスレは解決とさせていただきます。
ありがとうございました。

2
Access初心者 2021/09/03 (金) 13:24:04 3e392@b524f

hatena様
回答いただきありがとうございます。
このクエリをもとにレポートを出したいのですがレポートも同じようにサブフォームを埋め込めばよいのでしょうか?
フォームで情報を編集した後このクエリを使って最終的にはレポートを印刷したいと思っています。
そのレポートにはテーブル1.2.3のデータが必要となります。
情報不足で申し訳ありませんが宜しくお願い致します。

13

マクロ名、モジュール名、プロシージャ名を混同されているような感じなので、下記のように区別がつきやすい名前に変更しましょう。

標準モジュール モジュール名 mdlOpenForm (モジュール名は使わないのでなんでもよい)

このモジュール内に下記のようなプロシージャを作成

Public Function prcOpenForm()
    DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & Command
End Function

これでプロシージャ名は prcOpenForm になります。

注:Function プロシージャにしてくたさい。Subプロシージャはマクロからは参照できません。

・マクロは下記のように設定します。
マクロ名 mcrOpenForm
 プロシージャの実行
 プロシージャ名 prcOpenForm()

注:プロシージャ名の末尾に () が必要。

ファイルAのフォーム上のコマンドボタンのクリック時のコードは、

Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x mcrOpenForm /cmd " & Me.[部品構成ファイル対象ID]

以上でどうでしょうか。

1

現状だと下記のようなリレーションになっています。

テーブル2 多←1 テーブル11→多 テーブル3

このようなリレーションだとテーブル2とテーブル3は多対多の関係になるので、更新できないクエリになります。
また、データとしても重複が発生するので意味のないものになります。

3つのテーブルを一つの画面で更新できるようにするには、メイン/サブフォーム形式にするといいでしょう。

テーブル1 から単票フォームを作成して、そこに、
テーブル2、テーブル3からそれぞれ帳票フォームを作成してサブフォームとして埋め込みます。

12
アクセス好き 2021/09/03 (金) 09:14:16 ddfe5@73ff2

朱色様へ回答ありがとうございました。
まずファイルBのマクロを アクション:プロシージャの実行 プロシージャ名:MaOpenForm にして実行すると『指定した式に含まれる名前にはMaOpenFormが見つかりません』となるのです。これは何故でしょうか?(こうなるのでアクションをマクロの実行にしたのですが連絡しました通りのループのエラーがでてしまうのです)
モジュールですが『DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & =Command()』になりますでしょうか? コマンドの名称が理解できてなくて。マクロでエラーするので先に進めず結果がわからないのですが。
多分私の記述が間違えていると思うのですが・・・度々申し分けありません。

5

在庫管理は、言い換えれば、入出庫履歴の管理だと思います。

テーブルには、入出庫が発生するたびに、その個数を格納しておく。
ある時点での在庫数は、その時点までの入出庫数を集計すれば取得できます。

一例ですが、自分なら下記のような感じにテーブル設計にします。

製品マスター
🔑 製品コード
・ 品名
・ 
・ 

製品サイズマスター
🔑 製品サイズコード
・ 製品コード (製品マスターの外部キー)
・ サイズ
・ 
・ 

入出庫履歴
🔑 入出庫履歴ID (オートナンバー)
・ 入出庫日
・ 製品サイズコード (製品サイズマスターの外部キー)
・ 入出庫係数 (入庫=+1 出庫=-1)
・ 入出庫数

期首在庫
🔑 期首日
🔑 製品サイズコード (製品サイズマスターの外部キー)
・ 在庫数

11
朱色 2021/09/02 (木) 20:45:26 db0eb@9544d

マクロMaOpenFormの中身が「マクロMaOpenFormを呼び出す」なのであれば、
マクロMaOpenFormがマクロMaOpenFormを呼び出して、
呼び出されたマクロMaOpenFormがマクロMaOpenFormを...のループになりますね。
マクロMaOpenFormの中身を「プロシージャMaOpenFormを呼び出す」に変えましょう。

また「 DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & cmd」ですが、
「/cmd」で持ってきたコマンド値を取得するには「Command」を記載する必要があります。
Command関数はコマンド値を取得するための関数になりますので、名称の変更は出来ません。
date関数で本日の日付が取得できるような感じです。

4

リンク読みました。
初心者のため何となくしか理解できませんでしたが、FO便利そうですね。
データモデル大全という本はちょっと読んでみたくなりました。
2のパターンがやはり多いのですかね?涼子さんも2派みたいですし、私も2で検討してみようと思います。
ありがとうございました。

3

普通に考えたら1より2の方が管理しやすいですよね。
大区分でカテゴリ分けは頭になかったので検討してみます。
ありがとうございました。

12

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

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

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

2
りんご 2021/09/02 (木) 14:10:07 c564b@0e907

 ググると、こんなのがあります。便利そうです。

部品表とフィーチャ・オプション - 設計者の発言
 「仕様書によるアプリの動的制御」を実現したOSSプラットフォーム「XEAD D...
設計者の発言

 システム開発・刷新のための-データモデル大全(リンク:amazon)という本も出ています。
 基本形のモデルが載っていて、もう少しフラッシュアップされていました。モデルとインスタンス(具体例)が併記されているのを眺めて見ましたが、やっぱり便利そうです。ただ、こんな風に参照して使って下さいと踏み込んで説明されていないんですよ。モデル図を見ると、見出し・明細テーブルから便利モデルの1番下層のテーブルを外部参照してるっぽく見えるんだけど…。

1.製品テーブルに1つの製品に対して複数サイズの列を持つ

 Sサイズのフィールド、Mサイズのフィールド、Lサイズのフィールドみたいに、横に伸ばしていく場合、諸々の難易度が上がると思いますよ。絶対駄目とは言いません。逆立ちしながら、鏡を見ながらAccess操作するような感じでしょうか?

2.製品テーブル関連で各サイズの製品を持つ

 世の中、このパターンが多いらしいがどうなのでしょうか?

3.製品テーブルに1つの製品を持ち、在庫テーブルを別に持つ

 製品テーブル関連にサイズの情報を置かないけれど、在庫テーブルにはサイズ別に在庫情報を記録する、取り扱い製品が曖昧なまま在庫管理というイメージになるのかしら。このへんは、ちょっとよくわからない。
 製品テーブル関連モデルと在庫テーブル関連モデルをどう描きどう組み合わせるかと、論点が広がったような気もする。

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
1
涼子 2021/09/02 (木) 13:39:51 1a64f@e5635

参考になるかどうかわかりませんが・・・。
私も同じような在庫管理システムを作りました。
正解かどうかはわかりませんが私の場合は、2.です。
サイズごとに在庫数把握となるとサイズごとに別製品と判断した方が管理しやすいと思ったからです。
ただ、抽出や検索がしやすいように、大区分でカテゴリ分けをしました。

10

ありがとうございます。

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

よろしくお願いします。

9

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

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

おはようございます。

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

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

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

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

10
アクセス好き 2021/09/02 (木) 09:13:31 ddfe5@73ff2

朱色様へ回答ありがとうございました。毎回手間かけて申し分けありません。りんご様もコメントありがとうございました。確かに仰る通りでした。
ファイルAのフォーム上ボタンコードには連絡頂いた『Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd" & Me.[部品構成ファイル対象ID], vbNormalFocus』を記述してファイルBのモジュールには『Public Function MaOpenForm()
    DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & cmd』にしてマクロにはアクション:マクロの実行 マクロ名:MaOpenForm として実行しますとファイルBを開くときに”マクロを再帰的に呼び出せるのは最大20回までです・・・”の警告がでてしまいます。再度実行しても同様でした。何が起きているのでしょうか?

9
朱色 2021/09/01 (水) 18:13:14 db0eb@9544d

マクロからプロシージャを呼び出す場合、モジュール名ではなく関数名を指定する必要があります。
また、今回のように埋め込みマクロではない場合、標準モジュールである必要があります。
マクロ:プロシージャの実行 のヘルプ

エラーが出る場合、
・標準モジュールではない
・publicではなくprivateを指定している
・functionではなくsubを指定している
・モジュール名と関数名が同じ(モジュール「Module1」に「public function Module1() ...」と書いている)
のいずれかだと思います。

参考:マクロでプロシージャを実行させる方法

ちなみにマクロ内でCommand関数の呼び出しチャレンジしてみたのですが、私にゃムリでした。
マクロからプロシージャを呼び出すしかないですね。

あと自分の書き方が悪くてすみません、一部修正します。

Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd Me.[部品構成ファイル対象ID]"

Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd " & Me.[部品構成ファイル対象ID]
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

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

原因はなんでしょう?

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
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

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

8
りんご 2021/09/01 (水) 15:34:38 c564b@0e907

>> 7
ファイルBのマクロはどう記述したの?ファイルBのプロシージャはどう記述したの?
回答5に対する現状報告があった方が、朱色さんの手間が省けるんじゃない?と思いました。
横入り、ごめんね。

3

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

Private Sub Form_Current()
    Call 取引先コード_AfterUpdate
End Sub
7
アクセス好き 2021/09/01 (水) 14:45:21 ddfe5@73ff2

その後自分の間違いも気づき+ファイルBのマクロをプロシージャの実行でなくマクロの実行で、マクロ自体は動作できました。但しファイルAのボタンコードを 『Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd Me.[部品構成ファイル対象ID]", vbNormalFocus』にしたのですが所定のフォームは開きますが合致するレコードに移動せずに先頭レコードで開いてしまいます。フォーム開く条件をどうすれば指定のIDのページに移動出来るでしょうか? 度々申し分けありません。

2

hatena様

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

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

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