Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,201 から 4,240 までを表示しています。
1
hiroton 2020/12/11 (金) 15:16:11 09202@f966d

フィルタにはSQLのWHERE句に相当する文字列を指定します
WHERE句の書き方参考:【SQL入門】WHEREで検索条件の指定方法をわかりやすく解説

組み合わせてどんなデータを表示したいのかによってANDでつないだりORでつないだり、NULLのデータで絞り込みたいのであれば[フィールド] IS NULLとする必要がある。あたりを抑えておけば最低限の記述はできるようになります

4
true_grow 2020/12/11 (金) 14:49:23 2f66f@538fa

少し加えるだけで出来てしまうのですね。ありがとうございました。
次はオプショングループに挑戦してみたいと思います。

5
hassy-hhh 2020/12/11 (金) 13:43:25 e48ae@6eb0c >> 4

ありがとうございます!!Me.Filterでできました。思っていた通りになりました!!

4
hideki 2020/12/11 (金) 13:33:45 09c37@96514

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

3

「月」コンボボックスの更新後処理のイベントプロシージャを下記のように変更すればいいでしょう。

Private Sub cb月_AfterUpdate()
    Dim BeginDay As Date
    BeginDay = DateSerial(Me.cb年, Me.cb月 - 1, 21)
    Me.Filter = "売上日>=#" & BeginDay & "# AND 売上日<#" & DateAdd("m", 1, BeginDay) & "#"
    Me.FilterOn = True
End Sub
4
hiroton 2020/12/11 (金) 13:29:13 09202@f966d

まず、それ自体を表示することが目的なら、フィルタの内容を変えてからボタンを押すまでフォームの表示内容と乖離してしまうのでワンステップ置くような仕組みはオススメしません

別な場所に値をコピーしたいという用途ならそのテキストボックスの値を取得すればいいでしょう(テキストボックスは非表示でもかまいません)

total = Me!○○フィールドの合計

フィルタの実行と同時に取得したい(しかもその処理が結構重い)とかだと、total = Me!○○フィールドの合計の処理がうまくいかないこともあるようなので、そういう時ならばDSum関数を使って第三引数でフォームのフィルタと同じ条件を指定すればいいでしょう

total = DSum("フィールド名", "テーブル名", Me.Filter)
2
true_grow 2020/12/11 (金) 13:06:08 2f66f@538fa

できましたありがとうございます。これなら年も設定できるので楽になりました。
余談で少し質問なのですが何日から何日までという設定も月の中で設定できるものなのでしょうか
1月というコンボボックスで12/21~1/20までを表示のような。

3
hassy-hhh 2020/12/11 (金) 12:32:20 bf909@6eb0c >> 1

ご教授ありがとうございます。できました。
が、この機能をボタンを押したときだけ集計するようイベントプロシージャを記述したいのですが、VBAで同じものを記述すると機能してくれません。どうすればよろしいでしょうか。

2
hassy-hhh 2020/12/11 (金) 12:22:49 bf909@6eb0c

ご教授ありがとうございます。できました。
が、この機能をボタンを押したときだけ集計するようイベントプロシージャを記述したいのですが、VBAで同じものを記述すると機能してくれません。どうすればよろしいでしょうか。

1

この手のテーブル設計は、運用実態によって最適な設計は変わりますし、絶対的にこれだと決まるものでもないし、設計者の考えかたによっても設計は千差万別になります。

まずは、現状のテーブル名、フィールド構成、主キー設定を提示してもらえますか。

1

フォームのFilterプロパティにVBAで抽出条件を設定するようにすればいいでしょう。

UIとしてはコマンドボタンより、コンボボックスで月を選択するようにするか、オプショングループ内にオプションボタンかトグルボタンを配置する設計にした方かいいでしょう。

まずは、コンボボックスの方が簡単なのでコンボボックスで作成してみて、うまくいったら、オプショングループに挑戦するのがいいでしょう。

まずはコンボボックスの方法を提示しておきます。

月間請求書履歴が帳票フォームとして、レコードソースに「売上日」という日付/時刻型のフィールドがあると仮定します。

「年」選択用のコンボボックスと「月」選択用のコンボボックスを配置します。

「年」コンボボックスを下記のように設定します。
名前 cb年
既定値 =Year(Date())
値集合タイプ 値リスト
値集合ソース 2018;2019;2020;2021;2022

「月」コンボボックスを下記のように設定します。
名前 cb月
既定値 =Month(Date())
値集合タイプ 値リスト
値集合ソース 1;2;3;4;5;6;7;8;9;10;11;12

「月」コンボボックスの更新後処理のイベントプロシージャに下記のように記述します。

Private Sub cb月_AfterUpdate()
    Dim BeginDay As Date
    BeginDay = DateSerial(Me.cb年, Me.cb月, 1)
    Me.Filter = "売上日>=#" & BeginDay & "# AND 売上日<#" & DateAdd("m", 1, BeginDay) & "#"
    Me.FilterOn = True
End Sub

「年」コンボボックスの更新後処理とフォームの読み込み時のイベントプロシージャを下記のように記述します。

Private Sub cb年_AfterUpdate()
    Call cb月_AfterUpdate
End Sub

Private Sub Form_Load()
    Call cb月_AfterUpdate
End Sub

以上です。

1
hiroton 2020/12/11 (金) 09:11:13 09202@f966d

単にテキストボックスのコントロールソース=Sum([フィールド名])とすればフォームのフィルターに合わせて自動で計算できますよ

2
hassy-hhh 2020/12/11 (金) 08:47:59 e48ae@6eb0c

ありがとうございます。勉強になりました。参考にさせていただきます。

1

現状はどこまでできていますか。
テーブルは作成しましたか。

それとも、まったく手付かずですか。

3

下記のSQLで組毎の標準偏差と平均を取得できます。

SELECT 組, StDevp(点数) AS 標準偏差, Avg(点数) As 平均
FROM MT_テスト
GROUP BY 組;

これを Q_標準偏差_平均 と名前を付けて保存します。

次にこのクエリとテーブルを使って下記のSQLで偏差値が求められます。

SELECT MT_テスト.*, 標準偏差, Round(([点数]-[平均])*10/[標準偏差]+50,1) AS 偏差値
FROM MT_テスト INNER JOIN Q_標準偏差_平均 ON MT_テスト.組 = Q_標準偏差_平均.組;
3

①上記の条件でもウィンドウが画面いっぱいに広がって、フォームのサイズをマウスで変更できないフォームがある。

フォームが最大化されているということではないですか。
それかデザインビューでのフォームの幅と高さが画面サイズより大きいとか。

②上記の条件だと詳細フォームを閉じたとき、リストフォームに情報が反映されないで困るフォームがある。

「作業ウィンドウ固定」「ポップアップ」の設定が関係するとは思えないのですが。
具体的にどのように反映させようとしているのですか。
具体的に説明してください。

2
hideki 2020/12/10 (木) 22:39:12 09c37@96514

返信遅れて申し訳ありません。

テーブル名
MT_テスト
主キー ID オートナンバー型
組 短いテキスト
名前 短いテキスト
点数 数値型
標準偏差 数値型
偏差値 数値型

何卒宜しくお願い致します。

2
オリガミ 2020/12/10 (木) 20:43:56 0029a@1c915

ポップアップをはい、作業ウィンドウ固定をはいにしていたのですが、2つ問題が発生しました。
①上記の条件でもウィンドウが画面いっぱいに広がって、フォームのサイズをマウスで変更できないフォームがある。
②上記の条件だと詳細フォームを閉じたとき、リストフォームに情報が反映されないで困るフォームがある。
以上、対応策があればご教授お願いいたします。

1

現状のテーブルの名前、フィールド構成、主キー設定を提示してください。

1

フォームのレコードソースはクエリですか。
クエリなら、そのクエリを開いてそこで更新はできますか。

あとは「最適化と修復」を実行してみて改善しませんか。

10
トマト 2020/12/08 (火) 16:18:35 0029a@1c915 >> 9

SQLをご確認いただき、ありがとうございました。大変お手数をおかけいたしました。
デバッグはまだ行っていないのですが、とりあえずは、サブフォームのヘッダーに更新ボタンを置いて対応することにしました。

9

SQL文を拝見しましたが、特に問題はなさそうです。
こうなると、デバッグ作業をすることになりますが、実ファイルのないこちらでは無理です。
下記のリンク先を参考にステップ実行によるデバッグ作業を行ってください。

最も基本的なステップ実行 - Excel VBA

8
トマト 2020/12/07 (月) 13:27:15 0029a@1c915

テーブルにしてみたところ、リンクが切れている部分についてのエラーは出ましたが、それ以外のエラーは出ませんでした。SQL文ですが、そのまま掲載するのもちょっとあれなので、お送りさせていただきますね。ありがとうございます。

1
hatena 2020/12/07 (月) 13:05:05 修正

クエリのデザインビューで下記のように設定してください。

フィールド:生死[Forms]![F_検索]![tgl_生死]
抽出条件:[Forms]![F_検索]![tgl_生死]
または:False

あるいは、

フィールド生死
抽出条件IIf([Forms]![F_検索]![tgl_生死]=True,Yes,[生死])

前者は[tgl_生死]が押されてないときに、
「生死」がNullのレコードが、前者は表示されますが、後者は表示されません。

7

エラーメッセージから推測すると、サブフォームのレコードソースのクエリに問題があるように思えます。

サブフォームのレコードソースをクエリではなくテーブルにしたらどうなりますか。
それでエラーが出ないなら、クエリに問題があるということになります。
その場合は、現状のクエリのSQL文を提示してください。

2
nokonoko 2020/12/07 (月) 09:42:04 653a6@54883

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

6
トマト 2020/12/07 (月) 08:53:30 修正 0029a@1c915

ありがとうございます。再確認しました。サブフォームコントロール名で間違いありません。サブコントロール名とサブフォームコントロール名が同じものに設定されていたので、試しにさぼフォームコントロール名を変更して試してみましたが、エラー発生状況は同じでした。
おっしゃるとおり、デバックボタンを押すと該当の行が反転される状況です。

7
hatena 2020/12/06 (日) 13:04:55 修正

ダイアログだと閉じるときrequeryになるということでしょうか?

はい、その通りです。
Windowmode:=acDialog を指定して(ダイアログモードで)開くと、開いたフォームを閉じるまで次のコードに進みません。
閉じた後に次のコードが実行されます。

5

「実行時エラー2471 クエリパラメーターとして指定した式でエラー'年月日'が発生しました」というエラーが出たときに、デバッグボタンをクリックするとその行が反転表示されるのですか。

念のために確認ですが、上記の「Fサブ管理」というのはサブフォームコントロール名ですか。
サブフォーム名サブフォームコントロール名は別物です。

サブフォームとサブフォームコントロールの違いとは? - hatena chips

8

ご教示ありがとうございます。今回の件は、メインのパソコンから手動で操作します。システム移管中でして少しの間だけの対処法でしたので。また、宜しくお願い致します。

4
トマト 2020/12/05 (土) 22:26:12 0029a@1c915

ご確認ありがとうございます。
エラーが出るコードはここになります。

Private Sub 更新ボタン_Click()
    Me.Fサブ管理.Form.Form_AfterUpdate '←←ここです。
End Sub
6
セロハン 2020/12/05 (土) 20:21:35 f1ed8@5dbd2 >> 5

ありがとうございます。そこまで考えが及びませんでした。
スミマセン、F管理を閉じるとき、F管理総合をrequeryしないといけないと思っていたのですが、教えていただいた内容だとF管理を開くときにrequeryしているようです。
ダイアログだと閉じるときrequeryになるということでしょうか?

5

Forms!F管理総合 と 他フォームが同時に開いていることがないということが保障されていればいいですが、
もし、同時に開いていて、他フォームから「F管理」を呼び出したとき、意図しない動作になる恐れがあります。

現状、同時に開くことがなくても、将来、機能を追加したり、仕様変更でそうならないとも限りません。

自分がするなら、「F管理」をダイアログモードで開いて、「F管理総合」の方で自身を再クエリするという方法を使いますね。

「F管理総合」のモジュール

DoCmd.OpenForm "F管理", Windowmode:=acDialog
Me.Requery

「F管理」のモジュール

Private Sub Form_Close()
  Me.Refresh
End Sub

ご参考までに。

3

そのエラーがでるコードはどこですか。

4
セロハン 2020/12/05 (土) 10:33:41 0029a@1c915 >> 3

On Error Resume Nextを使えばいいですね。解決しました。

2
トマト 2020/12/05 (土) 09:24:09 0029a@1c915

ありがとうございます。大変参考になりました。
しかし、今回のコードのせいかエラーが出ます。
「実行時エラー2471 クエリパラメーターとして指定した式でエラー'年月日'が発生しました」
エラーを発生させない方法はありますでしょうか。

サブフォーム内のコード

Public Sub Form_AfterUpdate()

    Me.Requery

    Dim maxDate
    maxDate = DMax("年月日", "T管理", "管理ID=" & Me!txt管理ID)    
    
    If Me.Parent!年月日new = maxDate Then
    Else
       Me.Parent!new = maxDate
    End If
End Sub
1

サブフォームのモジュールの

Private Sub Form_AfterUpdate()

PrivatePublic に修正

Public Sub Form_AfterUpdate()

メインフォームのコマンドボタンのクリック時を下記のように記述

Private Sub 更新ボタン_Click()
    Me.サブフォームコントロール名.Form.Form_AfterUpdate
End Sub
1

リボンの[ファイル]→[オプション]クリックで[Accessのオプション]ダイアログが開く。
[クライアントの設定]→[フィールド移動の動作]で
[フィールドの先頭に移動]または[フィールドの最後に移動]を選択すればいいでしょう。

画像1

2
トマト 2020/12/04 (金) 18:46:00 0029a@1c915 >> 1

なるほど!背面に置く発想がありませんでした。また、わかりやすいように背景色を統一するのも参考にさせていただきます。教えていただき感謝です。

1

Djoin("従業員名","T_従業員","部署ID=" & Nz([T_従業員]![部署ID],-1))

でどうでしょうか。-1 は存在しないIDならなんでもいいです。