次にアドバイスいただいてOpenRecordsetのSQL文に抽出条件を加えたのですが、ここで躓いています。
氏名ID フィールドが数値型とするなら、下記のようなコードになります。
Dim strWhere As String strWhere = "日付 > #" & FirstDay & "# AND 日付 <=#" & FirstDay + 42 & "# And 氏名ID = " & Me.txt氏名ID Set rs = CurrentDb.OpenRecordset( _ "SELECT 日付,予定または実績2,氏名,お客様名,時間 FROM Q_ScheSubForm_ko WHERE " & strWhere, _ dbOpenForwardOnly, dbReadOnly)
VBAコード内に、SQL文を記述するときは、SQL文は単なる文字列になるということを留意してください。 その文字列がSQLとして正しいものになるように記述します。
コード内での、文字列と変数の扱いについては、下記に詳しく解説してますので、熟読して理解を深めてください。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
ふと見直したら上の式間違ってました。正しくは、
Format([日付],IIf([日付]>=#2019/05/01#,"令和" & IIf(Year([日付])=2019,"元",Year([日付])-2018),"ggge") & "年m月d日")
2つ目のIIF関数の条件部分をYear([日付])-2018=1から直そうとして・・・
送付していただいたファイルを上で紹介して方法に修正してみました。
修正点は、
上のリンク先のページのコードを標準モジュールにコピーする。
F_メインメニューの「ポップアップ」は「いいえ」に変更。
F_メインメニューの開く時のコードは下記に変更。
Private Sub Form_Open(Cancel As Integer) SetAccWinStyle End Sub
読み込み時の CloseWindow は削除。
以上で、いちおう動作します。
それ以外に、下記の点を修正しました。
別フォームを開く時に、メニューフォームは閉じないで、非表示にするだけにする。 →閉じたり開いたりするのは無駄。開く時のイベント(初期化処理)が何度も発生してします。
別フォームを閉じる時のイベントで、メニューフォームを再表示する。
修正ファイル
ショートカットは必須ではありません。 普通にファイルをダブルクリックで開いてもいいし、Accessのメニューから開いてもいいです。
ショートカットだとアイコンをオリジナルなものに変更できるので、Accessで作成されているとこうことを意識させないことが可能になるだけです。
早速のお返事ありがとうございます。 ちょっとハードル高いですね。。。 ショートカットを用いるとのことですが バックエンド型にしてユーザーにはデスクトップにおいて入力をしてもらうのですが この場合、そのショートカットはどのように扱えばいいのでしょうか? ユーザー各々がショートカットを作って、そこから起動するということになるのでしょうか?
APIでAccessウィンドウを最小化して、フォームをポップアップ表示しているですね。 その方法では、タスクバーのアイコンをクリックするとAccessウィンドウが表示されてしまいます。
私は下記で紹介している方法を使っています。
やっているのは、Accessウィンドウのサイズを固定してフォームを最大化表示します。 リボン非表示にすれば、Accessウィンドウとフォームが一体化して、フォームだけ表示されているようにみえます。
追記です。 フォームが開いた状態で、タスクバーのAccessアイコンを数回クリックすると 背後にウィンドウが表示されてしまいます。
テーブル設計自体が間違ってますね。見落としてました。 マスターテーフルとリンクするフィールドは、マスターテーブルの主キーでないとダメです。
B1_在庫品マスター に、社員コード がありますが、これは削除して、社員ID に変更してください。
修正したファイルをアップしておきます。
サンプルファイル
入力済みリストにある従業員コードが一桁なんですけど、従業員IDが入力されているんですか?
できる限り共通項は外に出したいなぁなどと
Format([日付],IIf([日付]>=#2019/05/01#,"令和" & IIf(Year([日付])=2018,"元",Year([日付])-2018),"ggge") & "年m月d日")
先日(2019/5/15)WindowsUpdateが入ってうちのも令和表示されるようになりました。 どうも元年対応は自前でやったほうがよさそうなので
Format([日付],"ggg" & IIf(Format([日付],"e")=1,"元","e") & "年m月d日") Format([日付],IIf(Format([日付],"e")=1,"ggg元年m月d日","ggge年m月d日"))
このくらいだと無理に分解しない(下段の)ほうが読みやすそう
修正したファイルをアップしました。
cmdNextRec_Click() プロシージャが重複して入力されてますので、 片方を削除しました。
cb従業員コード の各プロパティの設定を下記のようにしてください。
値集合ソース SELECT 従業員ID, 従業員コード FROM Z1_社員マスター; 連結列 1 列数 2 列幅 0cm;2cm
cb氏名 の各プロパティの設定を下記のようにしてください。
値集合ソース SELECT 従業員ID, 氏名 FROM Z1_社員マスター; 連結列 1 列数 2 列幅 0cm;4cm
cbJANCode の各プロパティの設定を下記のようにしてください。
コントロールソース 品名ID 値集合ソース SELECT JANコード, 品名ID, [メーカー名], 品名, 品番・規格・寸法等, 単位, 保管場所 FROM B1_在庫品マスター WHERE JANコード<>""; 連結列 2 列数 7 列幅 3.3cm;0cm;2.505cm;3.2cm;0cm;0cm;0cm リスト幅 12cm
cb自社コード の各プロパティの設定を下記のようにしてください。
コントロールソース 品名ID 値集合ソース SELECT 自社コード, 品名ID, [メーカー名], 品名, 品番・規格・寸法等, 単位, 保管場所 FROM B1_在庫品マスター; 連結列 2 列数 7 列幅 3.3cm;0cm;2.505cm;3.2cm;0cm;0cm;0cm リスト幅 12cm
コンボボックスの、値集合ソース、連列列、列数、列幅 などの意味が理解できて自由に使いこなせると、設計の自由度が広がります。 なかなか難しいので、自分の設定と比べてみたり、いろいろ変更してみて、理解を深めてください。
他にもいろいろ修正してますが、説明しだすときりがないのでこの辺にしておきます。 修正前と変更点を比べて、なぜそのようにしたのか不明な点がありましたら、質問してください。
再送しました。
送信ファイルを拝見しましたが、値集合ソースの Z1_社員マスター テーブルがないので、検証できません。
Z1_社員マスター ですが、1列目が 従業員コード、2列目が 氏名になってますか。
現状のファイルを、ファイル送信フォームから送信してもらえますか。 送信フォームのリンクは右のカラムの下のほうにあります。
cb従業員コード が1001 に対して 1 と表示されています。
txt入出庫日に日付が入るようにしたらフォームが開きました。 cb従業員コード と テキストボックス従業員コード が連動しません。
フォームを起動すると
Private Sub Form_Load() Me.従業員コード.DefaultValue = Me.cb従業員コード.Value Me.入出庫日.DefaultValue = "#" & Me.txt入出庫日.Value & "#"
Me.Filter = "従業員コード=" & Me.cb従業員コード.Value & _ " AND 入出庫日=#" & Me.txt入出庫日 & "#" Me.FilterOn = True
Me.cb従業員コード.SetFocus DoCmd.GoToRecord , , acNewRec End Sub
の Me.FilterOn = True の部分が 黄色くなってしまい フォームが表示されません。 各名称はあっているのですが・・・
サンプルファイルまで作っていただいてありがとうございます。説明不足ではありますが私の考えていたモノと同じです。唯一異なるのは 次のレコード というコマンドボタンを 追加 で考えていたぐらいです。早速、データベースに書き込んでみたいと思います。本当にありがとうございます。
「標準モジュールにSQLを作成した」のなら、 フォームの RecordSourceプロパティにそれを設定すればいいでしょう。
どのタイミングで設定したいのか不明ですが、フォームの開く時イベントでするなら、
Private Sub Form_Open(Cancel As Integer) Dim SQL As String SQL = 標準モジュールで作成したSQL Me.RecordSource = SQL End Sub
ご連絡ありがとうございます。
フォームに設定する方法は存じております。
今行っている作業は、単純ではなく、たくさんの「フォームを開く」コマンドボタンから発生するイベントが、ほとんど同じ内容なのでそれらのコードを短縮するために標準モジュールにSQLを作成したのですが、その抽出したレコードをなんとかフォームのレコードセットに入れることができないかという問題です。
もしかしたらDo~Until でフォームのオブジェクトに代入していかないといけないやつでしょうか?
フォームヘッダーのコントロール群と、 詳細セクションのコントロールの関係が不明瞭だと思います。
ですので、フォームを見て、どのように入力すればいいのか、直感的に分かりにくいと感じます。
最初、JANコードと自社コードは非連結ということだったので、それを条件としてフォームにフィルターをかけるかなと 思いましたが、そうではないのですね。
従業員コード、氏名、入庫日のグループと、JANコードと自社コードの2行のグループが分かれていますが、 これは意味かあるのでしょうか。
ヘッダーの従業員コード、氏名、入庫日は連結でしょうか。非連結でしょうかか。 詳細のデータをみると、従業員コードと入出庫日は同じなので、それでフィルターを かけているように見えます。
入力作業として、同じ入出庫日、従業員のデータをまとめて入力するという場合なら、 ヘッダーの非連結テキストボックスで、入出庫日、従業員を入力(選択)して、 それでフィルターをかけて、かつ、既定値を設定するというようにするといいでしょう。
商品と入出庫数、備考などは、フォームヘッダーで入力するのか、 詳細セクションの方で入力するのか、 どちらでしょうか。
在庫品マスターの主キーが品名IDだが、自社コードまたはJANコードで入力したいとなると、 詳細セクションの方では難しいので、 ヘッダーで、データ入力して、詳細セクションの方はその結果を一覧表示するだけという ようにすると、分かり安く、使いやすいユーザーインターフェイスになると思います。
自社コードまたはJANコードはヘッダーに入力、入出庫数は詳細セクションで入力というように、 いったりきたりするのは面倒だし、入力間違いの原因になりかねません。
同じ入出庫日、従業員のデータをまとめて入力するという要件の場合、 私ならこうのように設計するという簡単なサンプルを作成しましたので、 参考にしてください。
まずは見本の通りにやってみようと思って連結してみました。 フォームヘッダーのコントール群は JANコードと自社コードはバーコードで製品を区別する為に配置して、入出庫しようとしているモノがあっているか確認する為に 品名やメーカー名、品番等は確認する為に表示しようと考えています。 一度、B1_在庫品マスターを元にした入出庫台帳をリンクさせたフォームをつくったのですが、ダメ出しをもらって一度に10品目まで入力できるようにしてくれ。ということなのでいろいろと変更しようと思っているところです。前回までのフィールドは入力が大変なので略したモノを入力しましたが今回は略さずに構成を入力します。
テーブル B1_在庫品マスター フィールド 品名ID 大別 中別 細別 A B 品名 メーカー名 品番・規格寸法等 保管場所 自社コード JANコード 単位 発注点 発注数 商品備考 A とB に関しては将来的には削除するかもしれません。 品名IDに主キーを割り当てています。 テーブル C1_入出庫台帳 フィールド 入出庫ID 入出庫日 品名ID 入庫数量 出庫数量 入出庫備考 従業員コード になります。
、画像1
最初の質問では、フォームヘッダーの 自社コード と JANコードは非連結とのことでしたが、 フォームヘッダーのコントロール群は、何のためのものでしょうか。
フォームのレコードソースのテーブル(入出庫台帳)への入力用ですか。
入出庫台帳 のフィールド構成はどうなってますか。フィールド名を提示してもらえますか。
ご提示のコードはVBAでテーフルデータを取得したり更新したりするときのもです。 フォームでデータを操作する場合は、関係ないです。
フォームを開く時に、引数で抽出条件を設定できます。
DoCmd.OpenForm メソッド (Access) | Microsoft Docs
コード例
DoCmd.OpenForm "フォーム名", , , "抽出条件"
または、
DoCmd.OpenForm "フォーム名", , "抽出条件を設定したクエリ名"
フォームのレコードソースにはテーブル名が、抽出条件を設定していないクエリ名を設定しておきます。
コードでも名称でも入力できるコンボボックス - hatena chips を見ながら作成してますが フォームのコントロールソースを B1_在庫品マスター にして コンボボックス名を cb自社コード として、 コントロールソースを 自社コード 値集合ソースを SELECT [B1_在庫品マスター].自社コード,[B1_在庫品マスター].JANコード, FROM [B1_在庫品マスター] ORDER BY [B1_在庫品マスター].自社コード としたのですがコードすらでてきません。構文が間違っていますか?
自社コードで品名IDを試してみましたが選択した自社コードが テキストボックスcb品名IDに返されてしまいました。
ありがとうございます。コンボボックス メーカー名の設置は確かにその通りだと思います。今夜、早速やってみます。わからないことがありましたらご連絡させていただきます。
品名ID メーカー名 品名 のコンボボックスのコントロールソースに、 =JANコード と設定してあるのですね。 ということは、そこで更新はできないということですね。 コンボボックスなのに更新や選択ができないというのは、ユーザーが混乱すると思います。
下記のような設計にするといいでしょう。
JANコード と 自社コード のテキストボックスをコンボボックスに変換します。 右クリックして「コントロールの種類の変更」で簡単にできます。
JANコードのコンボボックス 名前 cbJANコード 値集合ソース SELECT * FROM B1_在庫品マスター WHERE Not JANコード Is Null ORDER BY JANコード; 列数 6 連結列 1 列幅 0cm;0cm;0cm;0cm;0cm;3cm
自社コードのコンボボックス 名前 cb自社コード 値集合ソース SELECT * FROM B1_在庫品マスター ORDER BY 自社コード; 列数 6 連結列 1 列幅 0cm;0cm;0cm;0cm;3cm;0cm
cbJANコードの更新後処理のイベントプロシージャに下記のコードを記述します。
Private Sub cbJANコード_AfterUpdate() Me.cb自社コード.Value = Me.cbJANコード.Value End Sub
cb自社コードの更新後処理のイベントプロシージャに下記のコードを記述します。
Private Sub cb自社コード_AfterUpdate() Me.cbJANコード.Value = Me.cb自社コード.Value End Sub
現状の 品名ID メーカー名 品名 のコンボボックスはすべて削除します。 テキストボックスを配置して、コントロールソースを下記のように設定します。
=[cb自社コード] & " " & [cb自社コード].Column(1) & " " & [cb自社コード].Column(2)
これで cbJANコード または cb自社コード に入力したコードに対応する 品名ID メーター名 品名 がテキストボックスに表示されます。
できるなら、メーカー名選択コンボボックスを追加して、それでメーカーを選択すると、 cbJANコード 、 cb自社コード のリストが対応するものに絞り込まれるようにすると 使いやすいものになると思います。
ありがとうございます。 紹介の コードでも名称でも入力できるコンボボックス - hatena chips を使ってコンボボックスをつくって品名IDが出てくるようにしてあります。ただコントロールソースの値を 上の段は =JANコード 下の段は =自社コード にしてあるのでもう一度見てやってみようと思います。 JANコードは未登録のれこーどがあっても大丈夫なモノなのでしょうか? そこがとっても心配で・・・。
品名ID、メーカー名、品名 がコンボボックスになっているということは、こちらかも選択できるようにということでしょうか。 また、コードとコンボボックスが上下2行になってますが、2行にする必要がありますか。 結局、選択する商品は一つなので1行で十分ではないですか。
私なら、下記で紹介している方法で、 JANコードでも、自社コードでも、品名でも、選択できるようにします。
コードでも名称でも入力できるコンボボックス - hatena chips
あと、メーカー名を選択したら、他のコンボボックスのリストをそのメーカーの商品だけに制限するという設計にします。 下記が参考になるでしょう。
Accessのマクロで2つのコンボボックスを連動させる方法 | できるネット
すみません。添付したつもりだったのですが・・・。
添付図が表示されてないので、よく分かりません。
投稿欄の下のツールバーの画像アップロードボタンをクリックして、ファイルを選択ボタン(クリップマーク)をクリックしてファイルを選択してから、アップロードボタンをクリックしてください。
hatena様
早速ありがとうございました。動作しました。 今回初投稿になり誤ってトップページに投稿してしまいました。 申し訳ありませんが削除のほうよろしくお願い致します。
また何かありましたら利用させていただきます。
下記のようなコードで可能です。
Dim ctlName As String ctlName = "コントロール名" If Not IsNull(Forms!フォーム名.Controls(ctlName)) Then
お世話になっております。 もう一度、解説を読みなおして設定したところ、うまく表示ができました。 稼働IDをクリックすると該当のメインフォームに移り、修正できる仕組みのところを ハイパーリンクにして選択しやすいようにもしてみました。
ファイルを更新いたしますので、ご確認いただけますでしょうか。 パスワードは付けていません。
このあとは、インターフェイスまわりを整備してみようと思います。
早速の返信ありがとうございます。書式設定が前者だったので上記をもとにできました。 いつもありがとうございます本当に助かりました。
お世話になります。 ご提案のように設定をしてみましたが、エラーと表示されてしまいます。 ファイルを更新しますのでご確認いただけますでしょうか。
demo_6.zip
パスワードは
ah10020616
です。
よろしくお願いします。
メインフォームのデザインビューでサブフォームを埋め込んでいるコントロールを選択して、プロパティに表示される名前です。下記を参照してください。
サブフォームとサブフォームコントロールの違いとは? - hatena chips
サブフォームコントロール名とは どのような記述になりますでしょうか。
申しわけありません。 zipファイルのパスワードは
persol
今一度ご確認いただけますでしょうか。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
氏名ID フィールドが数値型とするなら、下記のようなコードになります。
VBAコード内に、SQL文を記述するときは、SQL文は単なる文字列になるということを留意してください。
その文字列がSQLとして正しいものになるように記述します。
コード内での、文字列と変数の扱いについては、下記に詳しく解説してますので、熟読して理解を深めてください。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
ふと見直したら上の式間違ってました。正しくは、
2つ目のIIF関数の条件部分をYear([日付])-2018=1から直そうとして・・・
送付していただいたファイルを上で紹介して方法に修正してみました。
修正点は、
上のリンク先のページのコードを標準モジュールにコピーする。
F_メインメニューの「ポップアップ」は「いいえ」に変更。
F_メインメニューの開く時のコードは下記に変更。
Private Sub Form_Open(Cancel As Integer)
SetAccWinStyle
End Sub
読み込み時の CloseWindow は削除。
以上で、いちおう動作します。
それ以外に、下記の点を修正しました。
別フォームを開く時に、メニューフォームは閉じないで、非表示にするだけにする。
→閉じたり開いたりするのは無駄。開く時のイベント(初期化処理)が何度も発生してします。
別フォームを閉じる時のイベントで、メニューフォームを再表示する。
修正ファイル
ショートカットは必須ではありません。
普通にファイルをダブルクリックで開いてもいいし、Accessのメニューから開いてもいいです。
ショートカットだとアイコンをオリジナルなものに変更できるので、Accessで作成されているとこうことを意識させないことが可能になるだけです。
早速のお返事ありがとうございます。
ちょっとハードル高いですね。。。
ショートカットを用いるとのことですが
バックエンド型にしてユーザーにはデスクトップにおいて入力をしてもらうのですが
この場合、そのショートカットはどのように扱えばいいのでしょうか?
ユーザー各々がショートカットを作って、そこから起動するということになるのでしょうか?
APIでAccessウィンドウを最小化して、フォームをポップアップ表示しているですね。
その方法では、タスクバーのアイコンをクリックするとAccessウィンドウが表示されてしまいます。
私は下記で紹介している方法を使っています。
やっているのは、Accessウィンドウのサイズを固定してフォームを最大化表示します。
リボン非表示にすれば、Accessウィンドウとフォームが一体化して、フォームだけ表示されているようにみえます。
追記です。
フォームが開いた状態で、タスクバーのAccessアイコンを数回クリックすると
背後にウィンドウが表示されてしまいます。
テーブル設計自体が間違ってますね。見落としてました。
マスターテーフルとリンクするフィールドは、マスターテーブルの主キーでないとダメです。
B1_在庫品マスター に、社員コード がありますが、これは削除して、社員ID に変更してください。
修正したファイルをアップしておきます。
サンプルファイル
入力済みリストにある従業員コードが一桁なんですけど、従業員IDが入力されているんですか?
できる限り共通項は外に出したいなぁなどと
先日(2019/5/15)WindowsUpdateが入ってうちのも令和表示されるようになりました。
どうも元年対応は自前でやったほうがよさそうなので
このくらいだと無理に分解しない(下段の)ほうが読みやすそう
修正したファイルをアップしました。
サンプルファイル
修正点
cmdNextRec_Click() プロシージャが重複して入力されてますので、
片方を削除しました。
cb従業員コード の各プロパティの設定を下記のようにしてください。
値集合ソース SELECT 従業員ID, 従業員コード FROM Z1_社員マスター;
連結列 1
列数 2
列幅 0cm;2cm
cb氏名 の各プロパティの設定を下記のようにしてください。
値集合ソース SELECT 従業員ID, 氏名 FROM Z1_社員マスター;
連結列 1
列数 2
列幅 0cm;4cm
cbJANCode の各プロパティの設定を下記のようにしてください。
コントロールソース 品名ID
値集合ソース SELECT JANコード, 品名ID, [メーカー名], 品名, 品番・規格・寸法等, 単位, 保管場所 FROM B1_在庫品マスター WHERE JANコード<>"";
連結列 2
列数 7
列幅 3.3cm;0cm;2.505cm;3.2cm;0cm;0cm;0cm
リスト幅 12cm
cb自社コード の各プロパティの設定を下記のようにしてください。
コントロールソース 品名ID
値集合ソース SELECT 自社コード, 品名ID, [メーカー名], 品名, 品番・規格・寸法等, 単位, 保管場所 FROM B1_在庫品マスター;
連結列 2
列数 7
列幅 3.3cm;0cm;2.505cm;3.2cm;0cm;0cm;0cm
リスト幅 12cm
コンボボックスの、値集合ソース、連列列、列数、列幅 などの意味が理解できて自由に使いこなせると、設計の自由度が広がります。
なかなか難しいので、自分の設定と比べてみたり、いろいろ変更してみて、理解を深めてください。
他にもいろいろ修正してますが、説明しだすときりがないのでこの辺にしておきます。
修正前と変更点を比べて、なぜそのようにしたのか不明な点がありましたら、質問してください。
再送しました。
送信ファイルを拝見しましたが、値集合ソースの Z1_社員マスター テーブルがないので、検証できません。
Z1_社員マスター ですが、1列目が 従業員コード、2列目が 氏名になってますか。
現状のファイルを、ファイル送信フォームから送信してもらえますか。
送信フォームのリンクは右のカラムの下のほうにあります。
cb従業員コード が1001 に対して 1 と表示されています。
txt入出庫日に日付が入るようにしたらフォームが開きました。
cb従業員コード と テキストボックス従業員コード が連動しません。
フォームを起動すると
Private Sub Form_Load()
Me.従業員コード.DefaultValue = Me.cb従業員コード.Value
Me.入出庫日.DefaultValue = "#" & Me.txt入出庫日.Value & "#"
Me.Filter = "従業員コード=" & Me.cb従業員コード.Value & _
" AND 入出庫日=#" & Me.txt入出庫日 & "#"
Me.FilterOn = True
Me.cb従業員コード.SetFocus
DoCmd.GoToRecord , , acNewRec
End Sub
の Me.FilterOn = True の部分が 黄色くなってしまい フォームが表示されません。
各名称はあっているのですが・・・
サンプルファイルまで作っていただいてありがとうございます。説明不足ではありますが私の考えていたモノと同じです。唯一異なるのは 次のレコード というコマンドボタンを 追加 で考えていたぐらいです。早速、データベースに書き込んでみたいと思います。本当にありがとうございます。
「標準モジュールにSQLを作成した」のなら、
フォームの RecordSourceプロパティにそれを設定すればいいでしょう。
どのタイミングで設定したいのか不明ですが、フォームの開く時イベントでするなら、
ご連絡ありがとうございます。
フォームに設定する方法は存じております。
今行っている作業は、単純ではなく、たくさんの「フォームを開く」コマンドボタンから発生するイベントが、ほとんど同じ内容なのでそれらのコードを短縮するために標準モジュールにSQLを作成したのですが、その抽出したレコードをなんとかフォームのレコードセットに入れることができないかという問題です。
もしかしたらDo~Until でフォームのオブジェクトに代入していかないといけないやつでしょうか?
フォームヘッダーのコントロール群と、
詳細セクションのコントロールの関係が不明瞭だと思います。
ですので、フォームを見て、どのように入力すればいいのか、直感的に分かりにくいと感じます。
最初、JANコードと自社コードは非連結ということだったので、それを条件としてフォームにフィルターをかけるかなと
思いましたが、そうではないのですね。
従業員コード、氏名、入庫日のグループと、JANコードと自社コードの2行のグループが分かれていますが、
これは意味かあるのでしょうか。
ヘッダーの従業員コード、氏名、入庫日は連結でしょうか。非連結でしょうかか。
詳細のデータをみると、従業員コードと入出庫日は同じなので、それでフィルターを
かけているように見えます。
入力作業として、同じ入出庫日、従業員のデータをまとめて入力するという場合なら、
ヘッダーの非連結テキストボックスで、入出庫日、従業員を入力(選択)して、
それでフィルターをかけて、かつ、既定値を設定するというようにするといいでしょう。
商品と入出庫数、備考などは、フォームヘッダーで入力するのか、
詳細セクションの方で入力するのか、
どちらでしょうか。
在庫品マスターの主キーが品名IDだが、自社コードまたはJANコードで入力したいとなると、
詳細セクションの方では難しいので、
ヘッダーで、データ入力して、詳細セクションの方はその結果を一覧表示するだけという
ようにすると、分かり安く、使いやすいユーザーインターフェイスになると思います。
自社コードまたはJANコードはヘッダーに入力、入出庫数は詳細セクションで入力というように、
いったりきたりするのは面倒だし、入力間違いの原因になりかねません。
同じ入出庫日、従業員のデータをまとめて入力するという要件の場合、
私ならこうのように設計するという簡単なサンプルを作成しましたので、
参考にしてください。
サンプルファイル
まずは見本の通りにやってみようと思って連結してみました。
フォームヘッダーのコントール群は
JANコードと自社コードはバーコードで製品を区別する為に配置して、入出庫しようとしているモノがあっているか確認する為に 品名やメーカー名、品番等は確認する為に表示しようと考えています。
一度、B1_在庫品マスターを元にした入出庫台帳をリンクさせたフォームをつくったのですが、ダメ出しをもらって一度に10品目まで入力できるようにしてくれ。ということなのでいろいろと変更しようと思っているところです。前回までのフィールドは入力が大変なので略したモノを入力しましたが今回は略さずに構成を入力します。
テーブル B1_在庫品マスター

フィールド 品名ID 大別 中別 細別 A B 品名 メーカー名 品番・規格寸法等 保管場所 自社コード JANコード 単位 発注点 発注数 商品備考
A とB に関しては将来的には削除するかもしれません。 品名IDに主キーを割り当てています。
テーブル C1_入出庫台帳
フィールド 入出庫ID 入出庫日 品名ID 入庫数量 出庫数量 入出庫備考 従業員コード になります。
、画像1
最初の質問では、フォームヘッダーの 自社コード と JANコードは非連結とのことでしたが、
フォームヘッダーのコントロール群は、何のためのものでしょうか。
フォームのレコードソースのテーブル(入出庫台帳)への入力用ですか。
入出庫台帳 のフィールド構成はどうなってますか。フィールド名を提示してもらえますか。
ご提示のコードはVBAでテーフルデータを取得したり更新したりするときのもです。
フォームでデータを操作する場合は、関係ないです。
フォームを開く時に、引数で抽出条件を設定できます。
DoCmd.OpenForm メソッド (Access) | Microsoft Docs
コード例
DoCmd.OpenForm "フォーム名", , , "抽出条件"
または、
DoCmd.OpenForm "フォーム名", , "抽出条件を設定したクエリ名"
フォームのレコードソースにはテーブル名が、抽出条件を設定していないクエリ名を設定しておきます。
コードでも名称でも入力できるコンボボックス - hatena chips を見ながら作成してますが
フォームのコントロールソースを B1_在庫品マスター にして
コンボボックス名を cb自社コード として、
コントロールソースを 自社コード
値集合ソースを SELECT [B1_在庫品マスター].自社コード,[B1_在庫品マスター].JANコード, FROM [B1_在庫品マスター] ORDER BY [B1_在庫品マスター].自社コード
としたのですがコードすらでてきません。構文が間違っていますか?
自社コードで品名IDを試してみましたが選択した自社コードが テキストボックスcb品名IDに返されてしまいました。
ありがとうございます。コンボボックス メーカー名の設置は確かにその通りだと思います。今夜、早速やってみます。わからないことがありましたらご連絡させていただきます。
品名ID メーカー名 品名 のコンボボックスのコントロールソースに、
=JANコード
と設定してあるのですね。
ということは、そこで更新はできないということですね。
コンボボックスなのに更新や選択ができないというのは、ユーザーが混乱すると思います。
下記のような設計にするといいでしょう。
JANコード と 自社コード のテキストボックスをコンボボックスに変換します。
右クリックして「コントロールの種類の変更」で簡単にできます。
JANコードのコンボボックス
名前 cbJANコード
値集合ソース SELECT * FROM B1_在庫品マスター WHERE Not JANコード Is Null ORDER BY JANコード;
列数 6
連結列 1
列幅 0cm;0cm;0cm;0cm;0cm;3cm
自社コードのコンボボックス
名前 cb自社コード
値集合ソース SELECT * FROM B1_在庫品マスター ORDER BY 自社コード;
列数 6
連結列 1
列幅 0cm;0cm;0cm;0cm;3cm;0cm
cbJANコードの更新後処理のイベントプロシージャに下記のコードを記述します。
cb自社コードの更新後処理のイベントプロシージャに下記のコードを記述します。
現状の 品名ID メーカー名 品名 のコンボボックスはすべて削除します。
テキストボックスを配置して、コントロールソースを下記のように設定します。
=[cb自社コード] & " " & [cb自社コード].Column(1) & " " & [cb自社コード].Column(2)
これで cbJANコード または cb自社コード に入力したコードに対応する
品名ID メーター名 品名 がテキストボックスに表示されます。
できるなら、メーカー名選択コンボボックスを追加して、それでメーカーを選択すると、
cbJANコード 、 cb自社コード のリストが対応するものに絞り込まれるようにすると
使いやすいものになると思います。
ありがとうございます。
紹介の コードでも名称でも入力できるコンボボックス - hatena chips
を使ってコンボボックスをつくって品名IDが出てくるようにしてあります。ただコントロールソースの値を
上の段は =JANコード
下の段は =自社コード
にしてあるのでもう一度見てやってみようと思います。
JANコードは未登録のれこーどがあっても大丈夫なモノなのでしょうか?
そこがとっても心配で・・・。
品名ID、メーカー名、品名 がコンボボックスになっているということは、こちらかも選択できるようにということでしょうか。
また、コードとコンボボックスが上下2行になってますが、2行にする必要がありますか。
結局、選択する商品は一つなので1行で十分ではないですか。
私なら、下記で紹介している方法で、
JANコードでも、自社コードでも、品名でも、選択できるようにします。
コードでも名称でも入力できるコンボボックス - hatena chips
あと、メーカー名を選択したら、他のコンボボックスのリストをそのメーカーの商品だけに制限するという設計にします。
下記が参考になるでしょう。
Accessのマクロで2つのコンボボックスを連動させる方法 | できるネット
すみません。添付したつもりだったのですが・・・。
添付図が表示されてないので、よく分かりません。
投稿欄の下のツールバーの画像アップロードボタンをクリックして、ファイルを選択ボタン(クリップマーク)をクリックしてファイルを選択してから、アップロードボタンをクリックしてください。
hatena様
早速ありがとうございました。動作しました。
今回初投稿になり誤ってトップページに投稿してしまいました。
申し訳ありませんが削除のほうよろしくお願い致します。
また何かありましたら利用させていただきます。
下記のようなコードで可能です。
お世話になっております。
もう一度、解説を読みなおして設定したところ、うまく表示ができました。
稼働IDをクリックすると該当のメインフォームに移り、修正できる仕組みのところを
ハイパーリンクにして選択しやすいようにもしてみました。
ファイルを更新いたしますので、ご確認いただけますでしょうか。
パスワードは付けていません。
このあとは、インターフェイスまわりを整備してみようと思います。
早速の返信ありがとうございます。書式設定が前者だったので上記をもとにできました。
いつもありがとうございます本当に助かりました。
お世話になります。
ご提案のように設定をしてみましたが、エラーと表示されてしまいます。
ファイルを更新しますのでご確認いただけますでしょうか。
demo_6.zip
パスワードは
ah10020616
です。
よろしくお願いします。
メインフォームのデザインビューでサブフォームを埋め込んでいるコントロールを選択して、プロパティに表示される名前です。下記を参照してください。
サブフォームとサブフォームコントロールの違いとは? - hatena chips
サブフォームコントロール名とは どのような記述になりますでしょうか。
申しわけありません。
zipファイルのパスワードは
persol
です。
今一度ご確認いただけますでしょうか。