![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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カ月以上経ちます。。
お知恵をお貸しください!!!
No.2ベストアンサー
- 回答日時:
テキスト型フィールドの場合、空文字列の許可が有効になっていると
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文
も考えてみてください。
以上、ご参考までということで。
回答ありがとうございました。
きっと、この様なデータベース例はまれなんでしょうね。。
最初は正規化もしなくていいんじゃないかって言われましたし。
結局作り直すことになり、まだ奮闘中ですがこれからの作業にも
参考にさせていただきます!
WHERE句連結部のVBA記述が難しそうですが、頑張って勉強
しようと思います。
また質問するかもしれませんが、どうかご教授お願いします!
No.1
- 回答日時:
不都合なレコードを残したまま表示だけで回避しようとしていますね
いつまでも困難なトラブルが続きます。
「不都合なレコード(フィールド)は受け付けない」と考え方を変えてください
この手段はテーブル設計段階でフィールドのプロパティーで、ある程度可能です。
フィールドのプロパティーはテーブルのデザインビューで定義します。
0.データ型
テキスト型、メモ型、数値型、日付/時刻型、オートナンバー型、Yes/No型、
1.フィールドサイズ
2.規定値 数値項目に空白または文字があれば集計は出来ない
例えば 数t項目であれば0、文字項目の性別には"男"
3.入力規則 入力する値の制限
例 【>100 And <1000】,【="男”or ="女"】
4.値要求 【はい】とすると空白は許されない
5.空文字列の許可 【いいえ】とすると空白は許されない
6.インデックス 【重複なし】
会社名、品名等に適用出来そうですが別のフィールドで部署名、規格があればダメ
以上を定義しておくとテーブル、フォームからの入力は出来なくなります
またエクセルのデータ等をインポートすると不都合なレコードははじき出されます
既存のテーブルのレコードに不都合なレコードはプロパティーに違反していても
除去してくれませんので
1.テーブルをコピペしてテスト用のテーブルを作成
2.コピーのテーブルのレコードを全て除去
3.フィールドのプロパティーの定義
4.既存のテーブルよりインポート
これで、フィールドのプロパティーに違反しているレコードははじき出されます
![「Access2007でフォームのリストボ」の回答画像1](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/d/1349162_5497e5f90d138/M.jpg)
早速のご回答ありがとうございました。
その後、結局作り直すことになりました><
100個以上のフィールドがあるためchayamatiさんの確認方法だと
ひとつひとつ0~6を確認するのはとても時間がかかってしまいますTT
しかし、とても勉強になりました!
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessvba 複数条件でFilterを...
-
Accessで、1つの項目に複数の...
-
アクセスで追加した項目に全て...
-
Access:値が求めたい値の2倍...
-
Accessで、テーブルに入力した...
-
Access クエリの演算フィールド...
-
Accessのテーブルのフィールド...
-
アクセスのクエリ 1文字以上を...
-
アクセスのクエリに「PHONETIC...
-
ACCESSで2つフィールドの日付...
-
Access2002の重複クエリで大文...
-
テキストボックスにクエリ結果...
-
テーブルでメモ型になっている...
-
accessのクエリのフィールドで...
-
Access2007でフォームのリスト...
-
ACCESSのアクションクエリについて
-
MS Accessの小数の桁制限
-
アクセスのフォームのデザイン...
-
追加クエリでテーブル全体を指...
-
Access で 特定の文字の個数を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセスで追加した項目に全て...
-
テキストボックスにクエリ結果...
-
Accessのテーブルのフィールド...
-
Accessで、1つの項目に複数の...
-
Accessを開きなおすとテキスト...
-
Access:値が求めたい値の2倍...
-
更新クエリをリンクデータベー...
-
テーブルでメモ型になっている...
-
Accessで、テーブルに入力した...
-
Accessのクエリでハイパーリン...
-
Access で 特定の文字の個数を...
-
ACCESSで2つフィールドの日付...
-
アクセス クエリのフィールド...
-
access フォームを開くと「パ...
-
アクセスのクエリ 1文字以上を...
-
accessvba 複数条件でFilterを...
-
途中で改行されたCSVをAccessに...
-
アクセスのクエリに「PHONETIC...
-
accessでの文字列の混ざった連...
-
追加クエリで特定フィールドの...
おすすめ情報