みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access2016のレポートについて

 いつもお世話になっております。
 Access2016のレポートで困っていますので、ご教示をお願いいたします。
 下記のようなテーブルがあり、代表者がまだ決まっていない地域があるため、空白となっている所があります。
 これをレポートで出力した際、代表者が空欄となっている所は1行分空いてしまいます。この代表者が空欄となっている所を詰めて出力したいと思います。
 いろいろと調べて、詳細セクションと代表者名のテキストボックスの印刷時縮小をそれぞれ「はい」にすると、null値または「長さ0の文字列」の時は自動で詰まるとありましたが、なりませんでした。
 どうか、ご教示をよろしくお願いいたします。

【テーブルA】
地区名   地域名   代表者名
AAA    あああ   ネズミ
AAA    ああい   ウシ
AAA    ああい  (空白)
BBB    いいあ   トラ
BBB    いいあ   ウサギ
CCC    ううあ   タツ
CCC    ううあ  (空白)
CCC    ううい   ヘビ

【レポートA】
地区名(グループ化)  地域名(グループ化)  代表者名(詳細セクション)
AAA
            あああ
                        ネズミ
            ああい
                        ウシ
                        (空白行)
-------------------------------
BBB
            いいあ
                        トラ
                        ウサギ
-------------------------------
CCC
            ううあ
                        タツ
                        (空白行)
            ううい
                        ヘビ
-------------------------------

↓空白行をなしで出力したい形

【レポートA】
地区名(グループ化)  地域名(グループ化)  代表者名(詳細セクション)
AAA
            あああ
                         ネズミ
            ああい
                         ウシ
-------------------------------
BBB
            いいあ
                         トラ
                         ウサギ
-------------------------------
CCC
            ううあ
                         タツ
            ううい
                         ヘビ
-------------------------------

投稿日時 - 2019-02-14 12:04:38

QNo.9587703

すぐに回答ほしいです

質問者が選んだベストアンサー

【最後のチェック】Me.xxx

SELECT 地区名, 地域名, 代表者名台帳.名前 AS 代表者名
  FROM A LEFT JOIN 代表者名台帳 ON A.代表者名_ID=代表者名台帳.ID
  WHERE Len(代表者名台帳.名前 & "");

 上記SQLでは、表向きは《代表者名》。だが、実体は、《代表者名台帳.名前》です。この場合でも、SELECT文はちゃんと働きます。が、いずれにしろ、こういう類のことが起きているのかもしれません。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  Me.詳細.Visible = Len(Me.代表者名 & "")
End Sub

 《Me.代表者名》が正しければ、これで目的が達成されます。されないことは絶対にあり得ません。唯一の可能性は、Me.xxx の間違いです。そこで、Me.とやって候補を取得するテストをしてみる。それで何かが分かるかもです。

《フィルタの利用はあり得ない》

 なお、フィルタ機能は、《表示地区選択メニュー》からレポートを開く際に持ちいる機能。ですから、不具合データを非表示するのに利用するのは誤用。やっぱり上のやり方。そういうことで、最後に、Me.XXXを表示して最終確認を。

投稿日時 - 2019-02-15 10:47:07

補足

f_a_007さん、こんばんは。
 おかげさまで、この例のテーブルではうまく表示になりました。
 ただ、教えていただいた形で仕事で使っている本番用のAccessに適用させたら、残念ながらうまくいきませんでした。
 新たな質問として、再度質問(仕事で使っている構造と同じ)しようと思いますのでよろしくお願いいたします。

投稿日時 - 2019-02-16 21:18:36

お礼

f_a_007さん、いつもお世話になっております。
何度もご教示いただきまして、誠にありがとうございます。
後ほど試してみますので、改めてご報告いたします。

投稿日時 - 2019-02-15 18:02:56

ANo.8

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(12)

ANo.12

今日は
レポートAのデザインビューのプロパティーでレコードソースの右端の…を
クリックするとクエリビルダが起動しクエリーが表示されます。
これに、使用するフィールドを下にドラッグして、抽出条件を記述します
尚、フィールド名はワイルドカード(*)が使えます
項目名に重複を避けるため
(*)を使うと、条件の為ドラッグした代表者名の表示欄の✔を外します。

投稿日時 - 2019-02-21 13:30:39

お礼

chayamatiさん、おはようございます。
参考になる情報をお教えいただきまして、誠にありがとうございます。

投稿日時 - 2019-02-22 08:43:40

ANo.11

No.10 です。

レポートビューでは フォーマットイベントは発生しませんので
この方法では出来ません。

投稿日時 - 2019-02-17 12:01:06

お礼

m3_makiさん、こんにちは。
レポートビューでは表示にならないのですね。いろいろとありがとうございました。

投稿日時 - 2019-02-17 13:12:03

ANo.10

No.9 です。

> フォーマット時イベントに上記モジュールを入れてみましたが、残念ながら空白行が表示となりました。

印刷プレビュー ではなく、レポートビュー で見ているのではありませんか?

投稿日時 - 2019-02-16 21:38:03

お礼

m3_makiさん、こんばんは。
おっしゃる通り、印刷プレビュー ではなく、レポートビュー で見ていました。失礼しました。
ちなみに、レポートビューでも非表示にできますでしょうか。

投稿日時 - 2019-02-16 21:55:49

ANo.9

横から失礼します。

「代表者名」が空のレコード(Null, 空文字列, スペースのみ)を
表示しない、ということなら
これでいけます。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
 If Me.代表者名 Like "*[! ]*" Then
 Else
  Cancel = True
 End If
End Sub

投稿日時 - 2019-02-15 20:25:10

補足

m3_makiさん、お答えいただきましてありがとうございます。
さて、フォーマット時イベントに上記モジュールを入れてみましたが、残念ながら空白行が表示となりました。

投稿日時 - 2019-02-16 20:19:50

ANo.7

【補足】先ずは、SQL文のテストをしっかり!

 私は、先ず、添付図のようにDBSelect()でSQL文をテストしてからレポートの作成作業に移行しています。質問者も、段取りを踏んだ方がいいですよ。ただ、【イミディエイトウインドウ】で簡単にテストする関数は用意されていません。そこで、自作することになります。自作と言っても、単に次に紹介するDBSelect()を標準モジュールにコピペするだけです。その後に、【ツール】【参照設定】で

Microsoft ActiveX Data Obeject 2.1 Library

にレ点を付けるだけです。

 多分ですが、SQL文のテストに成功されたら、万事上手くいくと思いますよ。

祈、成功!

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional colDelimita As String = ";", _
             Optional rowDelimita As String = ";") As String
On Error GoTo Err_DBSelect
  Dim R      As Integer ' 行インデックス
  Dim N      As Integer ' 行総数 - 1
'  Dim cnn     As ADODB.Connection
  Dim rst     As ADODB.Recordset
  Dim fld     As ADODB.Field
  Dim strList   As String ' 全てのデータを区切子で連結して格納
 
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      N = .RecordCount - 1
      .MoveFirst
      For R = 0 To N
        For Each fld In .Fields
          With fld
            strList = strList & .Value & colDelimita
          End With
        Next fld
        strList = Mid(strList, 1, Len(strList) - 1) & rowDelimita
        .MoveNext
      Next R
    Else
      strList = ""
    End If
  End With
Exit_DBSelect:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBSelect = IIf(Len(strList) > 0, Replace(strList & "[END]", rowDelimita & "[END]", ""), "")
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr(13) & Chr(13) & _
      "・Err.Description=" & Err.Description & Chr(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function

投稿日時 - 2019-02-14 15:43:32

補足

 f_a_007さん、ご回答ありがとうございます。
 
 こんなに長いモジュールを作成していただき、本当にありがとうございます。
 早速試してみますので、結果は後ほどお知らせいたします。

投稿日時 - 2019-02-14 15:52:52

お礼

f_a_007さん、お世話になっております。

 お教えいただいた内容で行いましたら、ここで例として上げているテーブルではうまくいきました。
 ただ、仕事で使っている本番用のAccess(もう少し複雑な中身)では、うまく表示になりませんでした(T_T)

投稿日時 - 2019-02-14 19:34:40

ANo.6

【補足】手抜き回答しちゃったので・・・

クエリを使ったらなんて、手抜きでいい加減な回答をしてしまったので・・・

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
 原則:Access のクエリはフォームやレポートで用いるべからず!
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

ちゃんと、SQL文を書くのが基本中の基本です。で、その要領を示しておきます。これで、テストされてみたら・・・

当方、全く同じテーブル、同じデータで試していますので、同じ結果になると思いますよ。もしかしたら、《代表者名が空ではないのかも》ですね。

SELECT * FROM A WHERE Len(Trim([代表者名]) & '');

だったら、空行が出力されないかもです。

投稿日時 - 2019-02-14 15:19:40

ANo.5

【補足】クエリ17とは?

それは、添付図のようです。 <> False は、Access のクエリ編集が勝手に付けます。別に必須ではありませんが、仕方ありません。

投稿日時 - 2019-02-14 14:45:43

ANo.4

補足:Where節の書き方は人それぞれ

1、Len([列名] & "")
2、Not isNull([列名])

これは、好みの問題です。私の好みは1です。

投稿日時 - 2019-02-14 14:31:37

補足

 f_a_007さん、何度もありがとうございます。

 私のやり方が悪く、どうしても空白行が出てしまい、余白となってしまいます。
 感じ的には、シンプルな「【補足】レポートで消すことも可能!」でいけそうな気がするんですが、ダメみたいです(T_T)
 

投稿日時 - 2019-02-14 14:54:44

ANo.3

【補足】レポートでフィルタをかければOKだが・・・

でも、その場合、一旦全てを読み込むことになります。で、予めデータを絞り込んだクエリを作成してレポートをビルドするのが普通だと思いますよ。

投稿日時 - 2019-02-14 14:19:26

ANo.2

【補足】レポートで消すことも可能!

でも、その場合には、レポートのレイアウトが上ではなく下でなければならにという制約が生じます(添付図参照のこと)。なぜなら、空である行を消すと、そこにある別のデータも消えるからです。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  Me.詳細.Visible = Len(Me.代表者名 & "")
End Sub

投稿日時 - 2019-02-14 13:18:10

ANo.1

添付図を参照されたし。

・レポートで採用しているSQL文は上。
・上と下の違いは WHERE 節の有無です。

投稿日時 - 2019-02-14 12:35:49

補足

 f_a_007さん、早々にお答えいただきまして誠にありがとうございます。

 2点ほど、質問させていただきます。
 印刷時縮小では、やっぱりできないのでしょうか。
 また、レポートで採用しているSQL文は、どこに入れるのでしょうか。

 度々、申し訳ございませんが、よろしくお願いいたします。
 

投稿日時 - 2019-02-14 13:18:55

あなたにオススメの質問