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

解決済みの質問

Access2007でフォームのリストボックスから

Access2007でフォームのリストボックスから選択したフィールドをクエリしたいのですが
どうもうまくいきません。

テーブル数は10個くらいあり、全テーブルのフィールド数は100超あります。
テーブル1に一意のIDがあり、それに対して他のテーブルとリレーションシップで繋いでいます。

1.全テーブルのフィールドリストを作るのに「全テーブルクエリ」を作成
(テーブル1.IDのLEFT JOINでくっつけています。)

2.全テーブルクエリのコピーを作成し、リストから選択したフィールドのみを表示

3.選択した全フィールドのデータにNull以外のデータのみを表示するようフィルターをかける

以下、作成したVBAですが、実行すると、3.がうまく動いてくれず、Null値も表示してしまいます。
しかし、エラーは出ません。
フィルター適用になっていますが、最後のフィールドにフィルターマークが出ているだけで
実際はかかっていません。。

==========
Option Compare Database
Option Explicit

Dim dbs As Database
Dim qdf As QueryDef
Dim IDX As Long 'リストのインデックス用
Dim i As Integer
Dim F_name() As String
Dim strDate As String '現時刻取得
Dim Path As String

Public Sub 抽出_Click()
Set dbs = Application.CurrentDb
strDate = Format(Now, "_mmdd_hh:mm")

If Me.リスト.ItemsSelected.Count = 0 Then
MsgBox "抽出する項目を選択してください。"
Exit Sub
Else
Application.DoCmd.CopyObject , "抽出結果" & strDate, acQuery, "全テーブルクエリ"
Set qdf = dbs.QueryDefs("抽出結果" & strDate)
For IDX = 1 To Me.リスト.ListCount
Let qdf.Fields(Me.リスト.ItemData(IDX - 1)) _
.Properties("ColumnHidden").Value = Not (Me.リスト.Selected(IDX - 1))
Next
End If
DoCmd.OpenQuery "抽出結果" & strDate

ReDim F_name(qdf.Fields.Count)
For i = 1 To qdf.Fields.Count
F_name(i - 1) = qdf.Fields(i - 1).Name
If qdf.Fields(F_name(i - 1)).Properties("ColumnHidden").Value = True Then
'項目が非表示の場合何もしない
Else
      'Null以外のデータを抽出
DoCmd.ApplyFilter "抽出結果" & strDate, "('" & F_name(i - 1) & "') Is Not Null"
End If
Next i
dbs.Close
Set qdf = Nothing
Set dbs = Nothing
End Sub

==============
ですが、違うやり方があるのではないか・・と1週間くらい悩んでおります。
やりたいことは、
(1)まず100個以上あるフィールドをフォームのフィールドリストから選定。
(2)選定したフィールドのデータにNullまたは長さ0の値があればその行ごと非表示にする。
この2つです。

とりかかってから1カ月以上経ちます。。
お知恵をお貸しください!!!

投稿日時 - 2013-07-04 13:41:52

QNo.8161940

すぐに回答ほしいです

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

テキスト型フィールドの場合、空文字列の許可が有効になっていると
Null だけではなく、"" が入っている場合があります。
手作業でクエリに「空白に等しくない」フィルターを設定し、デザインビューでプロパティを見ると
フィルターには、
([クエリ1].[フィールド] Is Not Null AND [クエリ1].[フィールド]<>"")
となっているのが確認できます。
http://support.microsoft.com/kb/883247/ja

なので、DoCmd.ApplyFilter "抽出結果" & strDate, "('" & F_name(i - 1) & "') Is Not Null"
を上記のような形に変更する必要がありそうです。
ただし、フィルター条件が多くなると、何らかの制限に引っかかりそうです。
ヘルプやWEB検索でも見つけられませんでしたが
http://www.pal-stock.co.jp/access.html
必ず潜んでいるハズ?です(多分)(^_^;)

それと、"抽出結果" & strDate でクエリ名を指定しているつもりなのでしょうけど
DoCmd.ApplyFilter が適用されるのは最前面(アクティブ)になっているオブジェクトに対してです。
別のクエリやフォームが最前面ならそっちに適用されてしまいます。
docmd.SelectObject acQuery ・・・で回避できるかな?

以上を考えて、
試したわけではありませんが、クエリのSQL文を動的に変えて、
WHERE句を連結する方法もあるかと思います。
currentdb.querydefs("クエリ名").sql でSQL文が
SELECT 分類.番号, 細分.[タイトル], 細分.内部リンク
FROM 分類 LEFT JOIN 細分 ON 分類.番号 = 細分.分野;
みたいのが得られますので、; をLeftかInstrなどで取り除いて
WHERE句をつなげて、そのSQL文をcurrentdb.querydefs("クエリ名").sql = SQL文
も考えてみてください。
以上、ご参考までということで。

投稿日時 - 2013-07-06 11:11:13

お礼

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

きっと、この様なデータベース例はまれなんでしょうね。。
最初は正規化もしなくていいんじゃないかって言われましたし。

結局作り直すことになり、まだ奮闘中ですがこれからの作業にも
参考にさせていただきます!
WHERE句連結部のVBA記述が難しそうですが、頑張って勉強
しようと思います。

また質問するかもしれませんが、どうかご教授お願いします!

投稿日時 - 2013-07-08 10:13:46

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

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

回答(2)

ANo.1

不都合なレコードを残したまま表示だけで回避しようとしていますね
いつまでも困難なトラブルが続きます。

「不都合なレコード(フィールド)は受け付けない」と考え方を変えてください
この手段はテーブル設計段階でフィールドのプロパティーで、ある程度可能です。
フィールドのプロパティーはテーブルのデザインビューで定義します。
0.データ型
  テキスト型、メモ型、数値型、日付/時刻型、オートナンバー型、Yes/No型、
1.フィールドサイズ
2.規定値 数値項目に空白または文字があれば集計は出来ない
  例えば 数t項目であれば0、文字項目の性別には"男"
3.入力規則 入力する値の制限
  例 【>100 And <1000】,【="男”or ="女"】
4.値要求 【はい】とすると空白は許されない
5.空文字列の許可 【いいえ】とすると空白は許されない
6.インデックス 【重複なし】
  会社名、品名等に適用出来そうですが別のフィールドで部署名、規格があればダメ

以上を定義しておくとテーブル、フォームからの入力は出来なくなります
またエクセルのデータ等をインポートすると不都合なレコードははじき出されます

既存のテーブルのレコードに不都合なレコードはプロパティーに違反していても
除去してくれませんので
1.テーブルをコピペしてテスト用のテーブルを作成
2.コピーのテーブルのレコードを全て除去
3.フィールドのプロパティーの定義
4.既存のテーブルよりインポート

これで、フィールドのプロパティーに違反しているレコードははじき出されます

投稿日時 - 2013-07-05 04:52:35

お礼

早速のご回答ありがとうございました。
その後、結局作り直すことになりました><
100個以上のフィールドがあるためchayamatiさんの確認方法だと
ひとつひとつ0~6を確認するのはとても時間がかかってしまいますTT
しかし、とても勉強になりました!
ありがとうございます。

投稿日時 - 2013-07-08 10:03:37

あなたにオススメの質問