Private Sub JANコードで検索する_Click()
Forms![F_1 在庫品マスター 入庫の登録画面].SetFocus
Forms![F_1 在庫品マスター 入庫の登録画面]!JANコード.SetFocus
DoCmd.FindRecord Me.JANコード検索, acEntire
If Me.JANコード検索 = Forms![F_1 在庫品マスター 入庫の登録画面]!JANコード Then
Docmd.Close acForm, Me.Name
Else
MsgBox "未登録のコードを入力しました。もう一度入力コードを確認してください。"
Me.SetFocus
Me.JANコード検索.SetFocus
End If
End Sub
Public Function 許可日(申請日 As Variant) As Variant
Dim 営業日 As Long
許可日 = 申請日
If IsNull(許可日) Then Exit Function
Do
許可日 = 許可日 + 1
Select Case Weekday(許可日)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
営業日 = 営業日 + 1
End If
End Select
Loop Until 営業日 = 2
End Function
ご連絡ありがとうございます。
フォームに設定する方法は存じております。
今行っている作業は、単純ではなく、たくさんの「フォームを開く」コマンドボタンから発生するイベントが、ほとんど同じ内容なのでそれらのコードを短縮するために標準モジュールに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
です。
今一度ご確認いただけますでしょうか。
受け取った完成前_5.zipですが、パスワードかかっていて解凍できませんでした。
サブフォームのフォームヘッダーかフッターにテキストボックスを配置して、
名前 稼働時間計
コントロールソース =SUM([稼働時間])
と設定します。
メインフォームにテキストボックスを配置して、コントロールソースを下記のように設定します。
=[サブフォームコントロール名].[Form]![稼動時間計]
見積書送付NO フィールドはオートナンバー型なのですね。
それが、 N00001 あるいは P00001 と表示されているということは、書式設定で、
¥N0000 あるいは、¥00001 と設定しているはずです。
これは表示上だけで、実際の値は数値だけです。
ユニオンクエリでは、テーブルの書式設定は引き継がれないので、数値表示になります。
Format関数で書式設定してください。
おはようございます。いつもお世話になっております。新たな問題に直面しまた戻ってきました。
上記のSQLだと見積書送付NOが全部1.2.3・・・となってしまうので以前のとはSQLが少し違います。
見積書送付NOはアルファベット1文字と5ケタの数字(T_mitu → N00001・ T_mitumori → P00001)なのですが下記のとおりやるとT_mitumoriのアルファベットのPがNになってしまいます。オートナンバー型がダメなのでしょうか。
ご教授をお願いします。
SELECT T_mitu.見積書送付NO, T_mitu.[ファイル名], T_mitu.見積日付, 宛先マスタ.会社名, 宛先マスタ.氏名, 現場.現場名, T_mitu.工事名, T_mitu.金額, T_mitu.NET金額
FROM 現場 INNER JOIN (宛先マスタ INNER JOIN T_mitu ON 宛先マスタ.宛先ID = T_mitu.宛先ID) ON (現場.現場ID = T_mitu.現場ID) AND (宛先マスタ.宛先ID = 現場.宛先ID)
UNION ALL
SELECT T_mitumori.見積書送付NO, T_mitumori.[ファイル名], T_mitumori.見積日付, T_mitumori.会社名, T_mitumori.氏名, T_mitumori.現場名, T_mitumori.工事名, T_mitumori.金額, T_mitumori.NET金額
FROM T_mitumori;
検索(FindRecord )した結果、JANコード と JANコード検索 が一致していなかったら、該当の JANコード が見つからなかったということなりますので、それを利用すればいいでしょう。
テーブル B_1 在庫品マスター JANコード に登録されていないコード(削除されてしまった)や 未登録の時 に
未登録のコードを入力しました。もう一度入力コードを確認してください。
と、エラーメッセージを出したいのですが・・・。どのように付け加えたら良いのでしょうか?
申し訳ありません。
私の認識不足でした。
社員IDをダブルクリックすると、あらたに単票フォームが立ち上がると勘違いしていました。
メインフォームのデータが変わるのでそこで編集するということですね。
理解しました。
現状までのファイルを更新します。
完成前_5_zip です。
あと1点やりたいことがあります。
メインフォーム上でも、サブフォーム上でもよいのですが
詳細の稼働時間と件数の合計を表示させたいと思っています。
=SUM([稼働時間]) という数式をどこかに入れるというような認識なのですが
どこにどう入れたらいいか分かりかねています。
この点ご教授いただけたらと思います。
よろしくお願いします。
ファイルを更新します。
完成前_5.zip です。
よろしくお願いいたします
ご返事ありがとうございます。
早速以下を実施しました。
ご提案のように フィールドを追加しました。
フィールド名は勤怠IDだとしっくりこないので、稼働IDとしました。
サブフォームの各フィールドは、編集ロックをかけて更新不可としました。
サブフォームの社員IDテキストボックスにご提案いただいたコードを設定しました。
しかしながら、ダブルクリックをしても何の反応もありません。
どこがおかしいのか検証しても発見に至りませんでした。
ご指摘、ご教授いただけますでしょうか。
ファイルを更新します。
完成前_3.zip です。
よろしくお願いいたします。
現状の T_勤怠 テーブルには主キーがないので、下記のフィールドを追加して主キーにします。
フィールド名 勤怠ID
データ型 オートナンバー型
フォームのレコードソースの Q_勤怠 にも、勤怠ID フィールドを表示させます。
そのうえで、サブフォームの 社員ID テキストボックスのクリック時に下記のコードを設定します。
以上でどうでしょうか。
なるほど。
難しいのですね。
ご提案のように
サブフォームは更新不可にして、サブフォームでダブルクリックすると、メインフォームにそのレコードが表示されて、そこで編集できるようにするというインタフェイスにしようと思います。
サブフォームでダブルクリックしたときというのは、どのようにそのレコードを判別するのでしょうか?
該当レコードをダブルクリックしたときというのは、どこにそのイベントを記述したらよいのでしょうか。
ある特定のフィールドのダブルクリック時イベントに記述すればいいのでしょうか?
そうするとそのフィールドの箇所をダブルクリックしない限りフォームは立ち上がらないということになりませんか?
すべてのフィールドに対してダブルクリック時イベントに記述するということでしょうか?
ご教授よろしくお願いいたします。
hatena様この度はありがとうございました。
やっと書式設定で令和が対応できるようになりました。
ただ下記関数で求めたものが対応できないので
ご教示いただいた式で対応することとしました。
ありがとうございました。
Public Function 許可日(申請日 As Variant) As Variant
Dim 営業日 As Long
許可日 = 申請日
If IsNull(許可日) Then Exit Function
Do
許可日 = 許可日 + 1
Select Case Weekday(許可日)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
営業日 = 営業日 + 1
End If
End Select
Loop Until 営業日 = 2
End Function
クエリーで 出来上日:許可日(申請日)
出来日 : Switch([出来上日]>=#2020/01/01#,"令和" & Year([出来上日])-2018 &
Format([出来上日],"\年m\日d\日"),[申請日]>=#2019/05/01#,Format([出来上日],"""令和 1年""
m\日d\日"),True,Format([出来上日],"ggge\年m\日d\日"))
データシートビューではコンボボックスの絞り込みは難しいですね。
帳票フォームなら方法はありますが、裏技的な難易度が高いものになります。
サブフォームは更新不可にして、サブフォームでダブルクリックすると、メインフォームにそのレコードが表示されて、そこで編集できるようにするというインタフェイスにしたらどうでしょうか。
別のフォームの、フォームヘッダーに、テキストボックスとコマンドボタンを、リンク先の説明通りに配置して、
コマンドボタンのクリック時のイベントプロシージャに、リンク先のコードをコピーして貼り付けるだけです。
わざわざマクロから呼び出す必要性はないです。
同じコードを複数個所に記述するのは無駄ですので、それを標準モジュールに記述して共通に使えるようにできますが、
まずは、クリック時のイベントプロシージャに記述する方法を理解してからです。
ありがとうございます。1つはできたのでそのまま使わせていただいています。別のフォームにつくろうと思いまして。ネットで調べるとマクロからVBAを動かすには
プロシージャーの実行 で Function名 とあったので書いてみたのですが・・・。
添付図の ① の値を ② の OKボタン を押すことで 右のフォームを開き ③ の部分に 書き込もうとしています。
ちなみに C17 は レコードソース C_11_入庫登録クエリ で テーブル C_1_入出庫台帳を元にフィールド 入出庫日 品名ID 入庫数量 出庫数量 単位 入庫備考 従業員コード を選択したモノです。
標準モジュールには記述ぜすに、
帳票フォームで新規行を一番上に表示する - hatena chips
で説明されいるようにフォームを設計して、そのフォームのモジュールに記述してください。
上記の方法ではだめですか。
同じようなフォームを多数作るので、標準モジュールに記述して、複数のフォームから共通で使えるようにしたいということでしょうか。
お世話になります。
いろいろとありがとうございます。
サブフォームもメインフォームと同様にコンボボックスにするということですが
業務名を選択しても作業名はそれに紐づくものが表示されるというわけではないのでしょうか?
サブフォームの業務名コンボボックスと作業名コンボボックスの集合値ソースには、どのように記載したらよいのでしょうか?
重ね重ねご教授お願いいたします。
テーブル自体必要ないです。クエリをエクスポートします。
エクスポート操作を保存したなら、朝、最初に起動したときに、
そのエクスポートをVBAで実行するようにするといいでしょう。
実行した日時を保存するテーブルを作成しておいて、実行日時を格納しておきます。
ファイルを起動したときは、今日の日付の実行履歴がなければ実行するというようにしておけば、
1日に1回だけ実行できます。
完成前サンプルファイルついて
いろいろ修正点がありますので、一つずつ指摘していきますね。
テーブル設計
T_勤怠 テーブルの 業務No、作業No フィールドの規定値が 0 になってますが、これは削除しましょう。
0に設定してあると、入力せずに保存すると、0 になり未入力チェックができなくなります。
リレーションシップを設定しましょう。
リレーションシップを設定する意義は下記のリンク先を参照してください。
リレーションシップを設定した場合の利点 - hatena chips
リレーションシップを設定して、「参照整合性」にチェックを入れておくと、マスターに存在しない値を入力なるとメッセージが出て入力できないようになります。データベースではデータの不整合が発生すると致命的ですので設定しておいた方がいいでしょう。
サブフォームの設計
業務名、作業名 に関しては、クエリでマスターから引っ張ってくると、そこで編集するとマスターの方を更新してしまうので、メインフォームの方の設計のようにコンボボックスにしてコントロールソースは 業務No、作業No にして、列数、列幅の設定で業務名、作業名を表示させるようにします。
テキストボックスを右クリックして[コントロールの種類の変更]-[コンボボックス]でコンボボックスに変更して、メインフォームのコンボボックスと同じ設定にしてください
レコードソースのクエリに抽出条件を設定していますが、抽出はリンク親フィールド/リンク子フィールドの設定で可能ですので、クエリの抽出条件は削除しておきましょう。
リンク親フィールド/リンク子フィールドの設定は、
社員ID;日付
というよう設定にします。複数のフィールドはセミコロンで区切って設定すればOKです。上記のように設定すれば、クエリに業務名、作業名は不要ですし、抽出条件も不要なので、レコードソースは、メインフォームと同じ Q_勤怠 にしてもOKですね。そうすれば、Q_勤怠内訳は不要なので削除しておきましょう。クエリは多くなると管理・メンテナンスが大変になりますのでなるべく少なくなるようにします。
メインフォームに「修正登録」というボタンがあり、そのクリック時で
DoCmd.RunCommand acCmdSaveRecord
を実行してますが、実は、これは無意味です。メインフォームのレコード保存になり、サブフォームとは無関係です。
サブフォームで編集した場合、サブフォームでレコード移動するか、メインフォームへフォーカスを移動した時点で自動的に保存されます。
「修正登録」をクリックするとメインフォームにフォーカス移動しますのでそこで自動保存されます。
もし「修正登録」クリックするまでは登録されないとユーザーに誤解を与えますので、このボタンは削除しましょう。
修正したサンプルファイル
完成前_1.zip
添付ファイル
完成前.zip
お世話になります。
ファイルの破損があるのですね。メンバー個人が入力を終了したときにテーブル作成をしてもらおうと考えたのですが、
管理者が翌朝に1回やれば済むというお話ですね。
理解しました。ここは手動で行いたいと思います。
エクスポート操作も保存しました。
最後の難関です。
サブフォームに入力した履歴を表示するようにしました。
開始時刻、終了時刻、件数はサブフォーム上で修正ができるようにしたいです。
(というか現状修正ができてしまいます。)
しかし、業務名と作業名をサブフォーム上で訳の分からない名前に修正されるとマスタテーブルにもその修正変更が及んでしまいます。
ユーザーが入力後に修正することは必至であると考えています。
サブフォーム上で修正できればいいのですが、前段の不具合が生じるのでいかんともしがたい状況です。
サブフォームの業務名、作業名をコンボボックスのようにプルダウンで選択制御することはできないでしょうか?
ご教授のほど、よろしくお願いします。
ファイル更新します。
完成前.zip です。
クエリでもテーブルと同様にcsvエクスポートできますよ。保存するたびに、テーブル削除、作成を繰り返すのは無駄ですし、ファイル破損の危険性が増えるだけですのやめましょう。現状のテーブル作成クエリを選択クエリに変更して、エクスポートしたいときにそのクエリを指定すればいいだけですので。