Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF1 Then
KeyCode = 0 'キー入力を無効化
If Me.FilterOn = False Then
Me.Filter = "終了チェック = False"
Me.FilterOn = True
End If
End If
End Sub
SELECT 製品ID
, Sum( 小計 ) As 小計の合計
, Sum( 実装費 ) As 実装費の合計
FROM
(
SELECT 製品ID
, 小計
, CCur(0) As 実装費
FROM Q部品構成F_Sub用RS
UNION ALL
SELECT 製品ID
, 0
, 実装費
FROM Q組立構成F_Sub用RS
) q
GROUP BY 製品ID
;
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm "F印刷設定", OpenArgs:=Me.Name
End Sub
Private Sub Report_Close()
DoCmd.Close acForm, "F印刷設定"
End Sub
Private Sub Form_Open(Cancel As Integer)
rptName = Me.OpenArgs 'レポート名取得
End Sub
Private Sub cmd直ちに印刷_Click()
If vbOK = MsgBox("直ちに印刷を開始します。", vbOKCancel) Then
DoCmd.OpenReport rptName, acViewNormal, "", "", acNormal
DoCmd.Close acForm, Me.Name, acSaveNo '自身を閉じる
Else
MsgBox "印刷処理を中止します。", vbCritical
End If
End Sub
SELECT y.部品ID
FROM T製品一覧 x
INNER JOIN T製品別部品構成 y
ON x.製品ID = y.製品ID
WHERE x.check
GROUP BY y.部品ID
HAVING Count(1) = (
SELECT Count(1) FROM T製品一覧 WHERE check
)
;
回答頂いていながら返信が遅くなり申し訳ありません。長期入院していたため回答できませんでした。
深くお詫びいたします。
帳票フォームのフィルターで表示されたレコードだけに対して、フィールド1の値を変更したいです。
フィールド2、3、4の値を連続した文字列としてフィールド1に入れたいのですが、
これをFor分の中にDoCmd.GoToRecord , , acNextを入れると、エラーになって次のレコードに行けません
このような場合はどう記述するべきなのか、ご教授いただければ幸いです。
よろしくお願いいたします。
sk様
回答ありがとうございました。
参考にさせていただきます。
データシートフォームとは別に非連結フォームを新規作成する。
1 の非連結フォームの詳細セクション上にサブフォームコントロールを挿入する。
2 のサブフォームコントロールのソースオブジェクトをデータシートフォームとする。つまり、非連結フォームをメインフォーム、データシートフォームをサブフォームとする。
メインフォームの詳細セクション上にコマンドボタンを挿入する。
4 のコマンドボタンの[クリック時]イベントの発生時に、サブフォームのフィルターを操作するマクロまたはプロシージャを実行するようにする。
といった方法もあるでしょう。
ありがとうございました。
勉強になりました
mayuさん分かり易い解説ありがとうございます。
リレーションしているからと言ってもどんなデータの関係になっているかですね。大変参考になりました。
お世話になりました。
データシートビューでフォームを開いているときに、ユーザーが任意のタイミングで実行するのでしょうか。
ボタンは配置できないので、特定のキー操作(ショートカットキー)で実行するようにすればどうでしょう。
フォームの「キーボードイベント取得」プロパティを「はい」にしておいて、「キークリック時」のイベントプロシージャに下記のように記述すればいいでしょう。
下記はフォームがアクティブの時にF1キーをの押したときに実行する例です。
回答ありがとうございました。
通貨型に変更します
ユニオンクエリを使う場合は仰るとおりです
JOINで実装する場合は
結合キーである製品IDが、2つのクエリで どのような関係性にあるか
が成否(表内の〇と×)の要因となります
今回のご質問では、SQ文で利用されている2つのクエリに対し
行を一意にするキー項目の判別ができなかったこともあり
データの性質次第では、SQLの結果セットで 行の欠損が発生したり 誤った集計結果が出る
という現象を回避できる
ユニオン(縦結合)の回答が適切と判断しました
mayuさん ありがとうございます。コピーしたら上手く出来ました。確かに異なるテーブル同士なのでユニオンでなければ不可能ですね。素晴らしいSQLです! サブクエリにユニオン使うなんてとても自分では思いつきません。
この形にしないと1つのクエリでは出来ないのですよね? すみませんテクニックについていけてなくて。
部品構成、組立構成の両クエリとも、製品IDが一意になっていないため
多:多の結合になり、行割れが発生しているのでしょう
こういった場合は、クエリ同士を
横並びに結合するのではなく、縦に結合することでご希望の結果になります
hatenaさん ありがとうございます。
OpenArgsでしたらバッチリ上手く出来ました。感謝します!
紹介されている分もじっくり見て参考にさせて頂きます。
今回もお世話になりました。
下記で紹介しているサンプルなら、上記の点も考慮していますので、よろしければご参考に。
Screen.ActiveReport.Name で対象レポート名を取得するのは不安定そうなので、OpenArgs引数でレポート名を渡せばどうでしょう。
レポートを複数プレビューしたり、プレビュー中に別のレポートを直接印刷したり、などの場合、おかしなことになるので、その辺のことを考慮して、Report_ActivateイベントやReport_Deactivateイベントを利用してレポート名を取得するほうがいいかも。
hatenaさん ありがとうございます。
説明不足だったのですが(すみません)対象レポートを閉じる時のイベントに印刷設定フォームを閉じるコードも記述してます。
ファイルにはフォームが幾つかありそれぞれに異なるレポートをプレビューするボタンがあります。
最初にこの仕組みのコード記述したフォームAのレポートAをプレビューするボタンを実行すると問題なかったのですが、次にコード記述したフォームBのレポートBをプレビューするボタンを実行するとエラーが発生(レポート名が取得出来ていない)になるのです。試しに印刷設定フォームに MsgBox "名前は" & rptName のボタンを作成して様子みるとAの方は名前が表示されますが、Bでは無理です。レポートBにはサブレポートがあるのでその影響と思いサブレポートを消しても状況は同じでした・・・
データ量(行数×列数)はどのくらいでしょうか。
hatena様
お返事ありがとうございます。
重複者についてはカンマ区切りでできればと思います。ただ、難しい事がわからないため、改行の方が難しくないのであれば、できるだけ易しい方が希望です。
最終目的は、予約日時を個人にデータで案内をする事です。
まずは教えていただいた、Djoin関数を見てみたいと思います。
りんごさま
お返事ありがとうございます。
アクセスのクロス集計にこだわりはなく、データが多くエクセルの場合、固まってしまうことから
初心者ながらアクセスの方がいいのではと思った次第です。
そのことから、エクセル掲示板ではまだ質問はしていません。
「cmd直ちに印刷」をクリックしてレポートを印刷した後も「F印刷設定」フォームが開いたままなのが原因と思われます。開いたままだと、Form_Loadイベントは発生しませんので。
とりあえずの対策としては、印刷したら印刷設定フォームを閉じればいいでしょう。
ただ、レポートをプレビューせずに直接印刷したときとか、レポートのプレビューを閉じてしまった時のことも考慮する必要があるでしょう。
ACCESSでクロス集計しなければいけない理由を明示して下さい。所謂EXCEL掲示板で質問しましたか?
重複者の氏名を一つのセルに表示とのことですが、どのように表示するのでしょうか。
カンマ区切りとか改行するとか、具体的に説明してください。
また、最終目的はなんでしょうか。印刷するのが目的なら、レポートのVBAで比較的にシンプルに実現が可能です。
クエリでする必要性があるのなら、DJoin関数を使うといいでしょう。
DJoin 関数 - リスト文字列を取得する方法
対症療法的な解決で、本質的な解決策ではないと思います。
原因はskさんも推定している「実際の値は 5.6 ピッタリ」ではないのだと思います。
小数点以下桁数を固定にした場合、単精度浮動小数点型は丸められて表示されるので、見た目上は5.6になっていても実際の値はそうでない可能性があります。
これでは集計した場合など演算誤差の原因になります。
そもそも浮動小数点型は演算誤差がありますので、誤差が発生しては困る金額計算には使用すべきではありません。
フィールド名が「利益」ということなので金額値だと思いますので「通貨型」にするのが適切です。
そのうえで小数点2桁以降の端数処理をどうするのかの仕様(切り捨て、切り上げ、四捨五入、金融機関型丸めなど)を決めて演算時に丸め処理をするような設計にすべきです。
sk様
悪戦苦闘しましたが、単精度浮動小数点型にしたら、改善しました。
いつも、回答ありがとうございます。
Excelワークシート上において、そのセルの表示形式がどのように設定されているか、
もし「数値」形式または「通貨」形式である場合、[小数点以下の桁数]プロパティが
いくつに設定されているのかを具体的に明記して下さい。
現時点では、「コピーされたセルの実際の値は 5.6 ピッタリではなく、
5.5 以上 5.6 未満の数値である」可能性が最も高いと思います。
sk様
テーブルを10回くらい、作成しなおしたら、作動しました。
回答ありがとうございました。
とりあえず、以上の 2 点についてそのまま明記されることをお奨めします。
追加されないテーブルの構造をコピーして、追加されたデータをコピペしたら、データは、追加されました。
クエリの書き方がわるいのでっしょうか?
主キーの設定を、外しても、同じ結果になります。
mayuさん ありがとうございます。連絡遅くなりすみませんでした。
確かに、グループ後の部品IDのカウントでいけますね。”製品ID + 部品ID でユニークになっている”の様にデータの分析ができてませんでした。勉強になりました。お世話になりました。
※ T製品別部品構成 は 製品ID + 部品ID でユニークになっていると仮定します
hatena 様
原因が判明致しました。
色々とお手数お掛けして申し訳ありませんでした。
原因:セキュリティのソフトの「McAfee」をアンインストールしたら
通常速度の起動、終了時間に戻りました。
(同症状のパソコン3台からもアンインストールしたら普通に戻りました)
前から「McAfee」は入っていたらしいのですが今回のアップデートから
このような状態になってしまいました。
当方はWin10の環境を持っていないのでファイルを送ってもらってもWin11とWin10での動作速度の違いを検証はできません。
また、Win11の環境の人で同じ現象にあった方がいればいいのですが、上記で紹介したMicrosoft コミュニティでは不具合があるとわりと報告される場合が多いようですが、そのような報告も現在出てないようです。
とりあえず、
「Win 11 の 8 月末のアップデート」を取り消して前のものに戻す方法がありますので、それを試してみて症状が解消するかどうか検証してみては。
FMV Q&A - [Windows 11] 以前のバージョン・ビルドに戻す方法を教えてください。 - FMVサポート : 富士通パソコン
hatena 様
ありがとうございます。
コミュニティで問い合わせさせていただきました。
ファイルのアップロードができるのであればアップロードさせて
いただきますが起動、終了を試していただきご意見いただけないでしょうか?
下記のMS公式の掲示板で質問してみたらどうでしょう。
Microsoft 365 および Officeの結果 - Microsoft コミュニティ
最近の更新がらみの不具合は下記のスレッドがあります。
Access365更新後の不具合 - Microsoft コミュニティ
ただ、Accessファイルを閉じてもロックファイルが残り、次回起動できないという不具合なのでこの質問の症状とは違います。
こんな質問は駄目なんですね!
有償でも結構なのでどこか相談できる会社等の
アドバイスいただければ幸いです!
すいません。ソートの条件に、直近3ヶ月を加えたことで、できました。
申し訳ありません。
解決しました。
hatena様
ご返答ありがとうございます。
今回ばかりは、コードをストップする手立てはないんじゃないかと思っていました。
ダイアログにすれば止まる、というのは驚きました。
それと、別フォームを非表示にしたら、元フォームのテキストボックスがアクティブコントロールになること、
また、Screen.という使い方も知りませんでした。
今回も助かりました。
ありがとうございました。
早速、やってみます!
DoCmd.OpenFormでフォームを開くときに、ダイアログモードを指定すればフォームを閉じる(あるいは非表示になる)まで次のコードにすみません。また、開いている間はユーザーはこのフォーム以外を操作できません。それを利用するといいでしょう。
具体的には、WindowMode引数にacDialogを設定します。
DoCmd.OpenForm メソッド (Access) | Microsoft Learn
コード例
「正規化」だからといって特別の方法はないと思います
データベースの入門書を買って学習する
「正規化」をキーワードにWEB検索して、解説サイトで学習する
そのうえで、現状の扱いたいデータを正規化してみる
上記で正しく正規化できているか分からない場合は、
扱いたいデータのデータ例と、現状のテーブル構成を提示して、ここや技術系の掲示板で質問してみる
ではとりあえず、次の2点について明記されることをお奨めします。
作成された更新クエリの SQL ビューの内容
更新クエリに設定されている抽出条件において、[cmb_送付先]および[txb_送付期限]との比較対象となっている各フィールドのデータ型
Dcount関数の使い方を紹介しているページとか見ましたが、フォームで入力した抽出条件をどのように式に書くのかがよくわかりませんでした。