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

締切り済みの質問

フォームで入力された文字をクエリのフィールド名として反映させたい 【Microsoft Access】

Microsoft Accessに関する質問です。バージョンは2003です。
フォーム"Fo1"に、テキストボックス"Te1"とクエリの実行を行うためのコマンドボタン"CB1"があるとします。コマンドボタン"CB1"を押すことでクエリ"Q1"が実行されるよう、イベント プロシージャに記載しています。クエリ"Q1"にはテーブル"Ta1"が表示されており、テーブル"Ta1"は複数のフィールド("Fi1","Fi2","Fi3",…)を有するものとします。
このような状況において、テキストボックス"Te1"に複数のフィールド("Fi1","Fi2","Fi3",…)のうちのどれかを記述し、コマンドボタン"CB1"を押したときに、テキストボックス"Te1"に記載されたフィールド名のデータを実行結果として出力したいと考えています。
そこで、クエリ"Q1"の「フィールド:」の部分に
[Forms]![Fo1]![Te1]
と記入し、「テーブル:」の部分に"Ta1"を指定した後、クエリを保存して(このときにはフィールド名の記入した部分は「式1: [Ta1].Forms![Fo1]![Te1]」と表示されています)閉じた後に、フォーム"Fo1"を開き、テキストボックス"Te1"に出力させたいフィールド名を記載しコマンドボタン"CB1"を押してみました。
すると、「パラメータの入力」というダイアログが立ち上がり、ダイアログ内には「Ta1.Forms!F01!Te1」という記述とテキストボックスが出力されました。テキストボックスに無記入で"OK"ボタンを押したところ、出力結果に「式1」という列が現れ全てのセルが空白となってしまいました。
フォームや、クエリに記入する表記が間違っているのか、そもそも出力させるフィールド名をフォームから指定するという方法が根本的に違うのかわかりません。

申し訳ありませんが、当方Accessに関しては初心者ですので、極力専門用語は少なくご教授いただければと思います。よろしくお願いします。

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2009-04-28 19:31:57

QNo.4916271

すぐに回答ほしいです

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

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

回答(3)

ANo.3

> SELECT [XXXX] AS 式1
> FROM [Te1];

この部分を、SELECT XXXX FROM Te1; として、SQLBASE に作っておきます。

> クエリの実行結果はフィールド名のところに「式1」と表示され
SQLビューで見たとき、 YYYY AS AAA となっている場合、クエリを実行すると
フィールド名 AAA で、YYYY の内容が表示されます。

>「パラメータの入力」というダイアログが立ち上がり「XXXX」に何を入力するか
これは、sSql = Replace(SQLBASE, "XXXX", sTmp) が処理されていない、と思ってもいいと思います。
(なぜ、そうなるのかは分からないのですが)

今回やろうとしているのは、
(1)
sSql = "SELECT " & Me.Te1 & " FROM Ta1 WHERE ・・・;"

ではなく、

SQLBASE = "SELECT XXXX FROM Ta1 WHERE ・・・;"
の XXXX をテキストボックスで指定された文字列(Me.Te1)に置き換えようとするものです。
((1) で作るよりは、Replace で置き換えたほうが何をやっているかイメージしやすいと思ったから)

>    CurrentDb.QueryDefs("Q1").SQL = sSql
この行にブレイクポイントを設定し、sSql の内容を確かめられますか?

ブレイクポイントは、その行をクリックし「F9」すると、設定/解除できます。
また、内容の確認は、「ローカルウィンドウ」「ウォッチウィンドウ」などで確認できます。

投稿日時 - 2009-04-30 21:04:49

ANo.2

私がよく使う方法ですが、
クエリのデザインで基本的なものを作成し、SQLビュー表示の内容を持ってきます。
その際、置き換えるところを XXXX のように、指定しやすい文字列に変更しておきます。
(Sample1内の SQLBASE 宣言部分)

Private Sub Sample1()
  Dim sTmp As String
  Dim sSql As String
  Const SQLBASE = "SELECT XXXX FROM Ta1 WHERE ・・・・;"

  sTmp = Trim(Nz(Me.Te1, ""))
  If (Len(sTmp) > 0) Then
    sSql = Replace(SQLBASE, "XXXX", sTmp)

'    クエリを作るなら、
'    CurrentDb.CreateQueryDef "クエリ名", sSql

'    既にあるクエリの内容を書き換えるのであれば、
'    CurrentDb.QueryDefs("Q1").SQL = sSql

'    フォームのレコードソースを書き換えるのであれば
'    Me.RecordSource = sSql

'    その後、フォーム上の txt00 に連結するのであれば
'    Me.txt00.ControlSource = sTmp

'    個数求めるなら
'    iCount = DCount(sTmp, "Ta1", 抽出条件)

'    などなど
  End If

End Sub

投稿日時 - 2009-04-30 10:11:25

お礼

回答ありがとうございます。ただ、申し訳ありませんがいまだ解決しません。

上記「質問」の「画像」の部分にあるようなクエリ"Q1"を作り、フィールド名の欄に「XXXX」と入力し、SQLパススルークエリを参照すると

SELECT [XXXX] AS 式1
FROM [Te1];

と出力されました。([]が付いているのが気になりますが…)これを30246kikuさんのソースの中の

Const SQLBASE = "SELECT XXXX FROM Ta1 WHERE ・・・・;"

のダブルクオーテーションマークの間に貼りつけ(変更)ました。その後、
30246kikuさんのソースの中の「Private Sub Sample1()」の部分から「End Sub」の部分をフォーム"Fo1"のソース内にコピーしました。また、「既にあるクエリの内容を書き換える」ので、

'    CurrentDb.QueryDefs("Q1").SQL = sSql

の行の'を消去ました。
テーブル"Ta1"内に存在するフィールド名をテキストボックス"Te1"に入力し、フォームのコントロールボックス"CB1"を押しました。
すると、「パラメータの入力」というダイアログが立ち上がり「XXXX」に何を入力するか教えてくれと訴えられました。そこに何かを打ち込むと出力されたクエリの実行結果はフィールド名のところに「式1」と表示され、すべての結果に先ほどの「パラメータの入力」ダイアログで入力したものが出力されると言った具合です。

色々と自分なりに勉強してみましたが、よくわからないのでもう少し御教授願えたらうれしいと思います。よろしくお願いします。

投稿日時 - 2009-04-30 17:23:38

ANo.1

以下が参考になりませんか

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1425478979

投稿日時 - 2009-04-29 07:15:38

お礼

早速の回答ありがとうございます。
ただ、参考としていただいたURLの質問は
「フォームのコンボボックスで選択されたテキストと同じ名称のフィールドに「○」が入力されているデータを検索したい」
ですが、私の場合は
「フォームのテキストボックスで入力されたテキストと同じ名称のフィールドを既存のテーブルより抽出し、クエリ内のフィールド名として採用する」
です。コンボボックスとテキストボックスの違いはさしたる問題ではないと思いますが、私の場合は抽出条件の指定まではしておりません。また、クエリにはテキストボックスで指定して追加するフィールドの他にも、フィールドとそのフィールドからの抽出条件が指定してあります(こちらはフォームからの変更操作は加えません)。
「似たようなもんだ」ということでも、もう少し突っ込んで教えていただけないでしょうか?(具体的にはフォームにおけるSQL作成コードと追加箇所、クエリへの追加コードと追加箇所など)
申し訳ありませんがよろしくお願いします。

投稿日時 - 2009-04-29 22:44:49

あなたにオススメの質問