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
[▲]区切りで、複数の(not条件)除外検索
If Not IsNull(Me.txtWord4) Then
strFilter = strFilter & " AND " & BuildCriteria("職名", dbText, _
"*" & Replace(StrConv(Me.txtWord4, vbWide), "▲", "* And Not *") & "*")
End If
ありがとうございます!やってみてうまくいかなかったらまた質問させていただきます。
ところで、こういったことをきちんと理解するには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で「並び順」列を用意して連番にして記録しておくというようなことはあるかもしれません。(この場合は記録日時列を作ってタイムスタンプを取るという形のほうがそれっぽいですが)
管理番号の中にCSDという文字が含まれていなかったらどうしたい?がないと回答も中途半端にしかできないですが
InStr 関数
基本、InStr()は結果が数値です
InStr(~)=""
という比較はしません。やるなら「0」と比較して次の形ですIIf(InStr(~)>0,あるとき(,ないとき))
IIf(InStr(~)=0,ないとき(,あるとき))
「
価格 = Int(価格 - (220 * 0.088 + 100) * 0.95 / 0.934+0.5)
」と「価格 = Int(価格 - (220 * 0.088) * 0.95 / 0.934+0.5)
」はどちらも(左辺)=(右辺)
の形になっています。比較の式なので結果は
True
かFalse
ですね。たぶん、フィールド名を「価格」としたいのだと思いますが、この場合は(式) AS 価格
のように、式の後にAS句をつなげてフィールド名を記述します
Likeで指定年度を検索して、除く年度を除外すること自体が矛盾してるのでは?
もしかしてやりたいことは、指定年度から除く年月を除外したいのでしょうか?
Cd = "管理番号,Int((価格 - IIf(管理番号 = 'csd-',19.36,119.36) 0.95) / 0.934)
と変更して、その場しのぎはできたのですが、
非常に汎用性が低いので、
正しい処理の仕方を、ご教授できたらと思います。
でいかがでしょうか。
kitasue 様
度々のレス失礼します。
別枠で新たに除外検索用に、
txtWord4というテキストボックスを用意し、
除外ワードだけを複数指定するという事は実現できました。
レス2番のように1つのテキストボックスで、
複数の除外ワードを指定する事が、
実現可能でしたらお知恵をお借り出来ましたらありがたいです。
よろしくお願いします。
kitasue 様
回答いただき誠にありがとうございます。
コードを使用させて頂きましたところ、
▲後のワードで除外検索が出来ました。
<質問>
大変恐縮ですが追加で質問させていただきます。
下記のように除外ワードを複数指定し検索は可能でしょうか?
(読点[、]でor条件、句点[。]and条件では、
複数ワードを指定出来たのですが、除外検索では難しいでしょうか?)
職名というレコードに
チーフ
SPチーフ
ADチーフ
というレコードがあったとして、
検索語句例:チーフ▲SP▲AD
→職名でチーフ が含まれるレコードのうちで、SP と AD を除いたレコードが検索表示される
※現在のコードで、上記の検索をすると下記のようなエラーmsgが出ました。
「実行時エラー'2435'
指定した式の閉じかっこが多すぎます。」
もし良い案がありましたら、教えて頂けましたら幸いです。
セキュリティが最優先事項ならACCESSはNGじゃないですかね
テーブルデータを保護する(hatena chipsさん)
ACCESSパスワード強制解除とかで検索するとそれなりに情報出てくるし
ある程度妥協できるなら
1.上記リンクのとおり、SharePointとのリンク部分はパスワード付きのACCESSファイルで制限、実行ファイルはパスワード埋め込みつつACCDEファイルにして参照情報閲覧不可
2.VBAでレコードセットを動的に生成&VBAをパスワードで保護( VBAのモジュールにパスワードを設定するには?(T'sWareさん))
3.SharePointにODBC接続できるドライバを用意して実行ファイルに接続情報を埋め込みつつACCDEファイル化する(サードパーティ製のドライバが必要っぽい)
※かるくWebを漁ってみた(試してない)結果なのでご了承を
でいかがでしょう。
スミマセン。自己解決しました。
スッキリしました!教えていただき、ありがとうございました。
>デフォルトの仕様を否定するほどのメリットは感じられませんね
今まで参考にしていた本が全て(?)txtなど付けるものだったので
目から鱗が落ちました。
現在作成中のものは付けてしまったので今更変更しづらいですが、今後参考にさせていただきます
とりあえずはその認識であっています。
フォームのフィルターに指定する文字列や、定義域集計関数(DLookupとか)の条件部分はSQLのWHERE句に相当する文字列を指定することになっています。
WHERE句はその条件指定で
(フィールド名)(比較演算子)(値)
の形をとれるため、これに従ってフィールド名を要求している部分にフィールド名を記述するというわけです。で、この時に使えるフィールド名はそのSQL文が実行されるときの対象となるデータ(テーブル、クエリや、フォームのフィルタならレコードソース)のフィールド名となります。
VBAの処理で文字列が生成され、その文字列をSQLとして処理する。「SQLに関わるとき」はそんな処理をしているんだと理解できるとフィールド名の使いどころもわかると思います。
特に間違いはないですが、コントロール名とフィールド名の間に制約はないので、レコードソースの「タイトル」フィールドを参照するコントロールに「タイトル」という名前を付けることは普通にできることです。(コントロール名「タイトル」のコントロールソースに「タイトル」を指定する)
実際、既存のフィールドの追加からコントロールを追加するとデフォルトでフィールド名をコントロール名としたコントロールができるのがACCESSの仕様ですし
テーブル名はTから始めましょう、クエリ名はQから始めましょうのイメージでテキストボックスならtxt、チェックボックスならchkという話はあるのかもしれませんが、デフォルトの仕様を否定するほどのメリットは感じられませんね
ちなみに悩む、というのが
If chkタイトル = True Then ←この時はコントロール名
DoCmd.OpenForm "F_作品", , , "作品NO='" & Me!txt作品NO ←フィールド名とコントロール名
上のようなときです。
SQLに関わるときがフィールド名になるのでしょうか?
なんだか色々勘違いしていたようで…すみません。
フィールド名は大元の名前(テーブルのフィールド名) 例:「タイトル」
コントロール名はフォームでテキストボックス等につける名前 例:「txtタイトル」
ですよね?
>フィールドを参照するコントロールをフィールド名と異なるコントロール名にすることがまずないので
?認識が間違っているでしょうか…😓
フィールドとはテーブルやクエリで設定した列のことを言います。フィールド名はその各列を識別するための名前ですね。
「txtタイトル、みたいなもの」はフォーム上に設置したテキストボックスやコンボボックスにつけた名前ですよね?これらフォーム上に設置するモノのことをコントロールと言います。ですので、「txtタイトル、みたいなもの」はコントロール名です。
「コントロールソースを引用する」ということは通常しません。
掲示板でのやり取りの関係上、「txtタイトルのコントロールソースを指定してください」と回答することはありますが、往々にして質問者がコントロール名しか提示していないためフィールド名がわからずそうせざるを得ない。といった理由からです。
よく使うので覚えてしまったものもありますが、やりたいことで検索したりMicrosoft公式のドキュメントを見れば書いてあるのでその通りにやるだけです。フィールド名を指定する必要がある場所にはそう書いてあります。
そもそもの話、フィールドを参照するコントロールをフィールド名と異なるコントロール名にすることがまずないので、どうしてそんなことに・・・などと思ってしまいますが
コントロールが表示されてもいいのならテキストボックスでそれっぽく代用するとかですかね
大きいチェックボックスを作る(もう一度学ぶMS-Accessさん)
見た目に使ってるのがテキストボックスなので条件付き書式で見た目を変えられます
「見た目使用不可なのにクリックしてしまった」のは更新前処理でつかんでCancelという感じで
ただ、ボタンっぽいテキストボックスは非常に困難そうでした
参考:Yahoo知恵袋
パッと見ボタンですが、ボタン的な動作はありません。マウスを乗せるとハイパーリンク機能でマウスカーソルの形が変わるだけです
リンク先では、条件付き書式で前景色を変えていましたが、コントロールソースでも
=IIF(条件,"","標題")
とするといいのかなと思いました代案
ボタンにボタンっぽいテキストボックスを被せます
テキストボックスは条件付き書式やコントロールソースで使用不可の見た目を設定します
テキストボックスのマウスクリック時で、ボタンが使用可能であればSetFocusしつつ、WindowsAPIで再度マウス押し下げイベントを送り込みます
画面上の任意の位置をクリックするVBAコード(VBA(マクロ)で仕事を楽しく効率化さん)
テーマの使用をしたボタンは真似できないのとボタンのポイント時の強調表示ができないあたりがパッと思いつく違いです
ご回答ありがとうございました。
私の環境では、列は6.5列余分にスクロールされて
行は7行余分にスクロールされます。
どちらにしてもどうしようもないとのこと、教えていただきありがとうございました。
確認してみたところ、
縦方向だと、最後の1行(新規行かある場合はその行)だけが見えるところまでスクロールできる、
横方向だと、最後の1列だけが見える範囲までスクロールできる、
というような仕様になっていると思いますが、
これ以上にスクロールできてしまうということでしょうか。
それとも、これはスクロールしすぎと感じるということでしょうか。
どちらにしても、スクロールできる範囲を設定できるプロパティはないのでどうしようもないと思います。