SELECT
ID,
Max(Choose([tblA].[SEQ],[A1],[A2],[A3])) AS Max_A,
Max(Choose([tblB].[SEQ],[B1],[B2],[B3])) AS Max_B
FROM
テーブル名,
tblSeq AS tblA,
tblSeq AS tblB
WHERE
Abs(Choose([tblA].[SEQ],[A1],[A2],[A3])-Choose([tblB].[SEQ],[B1],[B2],[B3]))<=100
GROUP BY
ID;
Private Sub プレビュー_Click()
Dim strFilter As String
If Not IsNull(Me.年度検索) And Not IsNull(Me.年度検索2) Then
MsgBox "[指定年度]と[除く年度]を両方入力することはできません!"
Exit Sub
End If
If Not IsNull(Me.年度検索) Then
strFilter = strFilter & " AND 年度=" & Me.年度検索
End If
If Not IsNull(Me.月検索) Then
strFilter = strFilter & " AND 月=" & Me.月検索
End If
If Not IsNull(Me.年度検索2) Then
strFilter = strFilter & " AND 年度<>" & Me.年度検索2
End If
strFilter = Mid(strFilter, 6) '先頭の" AND"を削除
If DCount("*", "年度登録", strFilter) = 0 Then
MsgBox "該当するレコードはありません。"
Else
DoCmd.OpenReport "レポート名", acViewPreview, , strFilter
End If
End Sub
ありがとうございました。早速今日、実装予定です。
ところでこういったコントロールソースやクエリデザインで使う式なども
汎用関数を作って対応することはできますでしょうか?
もし使えるという場合、逆に使えない場所があれば教えてください。
前のスレッド、いま見直してみたら、ちょっと間違ってますね。
メインフォームの更新前処理で最新日を更新してますが、サブフォームで更新してもメインフォームの更新前処理は発生しないので、サブフォームの更新後処理でメインフォームの最新日を更新すべきですね。
メインフォームの更新前処理のイベントプロシージャを削除して、サブフォームの更新後処理に下記のコードを記述してください。
よくわかりました。活用させていただきます。
戻るレコード数はサブフォームに表示されている行数にしてください。
なるほど、それがシンプルでいいですね。
単票フォームならいいですが、帳票フォームだとカレント行以外にも影響を与えるので、それを考慮すると難しい。条件付き書式で文字色を白(背景色と同じ)にすることになるかな。下記の応用で。
カレント行の背景色の変更 - hatena chips
フォーカスのあるテキストボックスは背景スタイルの「透明」が無効になるので「名前」テキストボックスを最前面へ移動して背景スタイルを「透明」にしてあげればVBAはいらないかなと
1文字でも入力したら~を実現しようと思ったらEnterでNullなら幅0、文字入力orExitで幅を戻すとかする感じですかねぇ。労力に見合った感じはしないですね
1文字でも入力したらというのは難しいですが、薄く表示させておいてフォーカスが来たら消えるという仕様なら下記の方法で可能です。
「名前」テキストボックスの上に重なるようにテキストボックスを配置して下記のように設定します。
=IIf([名前]<>"","","名前")
フォーカス取得時のイベントプロシージャを下記のように記述します。
以上です。
kitasue様
ご回答ありがとうございます。
上記内容で運用できそうです!
ありがとうございました。
ありがとうございました。フッターを使ったことがなかったので、参考になりました!カレンダーも別の場所で使用したいと思います。
「折りたたんで表示」というのがどのようなものなのかよく分からないですが、
ボタンをクリックすると高さが拡張して全体が表示されるというイメージでしょうか。
だとするほぼ不可能だと思います。
自分がするのは、備考フィールドだけフッターに配置して最初から高さを高くしておくことぐらいですね。
あとは別フォームに表示させるぐらいかな。
カレンダーダイアログ日付入力関数の改良版 - hatena chips
上記では帳票フォームの日付テキストボックスのすぐ下にカレンダーフォームを表示させるというテクニックを使ってますが、これを応用して、備考テキストボックスのすぐ下にテキストボックスをもつフォームを表示させるということはできると思います。
WinAPIを使ってますのでお手軽ではないですが。
エラー出力ではなく、Null出力でよろしければ、先程のSQL文をクエリ「Q1」として登録して
で、いかがでしょうか。
フィルタ用のテキストボックス、コンボボックスが空白の時の処理を考える必要があります
VBAの場合、
この形で「そもそもフィルタリングしない」を選べますが、クエリデザインの場合「必ず何かしらの抽出条件を設定する」ことになるため任意のフィールドでフィルタリングするようなのはひと手間必要です
■コンボボックスが片方空っぽでも(魔法使いの開発工房さん)
または、Nullを許可しないフィールド限定になりますが
というような方法もあります
そもそもNullを抽出したい場合には
Is Null
と指定する必要がある。なんかもVBAなら柔軟に処理できるメリットがありますね慣れの問題なのでどちらが楽かとは一概に言えないですが、余計な処理をしない点でVBAのほうがより良いものです
ごめんなさい。エラーは返さずオミットしてしまいますが、以下でどうでしょうか。
テーブル「tblSeq」を追加します。フィールドは、「SEQ」一つで内容は、
SEQ
1
2
3
の3レコードです、その上で、
のSQLで行内のAの最大値とBの最大値を出力します。
詳しく教えていただき、ありがとうございます!
じっくり確認させていただき、不明点があった場合は改めて質問させていただきます。
③の質問については、hatena様のVBAで作成できますよね…大変失礼いたしました。VBAで実行可能なことは承知の上で、1個質問です。
クエリデザインで作成することは可能でしょうか?不可能であれば諦めがつくので教えていただけると幸いです。可能だとすると、コンボボックスに工夫が必要になりますでしょうか。だとすると、VBAのほうが楽でしょうか。
※帳票スタイルのリストに対して、フィールドごとにコンボボックスがあり、複数の絞り込み条件を重ねる際、クエリデザインで設計できるか?という質問です。わかりづらくてスミマセン
kitasue様、
御返事ありがとうございます。一例で入力したため、数値を良く確認しておりませんでした。
100以下にならない場合はエラーを返してほしいなと…
エクセルでやれと言われそうですが何卒宜しくお願い致します。
ID=3では、差が100以下にならないのでは。
イメージしてるものに齟齬があるような気がしないでもないですが
hatenaさんのブログのサンプルを例にとるならば
="社員コード"&IIf([txt社員コード]<>"","▼","▽")
や
="フリガナ"&IIf([txtフリガナ]<>"","▼","▽")
みたいな感じです。フィルタをかけているフィールド(列)は「▽」が「▼」になって区別できるという仕組みです
フォーカス取得時はEnterですねGotFocusでもほぼ変わらないのでどちらでもいいですが
ちょっと質問の内容が理解できていません。フィルタの仕組み自体はhatenaさんのブログにあるような、フィールド(列)毎にフィルタ用のテキストボックス(またはコンボボックス)を用意するというだけのものです
この方法の問題点
フォーカスのあるコントロールは最前面に表示されるという仕様を使っているので期間指定(min、maxでテキストボックスを2つ用意したい)みたいなのはどうしたもんかとなります
▽(▼)について
上で軽く触れましたが、フィルタの内容を入力するテキストボックス(コンボボックス)は基本的にフィールド(列)のラベルに隠れた状態になるのでフィルタを適用しているフィールド(列)がどこなのかぱっと見でわかるようにするためのものです。この部分だけ独立させるとサイズやフォントを変えたり右端に寄せたりしてもう少しExcelっぽくできそうな気もします
条件付き書式を使ってみるという手もあるかもしれません
VBAの実装について
フィールド(列)のラベルとして使うコントロールを例えば「列ラベル_txt社員コード」のようにしたとすると
のようになりますが、コントロール数分記述するのは手間だしVBAコードが見づらくなります。フィルタの内容を入力するコントロールを例えばすべて「フィルタ_○○」のように統一して
のような関数を作るとフォーカス取得時イベントに[イベントプロシージャ]を指定してコードを記述する代わりに
=setFocusFilterControl()
を設定するだけで済むのでいろいろはかどります2種類、検索をヘッダーに作りたいページがあり、1つはhatena様に教えていただいた方法、もう1つはコンボボックスが多いのでhiroton様に教えていただいた方法を使わせていただくことにしました!
そこで質問です。
①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、
フィルタ用の部分は何を指定するイメージでしょうか。
わからず…スミマセン。
②「フォーカス取得時にフィルタ用にSetFocus」という意図は
下記ですよね。
'''Private Sub txt検索_GotFocus()
Me.cbo検索.SetFocus
End Sub
'''
③絞り込みは重ねていくことはできますでしょうか。
色々聞いてスミマセン。宜しくお願いいたします。
Accessではたいていのことはクエリのデザインビューでできますが、サブクエリとかユニオンクエリなどを使えるようになるにはSQLの理解は必要ですね。
ありがとうございます!やってみてうまくいかなかったらまた質問させていただきます。
ところで、こういったことをきちんと理解するにはSQLの勉強をすべきなのでしょうか…
そうだったんですね!とても助かりました。ありがとうございます。
メイン/サブフォーム形式のフォームをデータシート表示させれば、サブフォームはサブデータシート表示になります。
サブフォームのテキストボックスのダブルクリック時で該当フォームを開くようにすれば、データシート表示したときも反応します。。
ありがとうございます。リンクさせたいならデータシートではなくて、テキストボックスを配置するしかないということですよね。
データシートにボタンを置くことはできません。
テキストボックスのダブルクリック時のイベントプロシージャでOpenFormメソッドでフォームを開くことになるでしょう。
連絡遅れました。
指摘していただいた箇所が、全部間違っていました。
正しく、計算してくれるようになりました。
ありがとうございました。
下記の記事が参考になると思います。
サブフォームのフィールドを対象にメインフォームにフィルタをかける - hatena chips
上記はメインフォームのFilterに抽出条件を設定していますが、今回はOpenFormメソッドの第4引数に抽出条件を設定すればいいだけです。
上記を読んでも、どうしたらいいか分からない場合は、
メインフォームのレコードソースのテーブル名(orクエリ名)と、それの主キーと主なフィールド名、
サブフォームのレコードソースのテーブル名(prクエリ名)と、それの主キーと主なフィールド名、
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定を教えてください。
1つずつ、まったく同じクエリをもう1つ作ったところテキストが切れずに表示させることができました。
色々とこの方法を応用して使えそうです!ありがとうございました。
kitasue 様
ご回答いただき誠にありがとうございます。
コードを使用させて頂きましたところ、
▲後の複数ワードで除外検索が出来ました。
ご親切に教えていただき、本当にありがとうございます。
教えて頂いたコード、勉強させて頂きます
本物のボタンを被せてしまうのが簡単だとおもいます
ボタンの透明プロパティを「はい」にすると、見えないボタンが配置できます
式の後にAS句をつなげてフィールド名を記述するのですか
試してみます。
InStr(~)=""と使っていました。
比較なので、>0 =0なのですね。
ありがとうございます。
単純なことだったんですね…スミマセン。ありがとうございました!
あっ、間違ってますね。ご指摘ありがとうございます。
回答を修正しておきます。
早々にご回答頂きまして、ありがとうございます。
早速試してみたところ、思うように作動致しました。
今度は、文字列での絞り込みもトライしてみようと思います。
3行目の
If Not IsNull(Me.年度検索) And Not IsNull(Me.年度検索) Then
の二つ目の Me.年度検索を Me.年度検索2 に変更しました。
本当にありがとうございました。
レポートのレコードソースには、"年度登録"テーブルを設定します。
コマンドボタン「プレビュー」を配置します。このボタンのクリック時のイベントプロシージャを下記のように記述します。
OpenReportの第4引数に抽出条件を設定できます。
ご回答頂き、ありがとうございます。
入力1カ所と入力2か所で、条件として矛盾するところは選択しない。と、いうのが希望なのですが、
はじめたばかりで、変な事をおたずねしているような質問で申し訳ありません。
検索フォームの作成というところで、VBAでFilterをかける方法が記載されているのを何度か閲覧致しましたが、レポートに出力するにはこの方法しかない!と思いこんでおりまして、クエリで、フォームのテキストボックスの値を参照してレポートに出力という方法しか行っていませんでした。
VBAでFilterをかける方法を勉強したいです。
どうぞよろしくお願いいたします。
クエリを新規作成して「Qピックアップ」を追加して、更新クエリにすれば「Qピックアップ」で絞り込まれたレコードが対象になります。
「Qピックアップ」で条件を変更すれば、上記の更新クエリにも反映されます。
いろいろな場合が考えられますので、それぞれの場合でどのようにしたいのか具体的に説明してください。
入力一か所
指定年度検索: 入力
月検索: 未入力
除く年度検索: 未入力
指定年度検索: 未入力
月検索: 入力
除く年度検索: 未入力
指定年度検索: 未入力
月検索: 未入力
除く年度検索: 入力
指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力
入力二か所
指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力
指定年度検索: 未入力
月検索: 入力
除く年度検索: 入力
指定年度検索: 入力
月検索: 未入力
除く年度検索: 入力
※これは条件として矛盾
すべて入力
指定年度検索: 入力
月検索: 入力
除く年度検索: 入力
※これは条件として矛盾
このすべてに対応しようとするとクエリではかなり式が複雑になりメンテナンス性が悪いです。
VBAでFilterをかける方法の方がシンプルにできますが、VBAの使用は可能ですか。
ご回答頂き、ありがとうございます。
自分でも変な書き方だと思いました。
月だけを指定して検索すると、複数の年度が表示されるため 除く年度 で指定した年度を除いたものを表示したいです。
ただ、年度指定の検索項目も有効に残しておきたいし・・・・、同じくクエリ内で、一致検索とNot検索ができないのかなぁ・・・などと簡単に考えていました。
変な質問で申し訳ありません。
ACCESSはデータベースソフトです。「行数が変わる=データの件数が変わる」のは普通ですが、「列数が変わる=データの構造が変わる」のは基本、想定しません。
正規化をキーワードに調べてみてください。
正規化自体はただの考え方なのでExcelで実装でもACCESSで実装でも変わりません。正規化されたデータの処理ならACCESSのほうが得意です。
ACCESSにデータの取り込みが必要ならそれは正規化が必要で、ACCESSで組んだほうが楽(正規化しつつデータ取込できる)です。
また、データベースというのはデータ自体の順番を重視しません。都度、データの中身を使って並び順を指定します。そのため、データ取込の前にExcelで並び替えをしてもあまり意味がありません。(ACCESSに取り込んだらACCESSでの設定も必要)
ただ、たとえば純粋な記録順というのが欲しい場合、Excelで「並び順」列を用意して連番にして記録しておくというようなことはあるかもしれません。(この場合は記録日時列を作ってタイムスタンプを取るという形のほうがそれっぽいですが)