Microsoft Access 掲示板

6,622 件中 4,961 から 5,000 までを表示しています。
4
シソンヌ 2020/10/09 (金) 07:53:51 0029a@1c915

ありがとうございました。早速今日、実装予定です。
ところでこういったコントロールソースやクエリデザインで使う式なども
汎用関数を作って対応することはできますでしょうか?
もし使えるという場合、逆に使えない場所があれば教えてください。

1

前のスレッド、いま見直してみたら、ちょっと間違ってますね。
メインフォームの更新前処理で最新日を更新してますが、サブフォームで更新してもメインフォームの更新前処理は発生しないので、サブフォームの更新後処理でメインフォームの最新日を更新すべきですね。

メインフォームの更新前処理のイベントプロシージャを削除して、サブフォームの更新後処理に下記のコードを記述してください。

Private Sub Form_AfterUpdate()
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub
2
nokonoko 2020/10/08 (木) 11:37:35 653a6@54883

よくわかりました。活用させていただきます。

1
    Me.sbfDisplayData.SetFocus
    DoCmd.GoToRecord , , acLast
    DoCmd.GoToRecord , , acPrevious, 5 '5つ戻る
    DoCmd.GoToRecord , , acLast

戻るレコード数はサブフォームに表示されている行数にしてください。

3

名前」テキストボックスを最前面へ移動して背景スタイルを「透明」

なるほど、それがシンプルでいいですね。


1文字でも入力したら~

単票フォームならいいですが、帳票フォームだとカレント行以外にも影響を与えるので、それを考慮すると難しい。条件付き書式で文字色を白(背景色と同じ)にすることになるかな。下記の応用で。

カレント行の背景色の変更 - hatena chips

2
hiroton 2020/10/07 (水) 17:19:32 31f4f@f966d >> 1

フォーカスのあるテキストボックスは背景スタイルの「透明」が無効になるので「名前」テキストボックスを最前面へ移動して背景スタイルを「透明」にしてあげればVBAはいらないかなと


1文字でも入力したら~を実現しようと思ったらEnterでNullなら幅0、文字入力orExitで幅を戻すとかする感じですかねぇ。労力に見合った感じはしないですね

1

1文字でも入力したらというのは難しいですが、薄く表示させておいてフォーカスが来たら消えるという仕様なら下記の方法で可能です。

「名前」テキストボックスの上に重なるようにテキストボックスを配置して下記のように設定します。

プロパティ設定値
コントロールソース=IIf([名前]<>"","","名前")
背景スタイル透明
境界線スタイル透明
前景色灰色
タブストップいいえ
名前ph名前

フォーカス取得時のイベントプロシージャを下記のように記述します。

Private Sub ph名前_Enter()
    Me.名前.SetFocus
End Sub

以上です。

5
白絹 2020/10/07 (水) 12:23:44 89e3f@3f393

kitasue様
ご回答ありがとうございます。
上記内容で運用できそうです!

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

2
シソンヌ 2020/10/07 (水) 10:06:55 0029a@1c915

ありがとうございました。フッターを使ったことがなかったので、参考になりました!カレンダーも別の場所で使用したいと思います。

1

「折りたたんで表示」というのがどのようなものなのかよく分からないですが、
ボタンをクリックすると高さが拡張して全体が表示されるというイメージでしょうか。
だとするほぼ不可能だと思います。

自分がするのは、備考フィールドだけフッターに配置して最初から高さを高くしておくことぐらいですね。
あとは別フォームに表示させるぐらいかな。

カレンダーダイアログ日付入力関数の改良版 - hatena chips
上記では帳票フォームの日付テキストボックスのすぐ下にカレンダーフォームを表示させるというテクニックを使ってますが、これを応用して、備考テキストボックスのすぐ下にテキストボックスをもつフォームを表示させるということはできると思います。
WinAPIを使ってますのでお手軽ではないですが。

4
kitasue 2020/10/06 (火) 13:27:09 d057a@e9d43

エラー出力ではなく、Null出力でよろしければ、先程のSQL文をクエリ「Q1」として登録して

SELECT
	テーブル名.ID,
	Max_A,
	Max_B
FROM
	テーブル名
LEFT JOIN
	Q1
ON
	テーブル名.ID = Q1.ID;

で、いかがでしょうか。

11
hiroton 2020/10/06 (火) 10:33:04 589a0@f966d >> 3

フィルタ用のテキストボックス、コンボボックスが空白の時の処理を考える必要があります
VBAの場合、

If Not IsNull(Me!txt社員コード) Then
    strFilter = " AND 社員コード='" & Me!txt社員コード & "'"
'Else
'//なにもしない
End If

この形で「そもそもフィルタリングしない」を選べますが、クエリデザインの場合「必ず何かしらの抽出条件を設定する」ことになるため任意のフィールドでフィルタリングするようなのはひと手間必要です

■コンボボックスが片方空っぽでも(魔法使いの開発工房さん)

または、Nullを許可しないフィールド限定になりますが

ex)
フィールド:社員コード
抽出条件:Nz([forms]![フォーム名]![txt社員コード],[社員コード])

というような方法もあります
そもそもNullを抽出したい場合にはIs Nullと指定する必要がある。なんかもVBAなら柔軟に処理できるメリットがありますね


慣れの問題なのでどちらが楽かとは一概に言えないですが、余計な処理をしない点でVBAのほうがより良いものです

3
kitasue 2020/10/06 (火) 09:20:54 d057a@e9d43

ごめんなさい。エラーは返さずオミットしてしまいますが、以下でどうでしょうか。
テーブル「tblSeq」を追加します。フィールドは、「SEQ」一つで内容は、

SEQ

1
2
3
の3レコードです、その上で、

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;

のSQLで行内のAの最大値とBの最大値を出力します。

10
セロハン 2020/10/06 (火) 09:08:34 0029a@1c915 >> 9

詳しく教えていただき、ありがとうございます!
じっくり確認させていただき、不明点があった場合は改めて質問させていただきます。
③の質問については、hatena様のVBAで作成できますよね…大変失礼いたしました。VBAで実行可能なことは承知の上で、1個質問です。
クエリデザインで作成することは可能でしょうか?不可能であれば諦めがつくので教えていただけると幸いです。可能だとすると、コンボボックスに工夫が必要になりますでしょうか。だとすると、VBAのほうが楽でしょうか。
※帳票スタイルのリストに対して、フィールドごとにコンボボックスがあり、複数の絞り込み条件を重ねる際、クエリデザインで設計できるか?という質問です。わかりづらくてスミマセン

2

kitasue様、
御返事ありがとうございます。一例で入力したため、数値を良く確認しておりませんでした。
100以下にならない場合はエラーを返してほしいなと…
エクセルでやれと言われそうですが何卒宜しくお願い致します。

1
kitasue 2020/10/05 (月) 16:30:13 d057a@e9d43

ID=3では、差が100以下にならないのでは。

9
hiroton 2020/10/04 (日) 22:57:03 4e4b1@358c8 >> 3

イメージしてるものに齟齬があるような気がしないでもないですが

①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、

hatenaさんのブログのサンプルを例にとるならば
="社員コード"&IIf([txt社員コード]<>"","▼","▽")

="フリガナ"&IIf([txtフリガナ]<>"","▼","▽")
みたいな感じです。フィルタをかけているフィールド(列)は「▽」が「▼」になって区別できるという仕組みです

②「フォーカス取得時にフィルタ用にSetFocus」という意図は

フォーカス取得時EnterですねGotFocusでもほぼ変わらないのでどちらでもいいですが

③絞り込みは重ねていくことはできますでしょうか。

ちょっと質問の内容が理解できていません。フィルタの仕組み自体はhatenaさんのブログにあるような、フィールド(列)毎にフィルタ用のテキストボックス(またはコンボボックス)を用意するというだけのものです


この方法の問題点
フォーカスのあるコントロールは最前面に表示されるという仕様を使っているので期間指定(min、maxでテキストボックスを2つ用意したい)みたいなのはどうしたもんかとなります


▽(▼)について
上で軽く触れましたが、フィルタの内容を入力するテキストボックス(コンボボックス)は基本的にフィールド(列)のラベルに隠れた状態になるのでフィルタを適用しているフィールド(列)がどこなのかぱっと見でわかるようにするためのものです。この部分だけ独立させるとサイズやフォントを変えたり右端に寄せたりしてもう少しExcelっぽくできそうな気もします
条件付き書式を使ってみるという手もあるかもしれません


VBAの実装について
フィールド(列)のラベルとして使うコントロールを例えば「列ラベル_txt社員コード」のようにしたとすると

Private Sub 列ラベル_txt社員コード_Enter()
    Me.txt社員コード.SetFocus
End Sub

のようになりますが、コントロール数分記述するのは手間だしVBAコードが見づらくなります。フィルタの内容を入力するコントロールを例えばすべて「フィルタ_○○」のように統一して

Private Function setFocusFilterControl()
    Me(Replace(Me.ActiveControl.Name,"列ラベル_","フィルタ_")).SetFocus
End Sub

のような関数を作るとフォーカス取得時イベントに[イベントプロシージャ]を指定してコードを記述する代わりに=setFocusFilterControl()を設定するだけで済むのでいろいろはかどります

8
セロハン 2020/10/03 (土) 23:27:54 0029a@1c915 >> 3

2種類、検索をヘッダーに作りたいページがあり、1つはhatena様に教えていただいた方法、もう1つはコンボボックスが多いのでhiroton様に教えていただいた方法を使わせていただくことにしました!
そこで質問です。
①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、
フィルタ用の部分は何を指定するイメージでしょうか。
わからず…スミマセン。

②「フォーカス取得時にフィルタ用にSetFocus」という意図は
下記ですよね。

'''Private Sub txt検索_GotFocus()
    Me.cbo検索.SetFocus
End Sub
'''

③絞り込みは重ねていくことはできますでしょうか。

色々聞いてスミマセン。宜しくお願いいたします。

3

Accessではたいていのことはクエリのデザインビューでできますが、サブクエリとかユニオンクエリなどを使えるようになるにはSQLの理解は必要ですね。

2
ニンジャ 2020/10/03 (土) 13:01:32 f1ed8@83c58 >> 1

ありがとうございます!やってみてうまくいかなかったらまた質問させていただきます。
ところで、こういったことをきちんと理解するにはSQLの勉強をすべきなのでしょうか…

4
どんぐり 2020/10/03 (土) 09:21:07 f1ed8@83c58 >> 3

そうだったんですね!とても助かりました。ありがとうございます。

3

メイン/サブフォーム形式のフォームをデータシート表示させれば、サブフォームはサブデータシート表示になります。
サブフォームのテキストボックスのダブルクリック時で該当フォームを開くようにすれば、データシート表示したときも反応します。。

2
どんぐり 2020/10/03 (土) 09:08:46 f1ed8@83c58 >> 1

ありがとうございます。リンクさせたいならデータシートではなくて、テキストボックスを配置するしかないということですよね。

1

データシートにボタンを置くことはできません。
テキストボックスのダブルクリック時のイベントプロシージャでOpenFormメソッドでフォームを開くことになるでしょう。

4
5流クン 2020/10/02 (金) 17:12:29 aac31@79d1a

連絡遅れました。
指摘していただいた箇所が、全部間違っていました。
正しく、計算してくれるようになりました。
ありがとうございました。

1
hatena 2020/10/02 (金) 16:50:28 修正

下記の記事が参考になると思います。

サブフォームのフィールドを対象にメインフォームにフィルタをかける - hatena chips

上記はメインフォームのFilterに抽出条件を設定していますが、今回はOpenFormメソッドの第4引数に抽出条件を設定すればいいだけです。

上記を読んでも、どうしたらいいか分からない場合は、
メインフォームのレコードソースのテーブル名(orクエリ名)と、それの主キーと主なフィールド名、
サブフォームのレコードソースのテーブル名(prクエリ名)と、それの主キーと主なフィールド名、
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定を教えてください。

1
セロハン 2020/10/02 (金) 11:39:42 0029a@1c915

1つずつ、まったく同じクエリをもう1つ作ったところテキストが切れずに表示させることができました。

2
ふせん 2020/10/02 (金) 08:15:54 0029a@1c915 >> 1

色々とこの方法を応用して使えそうです!ありがとうございました。

5

kitasue 様

ご回答いただき誠にありがとうございます。

コードを使用させて頂きましたところ、
▲後の複数ワードで除外検索が出来ました。

ご親切に教えていただき、本当にありがとうございます。
教えて頂いたコード、勉強させて頂きます

1
hiroton 2020/09/30 (水) 17:07:52 1c7e9@f966d

本物のボタンを被せてしまうのが簡単だとおもいます
ボタンの透明プロパティを「はい」にすると、見えないボタンが配置できます

3
5流クン 2020/09/30 (水) 16:13:10 aac31@79d1a

式の後にAS句をつなげてフィールド名を記述するのですか
試してみます。
InStr(~)=""と使っていました。
比較なので、>0 =0なのですね。
ありがとうございます。

2
トマト 2020/09/30 (水) 15:42:45 0029a@1c915 >> 1

単純なことだったんですね…スミマセン。ありがとうございました!

7

あっ、間違ってますね。ご指摘ありがとうございます。
回答を修正しておきます。

6
初めまして。 2020/09/30 (水) 14:13:36 0227b@96e2f >> 5

 早々にご回答頂きまして、ありがとうございます。
早速試してみたところ、思うように作動致しました。
今度は、文字列での絞り込みもトライしてみようと思います。

3行目の
If Not IsNull(Me.年度検索) And Not IsNull(Me.年度検索) Then
の二つ目の Me.年度検索を Me.年度検索2 に変更しました。

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

5
hatena 2020/09/30 (水) 12:51:36 修正

レポートのレコードソースには、"年度登録"テーブルを設定します。

コマンドボタン「プレビュー」を配置します。このボタンのクリック時のイベントプロシージャを下記のように記述します。

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

OpenReportの第4引数に抽出条件を設定できます。

4
初めまして。 2020/09/30 (水) 11:38:24 0227b@96e2f >> 3

 ご回答頂き、ありがとうございます。

入力1カ所と入力2か所で、条件として矛盾するところは選択しない。と、いうのが希望なのですが、
はじめたばかりで、変な事をおたずねしているような質問で申し訳ありません。

検索フォームの作成というところで、VBAでFilterをかける方法が記載されているのを何度か閲覧致しましたが、レポートに出力するにはこの方法しかない!と思いこんでおりまして、クエリで、フォームのテキストボックスの値を参照してレポートに出力という方法しか行っていませんでした。

VBAでFilterをかける方法を勉強したいです。
どうぞよろしくお願いいたします。

1

クエリを新規作成して「Qピックアップ」を追加して、更新クエリにすれば「Qピックアップ」で絞り込まれたレコードが対象になります。
「Qピックアップ」で条件を変更すれば、上記の更新クエリにも反映されます。

3

指定年度検索:テキストボックス名:年度検索
月検索:テキストボックス名:月検索
除く年度検索:テキストボックス名:年度検索2

いろいろな場合が考えられますので、それぞれの場合でどのようにしたいのか具体的に説明してください。


入力一か所

指定年度検索: 入力
月検索: 未入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 未入力
除く年度検索: 入力

指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力


入力二か所

指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 入力
除く年度検索: 入力

指定年度検索: 入力
月検索: 未入力
除く年度検索: 入力
※これは条件として矛盾


すべて入力

指定年度検索: 入力
月検索: 入力
除く年度検索: 入力
※これは条件として矛盾

このすべてに対応しようとするとクエリではかなり式が複雑になりメンテナンス性が悪いです。
VBAでFilterをかける方法の方がシンプルにできますが、VBAの使用は可能ですか。

2
初めまして。 2020/09/30 (水) 09:54:56 0227b@96e2f >> 1

 ご回答頂き、ありがとうございます。
自分でも変な書き方だと思いました。
月だけを指定して検索すると、複数の年度が表示されるため 除く年度 で指定した年度を除いたものを表示したいです。
ただ、年度指定の検索項目も有効に残しておきたいし・・・・、同じくクエリ内で、一致検索とNot検索ができないのかなぁ・・・などと簡単に考えていました。
変な質問で申し訳ありません。

1
hiroton 2020/09/30 (水) 09:25:21 1c7e9@f966d

ACCESSはデータベースソフトです。「行数が変わる=データの件数が変わる」のは普通ですが、「列数が変わる=データの構造が変わる」のは基本、想定しません。

正規化をキーワードに調べてみてください。

正規化自体はただの考え方なのでExcelで実装でもACCESSで実装でも変わりません。正規化されたデータの処理ならACCESSのほうが得意です。

ACCESSにデータの取り込みが必要ならそれは正規化が必要で、ACCESSで組んだほうが楽(正規化しつつデータ取込できる)です。

また、データベースというのはデータ自体の順番を重視しません。都度、データの中身を使って並び順を指定します。そのため、データ取込の前にExcelで並び替えをしてもあまり意味がありません。(ACCESSに取り込んだらACCESSでの設定も必要)
ただ、たとえば純粋な記録順というのが欲しい場合、Excelで「並び順」列を用意して連番にして記録しておくというようなことはあるかもしれません。(この場合は記録日時列を作ってタイムスタンプを取るという形のほうがそれっぽいですが)