Private Sub Form_Load()
Me.日付.DefaultValue = "#" & Format(Date, "yyyy/mm/dd") & "#"
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub 社員ID_AfterUpdate()
Me.社員ID.DefaultValue = Me.社員ID
End Sub
Private Sub 日付_AfterUpdate()
Me.日付.DefaultValue = "#" & Format(Me.日付.Value, "yyyy/mm/dd") & "#"
End Sub
クエリのデータをテーブルにして、CSVでエクスポートするために作りました。
ファイル DEMO6 の内容を見ました。
質問に答える前に、少し確認させてください。
テーブル作成クエリ「Q_勤怠詳細_t」は何のために実行するのでしょうか。
フォームを閉じるたびに実行されますが、
T_勤怠詳細 を削除してから、作成しなおすという動作になります。
何のためにこの動作が必要と考えましたか。
T_勤怠詳細 と同じ内容のものは、クエリで取得できますので、T_勤怠詳細テーブル自体必要のないものだと思いますが。
お返事のないまま進めて申し訳ありません。
VBAの記述を手入力でし直したところ、うまく動きました。
最後に、テキストボックスが空欄の場合、エラーメッセージを出す方法はありますでしょうか?
社員ID
氏名
開始時刻
終了時刻
稼働時間
業務名
作業名
件数
については、空欄の場合「~を入力してください」というものです。
ご教授よろしくお願います。
ファイル DEMO6に更新します。
お世話になります。
テーブル作成クエリの「Q_勤怠詳細_t」をフォームを閉じるときに実行することができ目的を達成することができました。
しかしながら
Private Sub Form_Load()
Me.日付.DefaultValue = "#" & Format(Date, "yyyy/mm/dd") & "#"
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub 社員ID_AfterUpdate()
Me.社員ID.DefaultValue = Me.社員ID
End Sub
Private Sub 日付_AfterUpdate()
Me.日付.DefaultValue = "#" & Format(Me.日付.Value, "yyyy/mm/dd") & "#"
End Sub
を記述したところ フォームを開くとエラーが出てしまいます。
一度、VBAの記述などをチェックしていただけますでしょうか?
ほぼほぼ最終地点に到達させていただいております。
ご教授よろしくお願いします。
ファイル Demo5 に更新します。
立て続けにすみません。
コンボボックスでも社員IDを手入力で氏名に反映できるので前回の質問は取り下げさせていただきます。
フォームに登録ボタンを作って
新しいレコードに移動し、開始時刻にフォーカスさせる。
という仕組みにしました。
ここで
テーブル作成クエリの「Q_勤怠詳細_t」を同時に実行できないかと思案しています。
登録ボタンを押すと
①新しいレコードに移動する
②開始時刻にフォーカスさせる
③テーブル作成クエリの「Q_勤怠詳細_t」を実行する。
この3つが一つのボタンでできないかと。。。
別ボタンを作ると、押し忘れる人がいることも考えられるので
思案中です。
フォームを閉じるときとかにアクションクエリを実行するとかも考えたのですが
行き詰りました。
ご教授よろしくお願いします。
ファイル更新します。
早速のご教授ありがとうございます。
社員は100名ほどを想定しており、コンボボックスよりもIDを入力することを求められています。
そこで、ご教授のようにVBAを記述しましたが、新しいレコードに進むとIDは全レコードのものを表示できますが
氏名が前レコードのものを表示できません。
コントロールソースが異なるものとなるから表示されないということはわかるのですが、
この場合、氏名のコントロールソースにはどのように記述すればよろしいでしょか?
また、ほかのVBAの記述が必要でしょうか?
ファイル更新しますのでご教授のほどよろしくお願いいたします。
そのような場合は、既定値プロパティを使うといいです。
既定値プロパティは新規レコードで、入力する前に既定の値を表示しておくものです。
まず、日付ですが、入力する日に、その日のデータを入力するなら、Date() の日付を既定値に設定しておけばいいですね。
前日のデータを入力するなら、Date()-1 の日付を既定値に設定します。
社員IDは、最初は空白にしておいて、入力したら、その値を既定値に設定するようにすれば、次の新規レコードから、前に入力した値が表示されます。
フォームのコードは下記のようになります。
修正したサンプルファイル
サンプルファイルの上記以外の修正点
社員IDをテキストボックスからコンボボックスに変更した。
リストは、社員ID と 社員名の2列表示にした。
社員名のコントロールソースをコンボボックスの2列目の値を参照するようにした。
=[社員ID].[Column](1)
クエリの社員名にしておくと、マスタの社員名を更新する恐れがあるし、新規レコードで社員IDの規定値に対応する社員名が表示されないため。
社員名の「タブストップ」を「いいえ」にした。社員名は入力する必要がないので。
Form_Current() の役割 理解しました。
そこまで考えて構築しないといけないのですね。勉強になりました。
次の工程でいまたつまづいています。
日付、社員ID、氏名は固定というか、その日に入力する限りはその都度入力することをしなくしたいです。
イメージとしては朝1番に日付からすべてを入力する。
登録ボタンを押すと、次のレコードに進むが日付、社員ID、氏名は引き継ぐといった感じです。
ご教授願えればと思います。
ファイル再度アップロードします。
サンプルファイルのURLを修正しました。これでダウンロードできると思います。
Form_Current()
の役割ですか、コンボボックス cb作業No のドロップダウンリストの内容を 業務No によって制限してますが、
レコード移動すると、業務No も変わりますので、それに合わせて、cb作業No のドロップダウンリストの内容を変更するために必要となります。
ありがとうございました。
上記の処理後、Q_勤怠にT_業務マスタ T_作業マスタをリレーションしてQ_勤怠に業務名、作業名が表示されるようになりました。
質問なのですが、
Private Sub Form_Current()
Me.cb作業No.Requery
End Sub
とは、具体的にどのようなことをしているのでしょうか?
あと、サンプルファイルをアップロードしていただいたようなのですが、URLが不明で開けませんとメッセージが出てしまい、開けない状況です。
ご教示いただけたらと思います。
よろしくお願いいたします。
T_勤怠
業務名、作業名 フィールドは削除して、業務No、作業No フィールドを追加する。
T_業務マスタ T_作業マスタ T_社員マスタ は現状のままでOKです。
Q_勤怠 も 業務名、作業名 を 業務No、作業No に変更。
F_勤怠入力 の業務名、作業名のコンボボックスのプロパティを下記のように変更。
業務名のコンボボックス
以上です。
修正したサンプルファイル
再入力は可能です。
どのようにテーブルを作ればよろしいでしょうか?
ありがとうございます。無事にできました。
できました。
オートナンバー型のフィールド削除したクエリを使えば大丈夫ですか?
リンクしているHPを早速やってみました。オートナンバー型のフィールドがある場合はどうしたらよいのでしょう?
n をつけて非連結のテキストボックスをつくって 数値を入れなかったらエラーが出てしまったのですが・・・。
主キーの設定、在庫品マスターのフィールド構成等がまだ、不明なので、
一般的な推奨されるテーブル設計に基づいて回答します。
社員ID はオートナンバー型
作業者コード は 所属課コード + 連番
ということですね。
主キーがどれか不明ですが、
作業者コードでは、異動で所属課が変わることもあることを考慮すると、
主キーはオートナンバー型の 社員ID にすべきですね。
社員マスターは、他のテーブルから参照されることが多くあるはずですが、
その場合、社員マスターを参照するテーブルには、社員マスターの主キーフィールドとリンクするフィールドを持たせます。
マスターの主キーフィールドのデータが変更されると、参照先も変更する必要が生じてしまい処理が煩雑になりますので、主キーは一度付与したら変更がないようなものにすべきです。
在庫品マスター で入力した作業者を保存しておく必要がある場合は、
在庫品マスター に 社員ID (数値型) のフィールドを持たせます。
社員ID は意味のない数値なので、入力するときは、
作業者コード または 氏名 で入力したいという要望は当然でてきます。
そのときは、コンボボックスを使うと簡単に実現できます。
作業者コードで入力したい場合は、コンボボックスを2つ配置して下記のように設定します。
名前 cb作業者コード
コントロールソース 社員ID
値集合ソース 社員マスター
連結列 1
列数 3
列幅 0cm;2cm;4cm ←データ長に合わせて適宜修正してください。
リスト幅 6cm
名前 cb作業者名
コントロールソース 社員ID
値集合ソース 社員マスター
連結列 1
列数 3
列幅 0cm;0cm;4cm
リスト幅 4cm
これで、cb作業者コード で作業者コードを入力するかリストから選択すると、
cb作業者名 には、氏名が表示されます。
テーブルの社員IDフィールドには、該当する社員IDが表示されます。
また、cb作業者名 で氏名を入力するか選択することもできます。
下記に上記と同様の方法のサンプルがありますので参考にしてください。
社員IDはあくまでも登録されている順でオートナンバーでふられています。
作業者コードは1001から始まる4桁の数字で、上2桁で所属する課を表示し、下2桁で課内の登録社員を01から99で登録しています。
Z_1 社員マスター
作業者コード 氏名
1001 阿部晋三
1002 田中角栄
1003 鳩山由紀夫
非連結のテキストボックス 作業者コード に1002を入力した時に 非連結のテキストボックス 氏名 に 田名角栄
と表示されるようにしたいのですが・・・。
ちなみに入庫伝票を作成する入力作業をした作業者が自分の作業者コードを入れた時に間違っていないかを確認する為に行いたいのですが・・・。他に良い方法がありますでしょうか?
ありがとうございます。早速なおします。
[Z_1 社員マスター]の主キーフィールドはなんでしょうか。
また、社員ID と 作業者コード の違いはなんでしょうか。
[B_1 在庫品マスター]のフィールドも提示してください。
非連結ですと、テーブルに反映されませんし、フォームを閉じれば消えてしまいますが、
入力したデータをどうするつもりですか。
空白を含むオブジェクト名をコード中に記述するには、[]で囲む必要があります。
以下は、回答ではないですが、
以前から気になっていたので、この際アドバイスしておきます。
オブジェクト名に空白を使うのは避けたほうがいいと思います。
コードが読みづらくなりますし、バグやトラブルの原因になりかねません。
また、あまり長すぎるのも読みづらいです。
といって短くしすぎて、意味不明になってもメンテナンスしづらいです。
そのオブジェクトの役割をシンプルかつ明確に表す名前になるように工夫しましょう。
とりあえず空白で区切るのではなく、_(アンダーバー)に変えるだけでも読みやすなります。[]で囲む必要もなくなります。
システムが大きくなるほど改変が大変になりますので、早めに修正しておくことをお勧めします。
例えば、
[F_1_1 在庫品マスター 入庫の登録画面]
は、
F11_入庫の登録_メイン
ぐらいでいいのではないかと思います。
(全体像が分からないのであくまで一例です。このぐらいの長さのオブジェクト名を目指してください、ということです。)
下記を参考にしてください。
ありがとうございます。
在庫数が表示されなかったので
コントロールソースを =Nz(Sum([入庫数量])Nz() =Nz(Sum([出庫数量])) としたら表示されました。
Forms![F_1_1 在庫品マスター 入庫の登録画面]![F_1_2 入出庫台帳 クエリ 入庫力用].Form!入出庫日
とすることで赤文字でなくなりました。
新規のレコードを一番上に表示することは可能なのでしょうか?
ファイルの内容を確認してみました。
テーブル設計が基本的に間違っています。
マスターテーブル(T_業務マスタ、T_作業マスタ、T_社員マスタ)は主キーが設定されていて問題ないのですが、それを参照するトランザクションテーブル(T_勤怠)の設計が間違いですね。
トランザクションテーブルでマスタとリンクするフィールドは、マスタの主キーフィールドである必要があります。
T_勤怠の、社員ID はT_社員の主キーとリンクしますので問題ないですが、業務名称、作業名はマスタでは主キーでないのでNGです。
テーブルの設計の変更をする必要がありますが、現状、データは何件ぐらい入力していますか。
それほど多くなく一から再入力することが可能なら、現状のデータは破棄して、テーブルも一から作り直すのがいいでしょう。
かなりのデータ件数で再入力が手間なら、現状のデータを残して、テーブル設計を変更して、既存のデータを更新するとき作業になり、すこし複雑になります。
ということで、データの再入力が可能なのか、不可なのかご返事ください。
Sum関数は、フォームのレコードソースのフィールドデータを集計するものですので、コントロール名を引数にすることはできません。別フォームのデータを集計することもできません。
サブフォームのフォームフッターにテキストボックスを配置して、そこで集計します。
名前 入庫数量計
コントロールソース =Sum([入庫数量])
名前 入庫数量計
コントロールソース =Sum([出庫数量])
これをメインフォームから参照するようにします。
=[F_1 入出庫台帳 クエリ 入力用].[Form]![入庫数量計]-[F_1 入出庫台帳 クエリ 入力用].[Form]![出庫数量計]
正規化と言うんですね!その言葉は全然知らなかったので、「1文字のみ 一致」とかでずっと調べてました。。
調べてみると一朝一夕で身につくものではなさそうですが、、せっかくなのでこのGWにじっくり勉強してみます!
それにしてもAccessは奥が深いですね。
出来ることが増えるとどんどん面白くなってきて楽しくなってきます♪
このような設計方法を「正規化」といいます。「テーブル 正規化」でWEB検索すると解説ページがいろいろ見つかるので分かり安そうなページを読んでおくといいでしょう。完全に理解できなくても、なんとなく雰囲気をつかんでおくと、いろいろ経験を積んでいくうちに理解できるようになるでしょう。
また、このような設計にしておくと、
というレイアウトは、クロス集計クエリという機能で簡単に変換できます。
hatenaさん
ご回答ありがとうございます。
なるほど…私のやり方ではせっかくのAccessの機能をうまく活用できていないわけですね。
hatenaさんのブログを色々漁ってみたのですが、そこには辿り着けませんでした…
方向性を示して頂きありがとうございます。作り方が見えてきました。
参考リンク先をもとにテーブルを作り直してみます。
hatenaさん、macofさん ありがとうございました!
maeさん
やはりそのテーブル設計はまずいですね。
リレーショナルデータベースの機能を活用できません。
例えば、果物の種類ごとの集計をしようとしても、それではできません。
案件テーブル
案件明細テーブル
というように2つのテーブルに分割します。
(テーブル名は適当ですので、内容に沿ったものにしてください。)
入力フォームはメイン/サブフォーム形式になります。
イメージとしては下記のリンク先のようなフォームになります。
帳票フォームで項目(行)を固定表示する - hatena chips
macofさん、回答ありがとうございます。
なるほど、それは思いつきませんでした(;'∀')
それでいけますね。
macof さん
アドバイスありがとうございます。(返信を長々と書いていたので気付くのが遅れました…)
上記の条件式を試したところ、無事にできました!ありがとうございます!
でもこのようなテーブル設計はやはりナンセンスでしょうか…?
下記、質問をした経緯をご説明します。
1案件に複数の果物データが保持してあります。
まず、登録フォームで それぞれのチェックボックスにチェックいれると、
りんごをチェックした場合
みかんをチェックした場合
というように、[種類]のテキストボックスに文字列ができていきます。
りんご、みかん、ぶどうにチェックをいれると、「abc」となります。
登録されたテーブルを確認するとき、上記のような検索BOXを用いて抽出したいという意向でした。
はじめは下記のようなテーブル構成を考えていたのですが、
これだと種類が追加されたとき再構成の必要があり、またフィールドもどんどん増えてしまうのでどうしたものかと考えた時に、上記の方法はどうだろうかと至った次第です。
VBAで解決できるなら問題ありません。
また、もし別のやり方でもっと簡単にできるのであればそれでも構いません。
お手数をおかけしますが、ご教授のほどよろしくお願いいたします。
横からすいません。
最初の質問にあった条件式を変形して
で行けませんかね。
厳密には角括弧とかハイフンのエスケープが必要になると思いますが…
追記
普通に入力するとアスタリスクが飛ぶことに気付いてませんでしたので修正しました。
すいません…
あと、このようなことをしなくてはいけないのはそもそもテーブル設計でやらかしてる可能性が高いとは思います。
関数のみでは難しいので、VBAが必要になりますが、大丈夫ですか。
そのようなことが本当に必要なのでしょうか。
お世話になっております。
申し訳ございません、もう少しご教授をお願いします。
クエリとフォームのテキストボックスを比較して、1文字のみ一致していれば抽出されるようにするには、どのような抽出条件になるのでしょうか?
例
クエリA
フォームAの検索BOXに「bac」と記入されている場合、「a」「b」「c」を含む「abzc」「btrw」「cwrq」が抽出される。
何度も申し訳ございませんがよろしくお願い致します。
私のところやアドバイザー先でもまだ、未対応のようです。
しかたがないので、あちこち式で修正しています。
修正箇所が大量にあるので大変です。
hatenaさまありがとうございます。早く令和のgggeに
代わるものが出されればいいのですが。
それまではhatena様の回避策を活用させていただきます。
ありがとうございました。
ありがとうございます。思うような物ができました。
「期ごと」について考えてみたいと思います。
しばらく待てば、アップデイトで書式設定でも新元号に対応してくれるはずです。
OSやOfficeのバージョンでは対応済みのものもあるようです。
まだ、対応済みでない場合は、それまでの、一時的な回避策として式で設定することになりますね。
早々のご回答ありがとうございます。
できました!逆の発想をすればよかったんですね。
返信の速さに驚くのと同時に、感謝の気持ちでいっぱいです。
ありがとうございました。