- ベストアンサー
Accessレポートでデータの重複を非表示にする方法
- 初心者の方がAccessレポートでデータの重複を非表示にする方法について質問されています。
- 重複データが引っかかってしまっている問題についても言及しています。
- 具体的なレポートの作成方法やフォーマットについての詳細な説明は提供されていません。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
忘れていました。 レポートのレコードソースにするのは、 #5で設定したTdataInです。
その他の回答 (9)
- piroin654
- ベストアンサー率75% (692/917)
もう一つ追加です。 コードはDAOを使っているので、コード表で ツールバーのツールから参照設定を選択し、 Microsoft DAO xx Object Library の一番高いバージョンにチェックが 入っているか確認してください。 xxはたとえば、3.6のような感じです。
- piroin654
- ベストアンサー率75% (692/917)
追加です。質問のクエリの名前を Qdata としています。 必要ならば、<その3>のcmdMkTableのコードの 最初の部分の、 Set db = CurrentDb Set rs = db.OpenRecordset("Qdata") Set rst = db.OpenRecordset("TdataIn", dbOpenDynaset) のところに、Qdata としていますが、これを 実際のクエリの名前に書き換えて確認してみてください。 この場合、クエリは普通の選択クエリとしています。 また、<その1>でのテーブルは新規に作成しておいてください。 このテーブルレコードの並びを確保するためにオートナンバー のIDを入れています。レコードを削除してオートナンバーを また1からはじめるためには、レコードをすべて削除後にファイルを 最適化すれば1からはじまります。 なお、テーブルのレコードを削除するのは削除クエリを 作り、それを実行するのが一番手っ取り早いです。
- piroin654
- ベストアンサー率75% (692/917)
<その3> <その2>と同じコード表に張り付けてください。 Sub cmdMkTable() Dim db As Database Dim rs As Recordset Dim rst As Recordset Dim psBunrui As Variant Dim psNamae As Variant Dim psChimei As Variant Dim psShoukei As Variant Dim psGoukei As Variant Set db = CurrentDb Set rs = db.OpenRecordset("Qdata") Set rst = db.OpenRecordset("TdataIn", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF rst.AddNew rst!分類 = funcJYUFUKU1(rs!分類) rst!名前 = funcJYUFUKU2(rs!名前) rst!地名 = funcJYUFUKU3(rs!地名) rst!小計 = funcJYUFUKU4(rs!小計) psBunrui = rst!分類 psNamae = rst!名前 psChimei = rst!地名 psShoukei = rst!小計 rs.MovePrevious If rs.BOF Then rs.MoveNext myGoukei = funcJYUFUKU5(rs!合計) rs.MovePrevious Else '分類が違う場合 If psBunrui <> rs!分類 Then rs.MoveNext myGoukei = rs!合計 rs.MovePrevious '分類が同じ場合 Else '分類が同じで名前が違う場合 If psNamae <> rs!名前 Then rs.MoveNext myGoukei = rs!合計 rs.MovePrevious '分類が同じで名前が同じ場合 Else myGoukei = Null End If End If End If rs.MoveNext rst!合計 = myGoukei rst!総合計 = funcJYUFUKU6(rs!総合計) rst.Update rs.MoveNext Loop rs.Close: Set rs = Nothing rst.Close: Set rst = Nothing db.Close: Set db = Nothing End Sub <その3>のcmdMkTableを標準モジュールの イミディエイトウィンドウで実行してもいいですし、 フォームにボタンを貼り付けそのクリック時イベントで Call cmdMkTable とすれば、実行されます。 たとえば、以下のような感じ。 Private Sub ボタン0_クリック() Call cmdMkTable End Sub 上記のような感じで登録してください。 わからなことがあれば書き込んでください。
- piroin654
- ベストアンサー率75% (692/917)
<その2> 以下を標準モジュールに張り付けてください。 Dim varItem1 As Variant Dim varItem2 As Variant Dim varItem3 As Variant Dim varItem4 As Variant Dim varItem5 As Variant Dim varItem6 As Variant Dim myGoukei As Variant Function funcJYUFUKU1(x As Variant) If x = varItem1 Then funcJYUFUKU1 = Null Else varItem1 = x funcJYUFUKU1 = x End If End Function Function funcJYUFUKU2(x As Variant) If x = varItem2 Then funcJYUFUKU2 = Null Else varItem2 = x funcJYUFUKU2 = x End If End Function Function funcJYUFUKU3(x As Variant) If x = varItem3 Then funcJYUFUKU3 = Null Else varItem3 = x funcJYUFUKU3 = x End If End Function Function funcJYUFUKU4(x As Variant) If x = varItem4 Then funcJYUFUKU4 = Null Else varItem4 = x funcJYUFUKU4 = x End If End Function Function funcJYUFUKU5(x As Variant) If x = varItem5 Then funcJYUFUKU5 = Null Else varItem5 = x funcJYUFUKU5 = x End If End Function Function funcJYUFUKU6(x As Variant) If x = varItem6 Then funcJYUFUKU6 = Null Else varItem6 = x funcJYUFUKU6 = x End If End Function
- piroin654
- ベストアンサー率75% (692/917)
<その1> なんとかレポートのレコードソースにできるものが できました。実は勘違いと言うのは計算上は合計の フィールドに数値を入れるかあるいはNullにするかは 32通りの場合分けが生じます。このことについて すっかり忘れていたので、最初に提示したコードは レポートのフィールドに「重複非表示」を設定したの と同じことになってしまいました。 32通りというのは、対象となるレコードの一つ前の レコードの、分類、名前、地名、小計、合計の フィールドとの比較によって生じる場合分けです。 この32通りの場合分けには、実際には質問のクエリ では起こりえないだろうというものも含まれています。 クエリのデータがどのようなものが存在するのか その法則が分からない状態、すなわち何でもありの 状態での場合分けです。 実際には、クエリのフィールドにまったく同じデータが 存在したり、あるいは分類が違ってもあとはまったく 同じデータが存在する、といったことは無いのかもしれ ませんが、これらのことを考えて少しこちらで推測で 場合分けを極小さくしてみました。 こちらで考えた場合分けには、小計のことについては まったく考慮していません。小計は「重複非表示」の 設定と同じにしています。 場合分けはコードの中にコメントの形で書いています。 [仕様]について 質問のクエリをもとに、テーブルにデータを出します。 テーブルは、 テーブル名 TdataIn ID(オートナンバー。主キーである必要はありません) 分類、名前、地名、小計、合計、総合計、の各フィールド を作り、これらのフィールドのデータ型はテキスト型 としてください。 コードは#1で提示したコードも使いますが、分かりやすく するためにもう一度同じものも掲示します。一部加えたものが あります。
- layy
- ベストアンサー率23% (292/1222)
参考になれば、 単なる合計450でなく、バナナの合計450、みかんの合計450、で判断してこそ重複非表示が活きてきます。名前と合計の連結した値で判断できれば、みかん450を表示できる判断材料になるのではないかと思います。判断はみかん450で印字は450みたいに。「〃」を印字させる手段にヒントがありそうです。 ほかには クエリで同一グループ毎に連番付与し、1のとき、印字すべきタイミングのレコードか、判断し印字させるというのが考えられます。
レイアウトが多少変わりますが、グループフッターで小計を印刷するのでは拙いでしょうか? 分類 名前 地名 小計 合計 総合計 -------------------------------------------------- 果物 りんご 青森 100 千葉 50 山梨 20 170 バナナ 千葉 450 450 みかん 栃木 300 150 450 1070 ----------------------------------------
- piroin654
- ベストアンサー率75% (692/917)
すみません。勘違いがあったので#1は一旦無しにしてください。
お礼
お返事ありがとうございます。 #1の件了解しました。また宜しくお願いします。
- piroin654
- ベストアンサー率75% (692/917)
解決したでしょうか。 このような場合、レポートのテキストボックスの 「重複データ非表示」では列すべてが対象となるので クエリでデータを整えて、それをレポートの レコードソースにするのがいいのではと、思います。 そのためには、一工夫、あるいは二工夫必要です。 なお、レポートの「重複データ非表示」は「いいえ」 にしておきます。 クエリをQdataとします。SQL文は以下です。 質問の通りのデータの並びの順番は通し番号が 必要なので、一応ID(オートナンバー)を入れています。 このIDをを除けると並びは変わりますが、データは 希望通りになっていると思います。 SELECT Qdata.ID, Qdata.分類, Qdata.名前, Qdata.地名, Qdata.小計, Qdata.合計, Qdata.総 合計, funcJYUFUKU1([分類]) AS 分類表示, funcJYUFUKU2([名前]) AS 名前表示, funcJYUFUKU3([地名]) AS 地名表示, funcJYUFUKU4([小計]) AS 小計表示, funcJYUFUKU5([合計 ]) AS 合計表示, funcJYUFUKU6([総合計]) AS 総合計表示 FROM Qdata GROUP BY Qdata.ID, Qdata.分類, Qdata.名前, Qdata.地名, Qdata.小計, Qdata.合計, Qdata. 総合計; 上記のSQL文を新規クエリのSQLビューに貼り付け保存してください。 このクエリの分類表示、名前表示、地名表示、小計表示、合計表示、 総合計表示をレポートのデータとして使います。 次に、以下のコードを標準モジュールに張り付けて、 保存してください。 Dim varItem1 As Variant Dim varItem2 As Variant Dim varItem3 As Variant Dim varItem4 As Variant Dim varItem5 As Variant Dim varItem6 As Variant Function funcJYUFUKU1(x As Variant) If x = varItem1 Then funcJYUFUKU1 = Null Else varItem1 = x funcJYUFUKU1 = x End If End Function Function funcJYUFUKU2(x As Variant) If x = varItem2 Then funcJYUFUKU2 = Null Else varItem2 = x funcJYUFUKU2 = x End If End Function Function funcJYUFUKU3(x As Variant) If x = varItem3 Then funcJYUFUKU3 = Null Else varItem3 = x funcJYUFUKU3 = x End If End Function Function funcJYUFUKU4(x As Variant) If x = varItem4 Then funcJYUFUKU4 = Null Else varItem4 = x funcJYUFUKU4 = x End If End Function Function funcJYUFUKU5(x As Variant) If x = varItem5 Then funcJYUFUKU5 = Null Else varItem5 = x funcJYUFUKU5 = x End If End Function Function funcJYUFUKU6(x As Variant) If x = varItem6 Then funcJYUFUKU6 = Null Else varItem6 = x funcJYUFUKU6 = x End If End Function 以上です。何かあれば質問してください。
お礼
ありがとうございます。 希望通りできました。 今後もよろしくお願いします。