Microsoft Access 掲示板

views
4 フォロー
6,278 件中 81 から 120 までを表示しています。
1
しん 2024/09/17 (火) 11:51:26 051ad@9fff4

主キーの設定を、外しても、同じ結果になります。

2
beginner 2024/09/17 (火) 08:22:54 ddfe5@e1964

mayuさん ありがとうございます。連絡遅くなりすみませんでした。
確かに、グループ後の部品IDのカウントでいけますね。”製品ID + 部品ID でユニークになっている”の様にデータの分析ができてませんでした。勉強になりました。お世話になりました。

1

※ T製品別部品構成 は 製品ID + 部品ID でユニークになっていると仮定します

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
       )
;
6
ヒロ 2024/09/12 (木) 14:49:16 ad693@a6874

hatena 様

原因が判明致しました。
色々とお手数お掛けして申し訳ありませんでした。

原因:セキュリティのソフトの「McAfee」をアンインストールしたら
   通常速度の起動、終了時間に戻りました。
   (同症状のパソコン3台からもアンインストールしたら普通に戻りました)

前から「McAfee」は入っていたらしいのですが今回のアップデートから
このような状態になってしまいました。

5
hatena 2024/09/12 (木) 10:07:07 修正

ファイルのアップロードができるのであればアップロードさせて
いただきますが起動、終了を試していただきご意見いただけないでしょうか?

当方はWin10の環境を持っていないのでファイルを送ってもらってもWin11とWin10での動作速度の違いを検証はできません。

また、Win11の環境の人で同じ現象にあった方がいればいいのですが、上記で紹介したMicrosoft コミュニティでは不具合があるとわりと報告される場合が多いようですが、そのような報告も現在出てないようです。

とりあえず、
「Win 11 の 8 月末のアップデート」を取り消して前のものに戻す方法がありますので、それを試してみて症状が解消するかどうか検証してみては。

FMV Q&A - [Windows 11] 以前のバージョン・ビルドに戻す方法を教えてください。 - FMVサポート : 富士通パソコン

4
ヒロ 2024/09/11 (水) 17:05:11 ad693@a6874

hatena  様 

ありがとうございます。
コミュニティで問い合わせさせていただきました。

ファイルのアップロードができるのであればアップロードさせて
いただきますが起動、終了を試していただきご意見いただけないでしょうか?

3

下記のMS公式の掲示板で質問してみたらどうでしょう。

Microsoft 365 および Officeの結果 - Microsoft コミュニティ

最近の更新がらみの不具合は下記のスレッドがあります。

Access365更新後の不具合 - Microsoft コミュニティ

ただ、Accessファイルを閉じてもロックファイルが残り、次回起動できないという不具合なのでこの質問の症状とは違います。

1
ヒロ 2024/09/11 (水) 07:55:03 ad693@a6874

こんな質問は駄目なんですね!
有償でも結構なのでどこか相談できる会社等の
アドバイスいただければ幸いです!

1
しん 2024/09/10 (火) 20:12:21 051ad@9fff4

すいません。ソートの条件に、直近3ヶ月を加えたことで、できました。
申し訳ありません。
解決しました。

2
あん 2024/09/10 (火) 15:40:56 b41ab@a5bc1

hatena様

ご返答ありがとうございます。

今回ばかりは、コードをストップする手立てはないんじゃないかと思っていました。

ダイアログにすれば止まる、というのは驚きました。

それと、別フォームを非表示にしたら、元フォームのテキストボックスがアクティブコントロールになること、
また、Screen.という使い方も知りませんでした。

今回も助かりました。
ありがとうございました。
早速、やってみます!

1
hatena 2024/09/10 (火) 15:18:10 修正

DoCmd.OpenFormでフォームを開くときに、ダイアログモードを指定すればフォームを閉じる(あるいは非表示になる)まで次のコードにすみません。また、開いている間はユーザーはこのフォーム以外を操作できません。それを利用するといいでしょう。
具体的には、WindowMode引数にacDialogを設定します。   

DoCmd.OpenForm メソッド (Access) | Microsoft Learn

コード例

'テキストボックスのダブルクリック時
Private Sub テキスト1_DblClick(Cancel As Integer)
    Cancel = True
    DoCmd.OpenForm "InputForm", WindowMode:=acDialog
End Sub
'別フォーム(InputForm)上のコマンドボタンのクリック時
Private Sub OKボタン_Click()
    Me.Visible = False '非表示にする
    'ダブルクリックしたテキストボックスがActiveControlになる
    Screen.ActiveControl = Me.コンボ2.Value
    DoCmd.Close acForm, Me.Name
End Sub
3

「正規化」だからといって特別の方法はないと思います

データベースの入門書を買って学習する

「正規化」をキーワードにWEB検索して、解説サイトで学習する

そのうえで、現状の扱いたいデータを正規化してみる

上記で正しく正規化できているか分からない場合は、
扱いたいデータのデータ例と、現状のテーブル構成を提示して、ここや技術系の掲示板で質問してみる

3

フォームで入力した抽出条件をどのように式に書くのかがよくわかりません

ではとりあえず、次の2点について明記されることをお奨めします。

  • 作成された更新クエリの SQL ビューの内容

  • 更新クエリに設定されている抽出条件において、[cmb_送付先]および[txb_送付期限]との比較対象となっている各フィールドのデータ型

2
名前なし 2024/09/02 (月) 17:19:14 7d95c@44ebd >> 1

Dcount関数の使い方を紹介しているページとか見ましたが、フォームで入力した抽出条件をどのように式に書くのかがよくわかりませんでした。

1

この非連結のボックスに入力された内容でソート

ソート(並べ替え)ではなくフィルタリング(レコードの抽出)のことをおっしゃっているとして、

T_注文というテーブル

更新クエリの実行前に、何レコードが更新されるのかわかるように、
コンボボックスとテキストボックスの更新後処理で、
フォーム上のtxb_処理件数という非連結のテキストボックスに
「処理予定:〇件」と表示させる

例えば、その更新クエリに設定されているのと同じ抽出条件に該当する[T_注文]のレコードの件数を DCount 関数によって求めればよろしいのではないかと。

4
beginner 2024/09/02 (月) 12:14:07 ddfe5@72531

hatenaさん ありがとうございます。
なるほどそういう事ですね。色々素晴らしい回答を頂き感謝します。大変勉強になります。
お世話になりました。

3

【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?

""で囲まれた文字列内なので問題ありません。
また、最終的にはReplace関数で条件式に置換してますので、RpwSourceに設定するときには消えています。

2
beginner 2024/08/30 (金) 16:01:57 ddfe5@72531

hatenaさん ありがとうございます。
Constは使った事がなかったので勉強になりました。条件変数に条件を随時追加はFilterの様にSQLでも出来るとは知りませんでした。確かにこれは便利です! 一つだけ参考にまで教えて頂きたいのですが【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?

1

私がよくやるのは、定数でSQLを宣言しておいて、変更がある部分(今回はWHERE句)はマークを付けたワードにしておく。
WHERE句のみ生成して、Repalceでマークワードを生成した条件式で置換する。

条件式の生成は、今回のように3条件ぐらいなら、ElseIf で分岐していっても何とかなるが、条件が多くなると収拾がつかなくなるので、条件変数に条件を随時追加していくようにする。

あと、提示のコードをみると 製品ID は入力必須、出荷月のみの入力はNGのようなので、そのチェックを追加しておいたほうがいいでしょう。

コード例

Private Sub cb注番選択_GotFocus()
    Const conSQL = _
        "SELECT DISTINCT [注番] " & _
        "FROM [Q製品出荷履歴1Form用RS] " & _
        "WHERE 【Where】 " & _
        "ORDER BY [注番];"

    Dim varID As Variant, varYear As Variant, varMonth As Variant
    varID = Me.[製品ID]
    varYear = Me.[cb出荷の年]
    varMonth = Me.[cb出荷の月]
    
    If IsNull(varID) Then
        MsgBox "製品IDを入力してください。"
        Me.[製品ID].SetFocus
        Exit Sub
    End If
    
    If IsNull(varYear) And Not IsNull(varMonth) Then
        MsgBox "出荷年を選択してください。"
        Me.[cb出荷の年].SetFocus
        Exit Sub
    End If
    
    Dim strWhere As String
    strWhere = "[製品ID]=" & varID

    If Not IsNull(varYear) Then
        strWhere = strWhere & " AND Year([出荷日付])=" & varYear
    End If

    If Not IsNull(varYear) Then
        strWhere = strWhere & " AND Month([出荷日付])=" & varMonth
    End If

    Me.[cb注番選択].RowSource = Replace(conSQL, "【Where】", strWhere)

End Sub
11

「コントロールソースからの実行」とは、テキストボックスなどのプロパティにある「コントロールソース」の内容を実行することを指します。

ちょっと表現が分かりにくいですが、
テキストボックスのコントロールソースに式が設定してある。
このフォームやレポートを開くときに、式が評価(実行)されて結果がテキストボックスに表示される。
ということを指しているのでしょうか。

もちろん、この場合、VBAコードが実行されるわけではないので、VBAデバッグはできません。
ただ、この場合、エラーになったときは、テキストボックスに #Size!、#Type! などというように表示されますので、どこでエラーがでているかは判断できます。
で式内の値を確認すればだいたい原因は分かります。
例えば、テキストボックスを追加して、そこに=Sum([明細金額]) 、=[消費税] とすれば値を確認できます。#Type!エラーなら数値であるべきなのに文字列がはいっているとか、Nullだとか。

例えばテキストボックスの内容のコントロールを全てVBAの中で実施している場合、デバッガで追えますが、コントロールソースで行うとその内容は追えない、ということになります。

=Sum([明細金額])+[消費税]
というような集計処理はコントロールソースを使うのが一般的だと思いますし、私は多用しますが、
このような場合、「コントロールを全てVBAの中で実施」するのは、どのようなコードにしていますか。
ご参考までにサンプルを教えてもらえると幸甚です。

10
すずやん 2024/08/26 (月) 16:41:06 >> 9

「コントロールソースからの実行」とは、テキストボックスなどのプロパティにある「コントロールソース」の内容を実行することを指します。
「VBAの実行」とはイベント発生時に「イベントプロシージャ」からVBAを実行することを指します。

「VBAの実行」ではデバッガの機能が使えますので、1行毎にどのような変化が発生したか、などを追うことができます。「コントロールソースからの実行」ではそれができない、ということを指しています。
(「金額部分のコントロールソースには =(Sum([明細金額]))+[消費税] の式が設定されています」の部分ですね)

例えばテキストボックスの内容のコントロールを全てVBAの中で実施している場合、デバッガで追えますが、コントロールソースで行うとその内容は追えない、ということになります。

2

お世話になります。ありがとうございました!
チャレンジしてみます。
本当にここのサイトは勉強になります。

2

ご回答いただきありがとうございます。
そうですか。。。リストボックスとボタンを組み合わせて作成します。
ありがとうございました。

1

PCがスリープに入ってしまうとCPUへの給電も止まるので、プログラムは止まってしまいます。
ですので、スリープに入る直前に発生するイベントがあればいいのですが、VBAにはないですね。APIならあるかも知れませんが、ちょっと検索してみた限りでは情報は見つかりませんでした。

Accessデータベースを立ち上げた放置するということはままあることなので、私は下記のような対策をしています。

各フォームのキーボードイベント、マウス移動イベントで、ユーザー操作を検知したら、その時刻をグロバール変数に格納する。
常に表示させてあるフォームのタイマーイベントで定期的にグロバール変数の時刻と現在時刻の時間差を求めて、その時間が設定した時間より長ければファイルを強制終了する。
強制終了する時間をスリープ待機時間より短く設定しておけば、スリープへ入る前に終了させることができます。

9

すみません。コントロールソースからの実行という意味がわかっておりません。
上記コードは、フォーム上に設置したコマンドボタンのクリック時に実行しています。可能であれば、違いを教えていただけますと有難いです。

1

ないと思います。

どうしても必要なら、テキストボックス、コマンドボタン、リストボックスを組み合わせて、コンボボックスと同様の機能をもったものを自作するということになると思います。

8
すずやん 2024/08/22 (木) 09:56:06 >> 7

失礼しました。コントロールソースからの実行の場合、このデバッグ方法は使えません。
逆にデバッグで追えるのはVBAからの実行だけです(知る限りでは)

コントロールソースからの実行はとても便利ですが、文字検索の対象にならないことやデバッグができない(と思っている)ので、個人的にはあまり使わないようにしています。

7

すずやんさんの紹介しいるリンク先のデバッグ方法は、VBAの実行時エラーの確認方法です。

今回の場合は、テキストボックスのコントロールソースに設定している式でのエラーですので、この方法は使えません。

6

ありがとうございます。解決しました。

コメントいただいたことを色々試していたところ、レポートのソース(クエリー)に、抽出条件が設定されていたことが原因だったことがわかりました。(クエリーは確認していたはずなのですが、大変申し訳ございません。)
たまたま抽出条件に合わない請求書を試し印刷をしていて、原因に気づけず、お騒がせしました。

デバッグの方法の件、

以下のコードの2行目にカーソルを置き、F8を押しましたが、何の反応もありません。上部メニューのデバッグ(ステップイン)からも、反応がありません。

本来なら、請求書番号を求めるポップアップなどが表示されるのでしょうか。よろしければ今後のためにご教示いただけますと有難いです。宜しくお願い致します。

Private Sub 請求書印刷_Click()
  DoCmd.OpenReport "請求書", acViewPreview, , "[請求書番号] = " & Me.請求書番号 & ""
End Sub

11
しん 2024/08/21 (水) 15:08:02 051ad@9fff4

お騒がせしました。循環参照は、解決しました。

参考までに、まったくの素人ですが、hatena様のコードを、ネットで調べて変更しました。

hatena様のコードも作動しました。

参考のコードの解説もありがとうございました。
大変参考になりました

10
しん 2024/08/21 (水) 15:00:01 051ad@9fff4
SELECT 
    [ID],
    [親番], 
    [売上先],
    [子番], 
    [支店_営業所],
    [孫番], 
    [現場名],
    [府県],
    [締日],
    [油種],
    [直近3ヶ月], 
    [仕入],
    [売上],
    [利益],
    [仕入コード],
    [仕入先],
    [単価_ランク_コード],
    [単価_ランク],
    [開始(復活)],
    [終了],
    [備考1],
    [備考2],
    [担当],
    [車番①],
    [車番②],
    [車番③],
    [車番④],
    [車番⑤],
    [車番⑥],
    [車番⑦],
    [車番⑧],
    [車番⑨],
    [売上先カナ],
    [支店_営業所カナ],
    [現場名カナ],
    [フラグ],
    [日付コード],
    [油種コード],
    [合成キー],
    [納入先業者名カナ],
    [親グループカナ],
    [締め日],
    [数量料],
    [更新用フラグ],
    [更新合成キー]
FROM 
    [Q_直近3ケ月 のコピー]
    

このコードでも循環参照が発生していますとなります。

Q_直近3ケ月 のコピーのもとは、MT_検索テーブルから作成しています

9
しん 2024/08/21 (水) 14:52:23 051ad@9fff4

hatena様

参考のコードありがとうございます。

そのまま投稿しようとおもったのですが、改行は、50行までと言われました。

私が、2番目に投稿した、SQL文ですが、作成時は、上手く表示されますが、一旦保存すると、Q_直近3ケ月 のコピーで、循環参照が発生していますとなります。

hatena様の参考コードを利用しました。

'''spl
Nz(Choose(DateDiff("m", [直近3ヶ月], DateSerial(Year(Date()), Month(Date()),1)+1,3,2,1),4) AS [並べ順]
'''

この部分で、演算子がありませんとなりました。

改善方法はありますか?
お手すきのときに、回答いただけたら幸いです。

8

解決したのですね。よかったです。

ちなみに、質問のSQLですが、
サブクエリと親クエリのSQLが演算フィールド以外は同じなのに、わざわざサブクエリにしたということは、ORDER BY句に演算式を重複して記述するのを避けたいという意図でしょうか。

だとしたらORDER BY句にはフィールド名ではなくフィールド番号(何番目のフィールドか)を指定することもできます。それを利用すればサブクエリを使う必要はなくなります。

あと、演算フィールドの式もChoose, DateDiff関数を使えばもう少し簡略化できます。

御参考までにコード例を置いておきます。

    [ID],
    [親番], 
    [売上先],
    [子番], 
    [支店_営業所],
    [孫番], 
    [現場名],
    [府県],
    [締日],
    [油種],
    [直近3ヶ月], 
    [仕入],
    [売上],
    [利益],
    [仕入コード],
    [仕入先],
    [単価_ランク_コード],
    [単価_ランク],
    [開始(復活)],
    [終了],
    [備考1],
    [備考2],
    [担当],
    [車番①],
    [車番②],
    [車番③],
    [車番④],
    [車番⑤],
    [車番⑥],
    [車番⑦],
    [車番⑧],
    [車番⑨],
    [売上先カナ],
    [支店_営業所カナ],
    [現場名カナ],
    [フラグ],
    [日付コード],
    [油種コード],
    [合成キー],
    [納入先業者名カナ],
    [親グループカナ],
    [締め日],
    [数量料],
    [更新用フラグ],
    [更新合成キー],
    Nz(Choose(DateDiff("m", [直近3ヶ月], DateSerial(Year(Date()), Month(Date()),1)+1,3,2,1),4) AS [並べ順]
FROM 
    [Q_直近3ケ月 のコピー]
) AS [サブクエリ]
ORDER BY 
[親番], 
[子番], 
[孫番], 
46, 
[油種コード] ASC;
7
しん 2024/08/21 (水) 12:21:01 051ad@9fff4

[Q_直近3ケ月 のコピー]を、再度作成しましたら、作動しました。
お騒がせしました。

hatena様、sk様、回答ありがとうございました。

6
しん 2024/08/21 (水) 12:06:33 051ad@9fff4

sk様

返信ありがとうございます。
確認しまsたが、フィールドは存在します

4
しん 2024/08/21 (水) 12:05:16 051ad@9fff4

こんな感じで、フィールドは存在します

3
しん 2024/08/21 (水) 12:02:59 051ad@9fff4

hatena様

同様に全てにおいて、パラメータクエリの表示がされます。
フィールドは、Q_直近3ケ月 のコピーには、すべてあります

2

        FROM
            [Q_直近3ケ月 のコピー]

[Q_直近3ケ月 のコピー]が選択クエリであるならば、
とりあえずそのクエリのデザイン( SQL )を
再度確認されることをお奨めします。

1

パラメータダイアログが出るということは、FROM句のテーブルやクエリにその名前のフィールドがないとういことになります。

()や半角空白を含むフィールド名は[]でくくらないと認識できないので、前者のSQLがエラーになるのは当然ですが、後者のSQLでもパラメータが出るということは、[Q_直近3ケ月 のコピー] にその名前のフィールド名がないということになります。[Q_直近3ケ月 のコピー] のフィールド名とSQL内のフィールド名に相違がないのは確実ですか。

下記のサブクエリのSQLのみ実行した場合はどうなりますか。

        SELECT 
            [ID],
            [親番], 
            [売上先],
            [子番], 
            [支店_営業所],
            [孫番], 
            [現場名],
            [府県],
            [締日],
            [油種],
            [直近3ヶ月], 
            [仕入],
            [売上],
            [利益],
            [仕入コード],
            [仕入先],
            [単価_ランク_コード],
            [単価_ランク],
            [開始(復活)],
            [終了],
            [備考1],
            [備考2],
            [担当],
            [車番①],
            [車番②],
            [車番③],
            [車番④],
            [車番⑤],
            [車番⑥],
            [車番⑦],
            [車番⑧],
            [車番⑨],
            [売上先カナ],
            [支店_営業所カナ],
            [現場名カナ],
            [フラグ],
            [日付コード],
            [油種コード],
            [合成キー],
            [納入先業者名カナ],
            [親グループカナ],
            [締め日],
            [数量料],
            [更新用フラグ],
            [更新合成キー],
            IIf([直近3ヶ月] = DateAdd('m', -2, DateSerial(Year(Date()), Month(Date()), 1)), 1, 
            IIf([直近3ヶ月] = DateAdd('m', -1, DateSerial(Year(Date()), Month(Date()), 1)), 2, 
            IIf([直近3ヶ月] = DateSerial(Year(Date()), Month(Date()), 1), 3, 4))) AS [並べ順]
        FROM 
            [Q_直近3ケ月 のコピー]