Public Sub 取引先コード_AfterUpdate()
Msgbox Me.取引先コード.Value
If Me.取引先コード.Value = 1 Then
Msgbox “取引先コードは、1です。”
Else
Msgbox “取引先コードは、1ではありません。”
End If
End Sub
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
' イケてない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
Private Sub ほにゃらら()
Msgbox Me.取引先コード.Value
If Nz(Me.取引先コード.Value) = "" Then
Me.受注明細.Enabled = False
Msgbox “あああ”
Else
Me.受注明細.Enabled = True
Msgbox “いいい”
End If
End Sub
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
解決、おめでとうございます。
>> 7
リストボックスは、難しいけれど、便利なので、練習しておくといいですよ。
連結列、コントロールソースの有無、列数、列幅、コード。
抽出条件やコードやキークリック時イベントは、初めてのときは、難しいかもしれません。
[Forms]![フォームの名前]![テキストボックスの名前]
Me.リストボックス1.Column(1)
DoCmd.OpenQueryからのMe.リストボックス1.Requery
Msgbox KeyCodeからのKeyCode 32(スペースキー)
知ってるよ、と問題なければ、やってることは、基本作業の積み上げです。
元のテーブルを作ったら何も考えずにクエリ化、リストボックスに表示。
絞り込めたら便利なので、テキストボックスを置いて🔑抽出条件
選択クエリを作って絞り込み追加クエリに変更、仮テーブルに追加して別のリストボックスに表示。
選択クエリを作って元テーブルと仮テーブルに線を引いて、更新クエリに変更、更新値に従って更新
最後に、単独主キーや複合主キーの設定は抜けていないと確認とれましたか?単独主キー、複合主キーがなければ、破綻しているので全部水の泡です。
クエリに式を作る方法で一つのレコードだけにチェックすることができました。
その発想はなかったのでありがとうございました。
アドバイスありがとうございます。
>> 6
出来たとしてもごちゃごちゃなりそうなのでイマイチですね。
大変失礼いたしました・・・。
再送しました。
宜しくお願いします。
アドバイスありがとうございます。
試してみます。
すみません。この方法は私には難しそうです....。
アドバイスありがとうございます
今回、搬入完と検査完の二つを例にしてあげましたが、他にももっとあります。一部搬入完や一部検査完、不適合など全部で6つぐらいあります。それでも同じようにできますか?
進捗報告みたいなプラットフォームなので複雑なんでしょうか。
ファイルを見ましたが、
「T_受注」と「T_受注明細」がリンクテーブルの為、フォームを開くことができません。
ローカルテーブルに変更したものを、再度、送付してもらえませんか。
最悪Excelのデータをリンクテーブルで読み込んでいるとかだと主キーがないこともあるんですかね
レコードソースをクエリにして
主キーのようなもの: [初期ID] & "_" & [データKEY]フィールドを作って単一のフィールドでチェックできるようにしたらどうでしょうhatena様
ありがとうございます。
ではファイルを送ります。
どうか宜しくお願い致します。
クロス集計クエリというものがあります。
フォームを作成してテキストボックスを配置すると規定値プロパティが使えるので、VBAでこれを制御するのが分かりやすいと思います
キー入力時というイベントがあるので、これで任意のキー入力に対して特定のコントロールをアクティブにすることができます。
また、オプションに「Enterキー入力後の動作」があるので、これを変更するとExcelと似たような動作になります。
このオプションはパソコン(インストールされたACCESS)毎の設定をデフォルトから変えることになるので、環境ごとに設定が必要です。
リンゴ様
「取引先コード」に入力後、ほかの部分をクリックしても同様です・・・。
色々お力添え頂きありがとうございます。
ところで、これはお遊びですが
テーブル1『実テーブル』(実データ)🔑初期ID,🔑データKEY,属性,区分
テーブル2『仮テーブル』(基本空っぽ)🔑初期ID,🔑データKEY,属性,区分
クエリ1『実クエリ』(テーブル1の選択クエリ)
クエリ2『仮クエリ』(テーブル2の選択クエリ)
追加クエリ『実リストから仮テーブルへ』(テーブル1の追加クエリ)※実リストはそのまま。
抽出条件:テキストボックス1、テキストボックス2
削除クエリ『仮リストから削除』(テーブル2の削除クエリ)※実リストはそのまま。
抽出条件:テキストボックス3、テキストボックス4
更新クエリ『実テーブルと仮テーブルを内部結合』(テーブル1の更新クエリ)
抽出条件:なし,レコードの更新:テキストボックス5
テキストボックス1『初期ID、実リストから追加クエリへ』 (非連結):⬜⬜⬜
テキストボックス2『データKEY、実リストから追加クエリへ』(非連結):⬜⬜⬜
テキストボックス3『初期ID、仮リストから削除クエリへ』 (非連結):⬜⬜⬜
テキストボックス4『データKEY、仮リストから削除クエリへ』(非連結):⬜⬜⬜
コマンドボタン1『更新ボタン』テキストボックス5『新しい更新値』(非連結):⬜⬜⬜
リストボックス1『実リスト』(非連結) リストボックス2『仮リスト』(非連結)
値集合ソース:クエリ1 値集合ソース:クエリ2
例えば、行を選んで半角スペースキーを押すと、選択行の初期IDとデータKEYがテキストボックスに代入、追加クエリが実行されるように。実データが絞り込まれて、仮テーブルに追加されるので、仮リストの再クエリ。
更新クエリを実行すると、新しい区分値に更新。但し初期IDとデータKEYの組み合わせが同じものに限る。
単独主キーですがこんなのもあるみたいですよ。複合主キーに応用する事ができれば。

複数選択リストボックスで選択したレコードの印刷 - hatena chips
ちなみに、これはどうですか?
コマンドボタン『ほにゃらら』を押すと、区分が未定のときは検査完、検査完のときは未定になるように。
コメントありがとうございます。そうです。
”レコードを複数選択し、該当フィールドをまとめて更新したい”です。
1レコードずつ更新する仕組みで作られているのですが、利用者からめんどくさいからまとめて更新ができないかという相談があって改修しているのですが、1レコードずつ更新する仕組みも残したまままとめて更新できるように
別に非連結チェックボックスで選択して更新できるような仕組みを作っていたんです。
チェックする仕組みは参考URLで、できたのですが、データ初期IDが同じものだと一緒にチェックされてしまうのをなんとかすれば他はうまくいきそうなんです。
外部からは判断の難しい状況になっているようですね。
実際のファイルを見ないと原因究明は難しいかもしれません。
この掲示板の右カラムの一番下に「ファイル送信フォーム」があります。
そこからファイルを送信することができますので、
うまくいかない現状のファイルを送ってもらえたら、
原因がわかるかもしれません。
フォームは連結フォームでしょうか。非連結フォームでしょうか。
連結フォームなら、コマンドボタンのコントロールウィザードでレコード削除のマクロを作成すれば、
カレントレコードを削除できるはずです。
それでうまくいかないのなら、
フォームの構成、レコードソースのテーブル構成等、詳細な説明をしてください。
解決済みとのことですが、レポートの場合は、サブレポートとして埋め込むことになります。
マクロにも影響するかわからないけれど、エラーメッセージの表示設定はありになっていますか?

アクション クエリのメッセージを非表示にするには - Access - ヘルプの森
「取引先コード」にデータを入力して、更新後処理発生(取引先コード以外をクリック等)しても、全く何もメッセージが出てきませんか?
やっぱり何もメッセージが出なければ、ごめんなさい、此方の力及ばずでした。
新しく作った方のフォームで試しました。
お教えいただいたコードを「取引先コード」の更新後処理に書いてみました。
「取引先コード」にデータを入力しても全く何もメッセージが出てきません。
この状態でフォームの移動時のコードはそのままの時は「受注明細」には入力できません。
どうしてなのでしょう・・・。
取引先コードを入力して更新後処理イベントを発生させるけれど、Msgbox、例えば、「Msgbox"更新後、使用可能になりました"」と「Msgbox"更新後、使用不可能になりました"」のどちらも出てこない。
もしそうであるならば、更新後イベントのコードが期待通りに動いていないように見えるので、条件式等を簡略化して、If構文を制御出来るように試行錯誤するのですが。
返信の際は、『Msgbox Me.取引先コード.Valueのメッセージ』も教えて下さい。
フォームを削除して新しく作り直して同じコードを書いてみましたがやはり同じ動作となってしまいます。
何が原因なんでしょう??
取引先コードのプロパティーの更新後処理は「イベントプロシージャ」になってます・・・。
フォームを開き、デザインビューに切り替え、取引先コードを右クリック、プロパティをクリック。プロパティシートが表示されたら、イベントタブの更新後処理が空欄のままになっていないか見てください。
もしも、空欄のままでしたら、[イベントプロシージャ]とする。(ビルダーの選択:コードビルダー)
どうなりましたか?
リンゴ様
ご回答ありがとうございます。
フォームのレコード移動時の部分の「Msgbox"あああ"」のみフォームを開いた時に現れます。
「取引先コード」に入力しても「Msgbox"いいい"」は現れません。
「取引先コード」の更新後処理の部分に入れた「Msgbox"あああ"」と「Msgbox"いいい"」はフォームのレコード移動時に入れたMsgboxを削除しても現れません。
また、元テーブルのデータを全て削除しましたが変わりがありません。
新たに作り直すしかないでしょうか?
おや。
MSOLEDBSQL プロバイダは ODBC ではなく、OLEDB ドライバーではなかったでしょうか。
Microsoft OLE DB Driver for SQL Server
あと、念の為に申し上げておきますと
ODBCドライバが関係するのは、「 リンクテーブル 」です。
ADO で SQLServer に接続しているコードにおいては
OLEDB接続のため、ODBCドライバは関係ありません。
私はクロさんと見解が少し異なります。
ADO は【 SQLServerに接続し、操作するミドルウェア 】という点においては
確かに DAO より優位であると考えています。
ですが、Access フォームに SQLServer のデータをバインドする
という状況下では、利用しないでしょう。
ADO を利用しない理由としては、Access のフォーム
つまり Me.Recordset が DAO そのものであるから、です。
( Me.Recordset が ADO でいられるのは、現在は利用できない ADP だけですね )
なので、Set Me.Recordset = rs というコードは
ADO.Recordset が DAO.Recordset に暗黙変換されて
Access のフォームにバインドされます。
動作原理はリンクテーブルと似たりよったりでしょう。
したがって、パフォーマンスをお求めの場合はリンクテーブルではなく
パススルークエリをフォームのレコードソースに指定することをお薦めします。
以下のようにコードを変更して原因を探ってみてはいかがでしょう。
ODBCドライバーをインストールしたけれど、ADO接続が上手く出来ない、という事ですが、もしかしてOLEDBドライバーも要るのかも?正直、サーバー接続までやったことがないので、間違えならごめん。

Access を SQL Server に接続する - Microsoft Support
すみません、私の勘違いがありましたので、訂正と報告です。
これはリンクテーブルではなく、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への移行はすぐに絶対対応しないといけないと言うわけでもないため、引き続き
良い解法が無いか探しています。
引き続き良いアイデアがあればアドバイスいただけますと幸いです。
以下、試行中のイケた接続とイケてない接続方法です。
おかしくなったので、コードを消したら、『フォームを閉じて、再度、開く』までやってみる。
元に戻らないなら、例えば、わかりやすいように、Msgboxをコードに入れてみる。
ダメなら、テーブルのコピーを別に残して、元データを全部削除してみるとかやってみるのはどうですか?
【問題発生】
恐れ入ります・・・・
なぜか突然動作不良になってしまいました・・・。
「取引先コード」の更新後処理とフォームのレコード移動時両方に以下のコードがある状態で、「受注明細」が入力できない状態になります。
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
フォームのレコード移動時のコードのみを消した場合、常に「受注明細」に入力できます。
「取引先コード」の更新後処理のコードを消しても「受注明細」には入力が出来ない状態です。
変わった事と言えば、その後、このフォームにコマンドボタンを一つ作りコードを書きましたが、原因追及のためボタンもコードも削除しました。
その他は触ってないはずなのですが、急に動作しなくなってしまいました。
他に何か考えられる原因はあるでしょうか?
どうぞよろしくお願いいたします・・・。
hatena様
回答ありがとうございました。全てアドバイス通りにしましたら問題なく実行できました。解決しました! 私が記述ルールを理解してなかったのと名前がごっちゃになっていたのですね。色々してたら混乱してしまって・・・本当にありがとうございました。すっきりしました。
朱色様へ
私の説明不足(分かりにくい表現等)の中、何度も回答頂きありがとうございました。大変お手数かけました。大変勉強になりました。本当に感謝です。
ACCESSはなんて便利だろうと思って使っているのですが、奥が深いですね・・・
なるほど
サイズコードを軸に組み立てれば管理できそうですね。
テーブル設計例まで考えていただきありがとうございます。
期首日を利用しての管理方法は考えていなかったので、盛り込んで検討してみます。
連投申し訳ありません。
レポートの件ですが作成しなくてもよくなったので取消いたします。
テーブル1のフォームにテーブル2.3のサブフォームを埋め込むというアドバイスを頂き誠にありがとうございました。
こちらで引き続き作成していきたいと思います。
こちらのスレは解決とさせていただきます。
ありがとうございました。
hatena様
回答いただきありがとうございます。
このクエリをもとにレポートを出したいのですがレポートも同じようにサブフォームを埋め込めばよいのでしょうか?
フォームで情報を編集した後このクエリを使って最終的にはレポートを印刷したいと思っています。
そのレポートにはテーブル1.2.3のデータが必要となります。
情報不足で申し訳ありませんが宜しくお願い致します。
マクロ名、モジュール名、プロシージャ名を混同されているような感じなので、下記のように区別がつきやすい名前に変更しましょう。
標準モジュール モジュール名 mdlOpenForm (モジュール名は使わないのでなんでもよい)
このモジュール内に下記のようなプロシージャを作成
これでプロシージャ名は prcOpenForm になります。
注:Function プロシージャにしてくたさい。Subプロシージャはマクロからは参照できません。
・マクロは下記のように設定します。
マクロ名 mcrOpenForm
プロシージャの実行
プロシージャ名 prcOpenForm()
注:プロシージャ名の末尾に () が必要。
ファイルAのフォーム上のコマンドボタンのクリック時のコードは、
以上でどうでしょうか。
現状だと下記のようなリレーションになっています。
テーブル2 多←1 テーブル11→多 テーブル3
このようなリレーションだとテーブル2とテーブル3は多対多の関係になるので、更新できないクエリになります。
また、データとしても重複が発生するので意味のないものになります。
3つのテーブルを一つの画面で更新できるようにするには、メイン/サブフォーム形式にするといいでしょう。
テーブル1 から単票フォームを作成して、そこに、
テーブル2、テーブル3からそれぞれ帳票フォームを作成してサブフォームとして埋め込みます。
朱色様へ回答ありがとうございました。
まずファイルBのマクロを アクション:プロシージャの実行 プロシージャ名:MaOpenForm にして実行すると『指定した式に含まれる名前にはMaOpenFormが見つかりません』となるのです。これは何故でしょうか?(こうなるのでアクションをマクロの実行にしたのですが連絡しました通りのループのエラーがでてしまうのです)
モジュールですが『DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & =Command()』になりますでしょうか? コマンドの名称が理解できてなくて。マクロでエラーするので先に進めず結果がわからないのですが。
多分私の記述が間違えていると思うのですが・・・度々申し分けありません。