MS Access Tips/Sample and VBA and Blog customize etc...

フォームでレコード件数0が表示されない

フォーム上のテキストボックスのコントロールソースに =Count(*) と設定してレコード件数を表示させてますが、該当レコードがない場合、0 と表示されません。表示する方法はないでしょうか。

通常の場合は レコード件数 0 も表示されるのですが、ある条件の場合表示されないことがあります。

■ 「追加の許可」が「いいえ」に設定してあるとき。

■ レコードソースが更新不可のクエリのとき。

■ 「レコードセット」プロパティが「スナップショット」で更新できないとき。

上記で共通なのは、新規レコードの追加ができないために、新規行がない状態だと言うことです。このようなフォームの場合、該当レコードがなくレコード件数が 0 のとき、詳細セクションが表示されません。フォームヘッダ、フォームフッターは表示されますので、そこに =Count(*) のテキストボックスを配置したとしても、通常は件数が表示されるのですが、レコードがないときは、空白で何も表示されません。

そこで、そのような場合でも 0 と表示させる方法を検討してみました。

難易度:

コントロールソースを =Count(*) 以外にも、=[RecordSet].[RecordCount] とか、別にテキストボックスを作成して =IIf(Nz([テキスト1],"")="",0,Count(*)) (テキスト1は、=Count(*) のテキストボックス)とか、他にも IsErrorを使うとか、、、考えられるあらゆる式を試してみましたが、すべてダメでした。

最終的にはコントロールソースを =0 と最も単純な式を設定しても、レコードがない場合は何も表示されませんでした。どうやら、詳細セクションが表示されてないときは、コントロールソースの式は評価されない仕様のようです。

ということで、何らかのイベントでテキストボックスに 0 を代入すればどうだろうか、と思いコマンドボタンを配置してクリック時で下記のように記述してみました。

レコードが無いときにクリックすると 0 と表示されました。ということは適当なイベントで 0 を代入してやればいいことになります。

思いつくのはレコード移動時イベントですが、そこで代入しても表示されませんでした。レコードが無いときはレコード移動時イベントも発生しませんでした。考えてみれば当然のことですね。レコードがないのですから。

そこで、読み込み時と、レコード件数が変化するイベントであるレコード削除後確認に代入コードを記述してみました。

これで、開いたとき0件の場合も、削除して0件になったときも 0 と表示されるようになりました。あと、レコード件数が変化するのはフィルタをかけたときとレコード新規追加ですね。レコード新規追加は、そもそも新規追加出来ないフォームでの現象なので考慮する必用はないですね。)そこで、「フィルタ実行時」に件数設定コードを記述すればいいかというとダメなんです。Me.RecordsetClone.RecordCount で取得できる値はフィルタがかかる前の値なんです。「フィルタ実行後」というイベントがあればいいのにないんですね。「フィルタ実行時」を作ったのなら、「フィルタ実行後」も作ればいいのにMSの仕様は相変わらず??です。

ということで、下記のようにDCountで件数を取得する面倒なコードになりました。

フォームのレコードソースに、テーブル/クエリを設定している前提です。SQLを直接設定している場合は、DAOかADOでレコードセットを開いてレコード件数を取得するように変更する必用があります。

しかしレコード件数 0 を表示するだけでこんな面倒なことになるとは。。。ひょっとして、実は簡単な設定や方法があったりして。

追記:

YU-TANGさんから、VBAを使わずに実現する方法をメールで送っていただきましたので、紹介します。

  1. 標題に「0」と設定したラベルを配置する。
  2. ラベルの真上に以下の設定のテキストボックスを重ねて配置する。
    プロパティ設定値
    コントロールソース="■"
    背景スタイル透明
    前景色(本来の背景色と同じ色)
  3. 上記のテキストボックスの真上に以下の設定のテキストボックスを重ねて配置する。
    プロパティ設定値
    コントロールソース=Count(*)
    背景スタイル透明
  4. レコードがある場合に、1 のラベルに表示される「0」を 2 のテキストボックスの四角形文字が隠すように位置調整すれば完了です。

新規追加ができなくてレコードが0件の時、コントロールソースは評価されないという仕様(バグ?)の逆をついた見事な方法です。発想の柔軟さには脱帽です。

言葉ではわかりにくいところもあるかも知れませんので、サンプルMDB を用意しました。

サンプルファイルが下記からダウンロードできます。
FrmNoRecordCount_07.zip (Access 2007-2010 形式 - 32kb)
FrmNoRecordCount.zip (Access 2002-2003 形式 - 23kb)
FrmNoRecordCount_2k.zip (Access 2000 形式 - 20kb)


拍手する

13 Comments

hatena says..."YU-TANGさんから驚きの方法"

YU-TANGさんからVBAを使わずに実現する驚きの方法をメールで送っていただきました。さっそく追記で紹介させていただきましたので、ご参照ください。

2009.09.21 22:36 | URL | #5uE6dEgY [edit]
HAND CREAM says..."レコード件数0が表示されない件について教えてください"

レコード件数0が表示されなくて探しまくって
たどり着きました。

私の場合はサブフォームに表示されるレコードの件数なのですが、
このサイトのように、フィルタ実行時に表示されるという使用ではなく、
メインフォームのレコードの移動時にサブフォームに表示される
レコードの内容が変化します。

試しに、サブフォームの
Form_Load()で下記のコードを記載し、

Private Sub Form_Load()
If Me.RecordsetClone.RecordCount = 0 Then
Me.txt件数.ControlSource = ""
Me.txt件数 = 0
Else
Me.txt件数.ControlSource = "=Count(*)"
End If
End Sub

サブフォームのレコードの表示されるテキストボックスに
クリック時のイベントとして上記のコードを記載しましたところ
クリックで「0」と表示されました。

ずっと悩んでいたので感動しました。

でも、実際に行いたいことは
メインフォームのレコードの移動時にサブフォームの中のレコードの件数が自動で変化させることなのです。

説明が下手でわかりにくくてすみませんが、
「0」を表示させるには、ボタンを作成するか、クリックしないとできないのしょうか?

メインフォームのレコード移動時に自動で表示はできないのでしょうか?

YU-TANGさんの方法ではできるのですが、
ぜひこちらのやり方でやりたいのです。

よろしければ教えてください。




2011.11.16 16:12 | URL | #BWgGc7Fk [edit]
hatena says..."re: レコード件数0が表示されない件について"

メインフォームのレコード移動時のイベントで、サブフォームのForm_Load を呼び出せばいいかと。

サブフォームの Form_Load をPublic宣言に変更。


Public Sub Form_Load()


メインフォームのレコード移動時で、

Me.サブフォームコントロール.Form.Form_Load

と記述すれば呼び出せます。

2011.11.17 08:33 | URL | #5uE6dEgY [edit]
HAND+CREAM says...""

返信いただいてありがとうございます。
下記のように設定しましたが、
「0」と表示させたいレコードに移動すると、
【実行時エラー'94':
Nullの使い方が不正です】
となります。

Public Sub Form_Current()
Me.サブフォームコントロール.Form.Form_Load
End Sub

何度もすみませんが教えてください。
よろしくお願いいたします。

2011.11.17 10:11 | URL | #BWgGc7Fk [edit]
hatena says..."re: レコード件数0が表示されない件について"

そのエラーは、どのコードで起きているのですか。

提示されているコードにはそのようなエラーがでるようなコードはないですが。

2011.11.17 13:33 | URL | #5uE6dEgY [edit]
HAND+CREAM says...""

Me.サブフォームコントロール.Form.Form_Load

のところでエラーとなっております。

2011.11.17 14:50 | URL | #BWgGc7Fk [edit]
hatena says...""

その行でとまって、「Nullの使い方が不正です」ですか。
サブフォームの Form_Load 内のどこかの行じゃないですか。


Form_Load に記述してあるコードをコピーして貼り付けてもらえますか。

2011.11.17 15:11 | URL | #5uE6dEgY [edit]
HAND+CREAM says...""

Public Sub Form_Load()
If Me.RecordsetClone.RecordCount = 0 Then
Me.カウント数表示.ControlSource = Null
Me.カウント数表示 = 0
Else
Me.カウント数表示.ControlSource = "=Count(*)"
End If
End Sub

よろしくお願い致します。

2011.11.17 15:25 | URL | #BWgGc7Fk [edit]
hatena says...""

> Me.カウント数表示.ControlSource = Null

この部分、間違ってますよ。下記にしてください。

Me.カウント数表示.ControlSource = ""

2011.11.17 15:36 | URL | #5uE6dEgY [edit]
HAND+CREAM says...""

ありがとうございました。
できました。
いろいろ試している時に変更してそのままになっておりました。
今後もブログ読ませていただきます。

2011.11.17 15:58 | URL | #BWgGc7Fk [edit]
hatena says..."サブフォームのカウント数をメインフォームへ表示する場合"

HAND+CREAMさんから、メールで下記の問い合わせがありました。

------------------------------------------------------------
サブフォームのカウント数をメインフォームへ表示する場合について
教えてください。

現在サブフォームに下記コードを記載しております。

Public Sub Form_Load()
  If Me.RecordsetClone.RecordCount = 0 Then
    Me.カウント数表示.ControlSource = ""
    Me.カウント数表示 = 0
  Else
    Me.カウント数表示.ControlSource = "=Count(*)"
  End If
End Sub


メインフォームには下記コードを記載しております。

Public Sub Form_Current()

  Me.サブフォーム.Form.Form_Load

End Sub


上記にて、サブフォームにカウント数「0」もちゃんと表示されております。

今回、メインフォームに条件によって、
サブフォームのカウント数を表示することになりました。

メインフォームのテキストボックス[種別]が"親"の場合のみ、
メインフォームのテキストボックス[子供の人数]にサブフォームのカウント数を表示したいのです。

そこで、下記のコードを記載しましたが、
可視、不可視はできるのですが、カウント数が0しか表示されません。
(1や2や3…は表示されません)


Public Sub Form_Current()

  Me.サブフォーム.Form.Form_Load
  

  If Me![種別] = "親" Then

   Me![子供の人数].Visible = True
  
Me![子供の人数] =Forms("メインフォーム").[サブフォーム].[Form].[カウント数表示]

  Else

   Me![子供の人数].Visible = False

  End If

End Sub


[子供の人数]のコントロールソースに下記を記載すると、1も2も0もちゃんと表示されます。
=(Forms("メインフォーム").[サブフォーム].[Form].[カウント数表示])
-----------------------------------------------------------

回答は次のコメントで

2011.11.27 08:31 | URL | #5uE6dEgY [edit]
hatena says..."re: サブフォームのカウント数をメインフォームへ表示する場合"

Me![子供の人数] =Forms("メインフォーム").[サブフォーム].[Form].[カウント数表示]
で件数が表示されないのは、=Count(*) で計算されるのにタイムラグがあるからでしょう。


=(Forms("メインフォーム").[サブフォーム].[Form].[カウント数表示])

で表示されるのですから、それでいいと思いますがだめですか。

(蛇足ですが、式は、
=[サブフォーム].[Form].[カウント数表示]
でもいいですね。)


どうしてもVBAでというなら

Me.サブフォーム.Form.Requery
Me.サブフォーム.Form.Recalc
Me!子供の人数 = Me.サブフォーム.Form.カウント数表示

2011.11.27 08:41 | URL | #5uE6dEgY [edit]
HAND+CREAM says...""

可視、不可視の設定をしないといけないので、
VBAでしないといけない!と思い込んでいました。

コントロールソースに、
=[サブフォーム].[Form].[カウント数表示]
を表示し、
可視、不可視のみVBAとしました。

問題なく正常に動いています。
ありがとうございました。
また、Requery とRecalcの使った方法、
今後別の場面でも応用して使えます。
重ね重ねさりがとうございました。

2011.11.28 15:01 | URL | #BWgGc7Fk [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/173-3da4e997
該当の記事は見つかりませんでした。