質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1927閲覧

Accessでソートしてフィルターして5件までの履歴を表示するフォーム

ebifurai55

総合スコア35

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/07/10 02:21

というのはどうやるのでしょうか?

現状ACCESSの機能でソートはできます、フィルターもできます。

これらを組み合わせて名前で抽出して5件分の履歴を他のデーター

を表示しないで、フォームで表示させたいのですが、どうやれば

良いのでしょうか?ソートやフィルターをマクロで書けばいいのでしょうか?

あと更新の処理もしないといけないでしょうか?理屈ではわかってるのですが、

実際の実装が追い付いていません。

みんな優しく教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コメントより

レコードソースは支援日誌。

フィールドは、

ID,利用日付、利用者名、開始時間、終了時間、今日の作業、今日の作業(補足)、今日の体調、今日の特記、記入者、タイムスタンプ、押印

同じ名前の利用者名レコードを集め、降順で利用日付で並べ替えし、直近5件分だけを表示したい。

詳細セクションにコマンドボタンが配置してあり、そのボタンをクリックすると、クリックしたレコードと同じ利用者名で抽出して直近5件を表示する。コマンドボタン名は、cmd直近5件 とします。

vba

1Private Sub cmd直近5件_Click() 2 Dim stFilter As String 3 Dim stSort As String 4 stSort = "利用日付 DESC" 5 stFilter = "利用者名='" & Me.利用者名 & "'" 6 7 Me.Filter = "ID In (SELECT TOP 5 ID FROM 支援日誌 WHERE " & _ 8 stFilter & " ORDER BY " & stSort & ")" 9 Me.FilterOn = True 10 Me.OrderBy = stSort 11 Me.OrderByOn = True 12End Sub

FilterプロパティにはSQLのWHERE句に相当する条件式を設定できます。ということはサブクエリも使用可能です。サブクエリで、TOP 5 を使って先頭5件を抽出して、その結果をIn演算子で比較して抽出します。

補足

Excelは表計算ソフト、Accessはリレーショナルデータベース(略してRDB)ソフト、まったく別のものです。

RDBではSQLが必須です。Accessは初心者向けにSQLが分からなくてもクエリでビジュアルな操作でデータ操作ができます。しかし、クエリの中身はSQLです。SQLビューで確認できます。

最初のうちはクエリでのデータ操作を学習しましょう。クエリを作成したら、SQLビューにしてどのようなSQLになっているか確認しましょう。そのうちなんとなく雰囲気が分かるようになってきますので、それからSQLの学習を始めるといいでしょう。

クエリだけではできることに限界がありますので、使いこなすうちにSQLは必要になってきます。

投稿2019/07/10 04:08

編集2019/07/11 18:45
hatena19

総合スコア34353

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/07/10 04:27 編集

履歴と言われていますから、最低限、key1+key2でkey1ことに5件までと解釈しましたが、その場合、回答内容だと、サブクエリー部分はKey1ごとに追加するという事になりますよね?
hatena19

2019/07/10 04:31

詳細な条件は質問には出てないのでとりあえずの回答です。 フォームで設定したフィルター、並び替え、を基準に上位5件を抽出する、コード例になります。
ebifurai55

2019/07/10 11:27

ありがとうございます。返信ありがとうございます。 ただちょっと違うところは”利用者名”と打ってるところに、 並び替えを行い、フィルターでTOP5まで抽出するという所 まで勧めたいと思っています。データベース初心者なので、 SQL文に関してはちんぷんかんぷんです。 いきなり回って来た機械学習のデーターベース構築に困惑 しています。多分並べ替えと抽出に関しては、Excelのノリで マクロ使えればいいや、と思ってたので。色々と苦労しています。 SQL文から覚えないといけないでしょうか? 画像ファイルで言えば http://file.osharegoto.blog.shinobi.jp/ACCESSform.jpg です。 よろしくお願いします。
hatena19

2019/07/10 11:37 編集

> 現状ACCESSの機能でソートはできます、フィルターもできます。 現状のこのコードを提示してもらえませんか。 > データベース初心者なので、SQL文に関してはちんぷんかんぷんです。 Accessを使うからには SQL は習得したほうが絶対いいです。 ただ、今回は、提示のコードの見よう見まねでなんとかなるレベルだと思います。
ebifurai55

2019/07/10 11:39

Option Compare Database Private Sub コマンド554_Click() Dim stFilter As String Dim stSort As String stSort = "利用者名" stFilter = "ID" Me.Filter = "利用者名 In (SELECT TOP 5 ID FROM WHERE " & _ stFilter & " ORDER BY " & stSort & ")" Me.FilterOn = True Me.OrderBy = stSort Me.OrderByOn = True End Sub
ebifurai55

2019/07/10 11:41

名前で並び替えと、抽出で履歴5だけを実行したいのです。 stFilterの所を現在選択してるレコードの利用者名で実行できないでしょうか?
hatena19

2019/07/10 14:33

現状のフィルタと並び替えはうまくいってるというコードを提示してもらえませんか。どのようなフィルタをかけて、どのような並べ替えをしているのかしりたいので。 そこから上位5件を抽出するコードは、それが分かってからでないとできません。
hatena19

2019/07/10 14:34

それかご希望のことを言葉て説明できますか。 「名前で並び替えと、抽出で履歴5だけを実行したい」では、何をしたいのか伝わりません。履歴とは何を指していますか。
ebifurai55

2019/07/11 02:16

データベースに関する知識がまったくないのと、ぼく自身SQL句を覚えて何になるか?がわかってないので、答えが提示できません。 単にフィルターをかけるだけでSQL句と言われてもちんぷんかんぷんです。 Excelだったらマクロは簡単で、操作した記録をマクロにできるので、 Accessにもそういった機能がないかな?と思います。 やりたいことはレコードの横のボタンを押して、フィルターして、当座の履歴5件分を表示したいだけなのですが・・・。 並べ替えはできました。あとはフィルターの条件式の値を自動で入力できないか?と思っています。それができなかったら検索ボックスを作るしかないと思います。ちょっと調べてみるとDAOとかあるので、データーベース歴3か月の私には難しすぎるかもしれません
ebifurai55

2019/07/11 02:17

フィルター ようは、 ●●●●〇〇◎〇 だったら絞り込みのフィルターで、 〇〇〇 にしたいと思っています。
ebifurai55

2019/07/11 02:55

先ほどの回答から少し進みました。 横のボタンを押すと、ABEという名前でABEという名前が 蓄積されるようになりました。ただし、TOPのところを3とか やってみても5つ表示されてしまいます。これを3とか2とかに 変えられれば良いと思ってます。 以下、少し改良したコードを貼ります。 Option Compare Database Private Sub コマンド554_Click() Dim stFilter As String Dim stSort As String stSort = "利用者名" stFilter = "利用日付" Me.Filter = "支援日誌.利用者名 In (SELECT TOP 3 支援日誌.利用者名 FROM 支援日誌 WHERE " & _ stFilter & " ORDER BY " & stSort & ")" Me.FilterOn = True Me.OrderBy = stSort Me.OrderByOn = True End Sub 個人的な気としては、一つのフィールドにこんなに縛りを入れてよいものなのか?という気がします。少し進んだのでよろしくお願いします。私の周りにはパソコンに詳しい人がおらず、だれにも聞けません。宜しくお願い致します。
hatena19

2019/07/11 03:33 編集

この説明ではやりたいことが伝わりません。一度にやろうとせずに、一つずつ順番に解決していきましょう。 このフォームのレコードソースに設定してあるテーブル名を提示してください。そのテーブルのフィールド名も提示してください。主キーフィールド名も提示してください。
ebifurai55

2019/07/11 12:10

返信ありがとうございます。ちょっと頭が整理できてないので、ご容赦下さいませ 1・レコードを並べ替えしたい 2・レコードを厳選(絞り込)したい 3・その中で上位4つか3つまで表示したい と書きました。こう書いてみると2と3で重複してるかもしれませんが、 言い換えると、 ex・上位3つか4つまでしか表示しないようにしたい という事です。まだ言いたいことが伝わってないかもしれませんがご容赦ください。 レコードソースは支援日誌。 フィールドは、 ID,利用日付、利用者名、開始時間、終了時間、今日の作業、今日の作業(補足)、今日の体調、今日の特記、記入者、タイムスタンプ、押印 となってます。 主キーはIDになってます。 わかりやすかったでしょうか?よろしくおねがいします。
hatena19

2019/07/11 12:46

1・レコードを並べ替えしたい どのフィールドを基準に並べ替えたいのでしょうか。 また、それは昇順でしょうか、降順でしょうか。 利用者名 だとしたら、それは漢字だと思いますが、それで並べ替えると文字コード順になりますが、それでいいのでしょうか。 2・レコードを厳選(絞り込)したい どのフィールドに対してどのような条件で絞り込みたいのでしょうか。 3・その中で上位4つか3つまで表示したい 何を基準とした順位でしょうか。 利用者名 で並べ替えるとしたら順位もその並び順でしょうか。
ebifurai55

2019/07/11 12:59

ありがとうございます。わかりにくくてすみません。 1・レコードを並べ替えしたい 1つ目の基準は利用者で同じイニシャルの人をソートしたいです。 昇順で、名前はイニシャルで英字です。その上で二番目の 基準で利用日付で降順して3つか5つ絞り込したいです。 2・レコードを厳選(絞り込)したい 利用者の名前で同じ名前がボタンをクリックしたらそれだけを表示したい 3・その中で上位4つか3つまで表示したい 基準は利用日付で、です。近い日で過去(すいません間違えました)5回 までの利用日付で5個、降順にしたいです。
hatena19

2019/07/11 13:12

1. 利用者名というフィールドに、英字のイニシャルが入っているのですか。 2. 同じ名前の人で絞り込んだのなら、1. の名前での並べ替えは無意味では。すべて同じ名前ですので。 3- 今日を基準に利用日付の直近5件を抽出という意味ですね。 まとめると、 各レコードの左のボタンをクリックしたら、そのレコードの名前の人の、今日を基準として利用日付の直近5件を表示したい。 という理解であってますか。
ebifurai55

2019/07/11 15:14 編集

夜分遅くすみません。回答します 1.英字でA~Zまで入ってて同じ人を並べる 2.全て同じですけど、利用日付は違います。 3.求める機能として、そのとおりになります。 まとめると、 同じ名前の利用者名レコードを集め、降順で利用日付で並べ替えし、直近5件分だけを表示したい。 こういった事は簡単できるでしょうけど、僕はちんぷんかんぷんです。 正直フィルターだけで制御できる話しですが、よくわかりません。 マクロに治すと。以上です。 ありがとうございました。
hatena19

2019/07/11 18:16

やりたいとこは分かりました。回答の方に追記しておきます。
guest

0

ACCESSで件数を限定するにはTOP述語を使用します。
ALL、DISTINCT、DISTINCTROW、TOP 述語

但し、目的は条件に一致したキーごとの履歴を一定件数という事でしょうから、SQLのみで行うのは現実的ではありません。

表示用のテーブルに、VBAで5件毎に追加を行う王な処理を行う必要があるでしょうね。
若しくは、画面の構成を変更し、最新データの一覧とサブ画面で履歴を表示するなど

追記

グループごとに連番をふりたい(Access2007編)
上記を利用して、条件を連番<=5 とする。

DCount()などの集計関数をクエリーで利用する場合、対象テーブルの件数やインデックスの状況によってかなり低速となる場合があります。

その場合、VBAでのループで枝打ちする処理の方が高速でしょう。

投稿2019/07/10 03:12

編集2019/07/10 04:27
sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問