• 締切済み

Access200xにおいて、VBAの変数の値をリストボックスのRowSource内で参照する方法はありますか?

Access初心者です。説明不足なところなどありましたら、ご指摘ください。 フォームにテキストボックスとリストボックスを配置し、テキストボックスに入力した値をVBAで加工して、その加工された値をキーにDBを参照して、リストボックスに表示したいと考えています。 テストの手順を簡単に説明します(この問題はデータの加工自体にはないと考えているので、入力された値をそのままキーにして値を取得しています。) 1.テーブル作成(テーブル名:tblTEST) テーブル構造 ID DATA 1 あああ 2 いいい 3 ううう 2.フォーム作成(フォーム名:frmTSET) 3.frmTEST内にテキストボックス作成(オブジェクト名:txtTEST) 4.frmTEST内にリストボックス作成(オブジェクト名:lstTEST) RowSourceプロパティの値に SELECT [tblTEST].[DATA] FROM tblTEST WHERE ID=[strTEST]; 5.VBAでtxtTESTのChangeイベントに以下のコードを記述 宣言部 Dim strTEST As String 関数部 Private Sub txtTEST_Change() strTEST = txtTEST.Text lstTEST.Requery End Sub 期待する動作は、テキストボックスに1と入力したらリストボックスに「あああ」が表示される。という動作なのですが、テキストボックスに値を入力すると、「パラメータの入力」ダイアログが表示され、strTESTの値を入力するよう促されてしまいます。 恐らく、txtTEST_Change()関数でstrTESTにはテキストボックスの入力値が入っていますが、手順4の条件句のところで、strTESTの値が取れてないのだと思います。この条件句のところでVBAの変数を参照するにはどのように記述すればよいのでしょうか? 尚、上記のやり方はAccess2003及び2007でテストしてダメでしたが、Access97では動作するようなのです。 他の手法で同様の動作を実現する方法はいくつか思いつくのですが、Accessのバージョンアップによる作業を減らすため、上記のような方法によって、この機能を実現させたいと考えています。 よろしくお願いします。

みんなの回答

  • kosamon
  • ベストアンサー率47% (11/23)
回答No.5

#2です。 ご質問の内容を少し読み違えてました。 リストボックス自体に >RowSourceプロパティの値 を設定されているのですね。 これについては私自身経験ありませんので明確な解決方法を 提示することができません。 http://www.accessclub.jp/ こちらで変数についてお調べになってみたらどうでしょう?

  • beppo
  • ベストアンサー率78% (22/28)
回答No.4

> テキストボックスに値を入力すると、「パラメータの入力」ダイアログが > 表示され、strTESTの値を入力するよう促されてしまいます。 SQLの挙動について、誤解されているものと思います。 Access(JETデータベースエンジン)では、SQL中に [](半角大カッコ)で囲まれた文字列は、  ・列名  ・パラメータクエリ いずれかに解釈されます。 同じ書式の [DATA] ではダイアログボックスが表示されないのは、 前者の列名との解釈が成立しているためです。 (テーブル内に同一の名称の列が存在するので) 対して、 [strTEST] は該当する列が存在しないため、 後者のパラメータクエリと解釈され、 対話的な処理を行うために、JETがダイアログを表示しているのです。 ※ダイアログボックスに、strTESTという文字列が表示されているはずですが、 それはstrTESTというパラメータに何を指定するか?とJETが聞いている状態です。 よって、対応としては、  ・lstTESTのRowSourceプロパティは、   (GUIで設定するのではなく)VBAでの制御に修正   ⇒ txtTEST_Change()イベントの度にRowSourceを書き換える  ・SQL文を修正 の2点となります。 ※プラス、Form_Load()でRowSourceにブランク設定、も必要なので3点かな? コード内でのSQL記述は以下の通り。 | Private Sub txtTEST_Change() | |   Dim strSQL As String |   Dim strTEST As String | |   strTEST = txtTEST.Text | |   strSQL = "SELECT A.DATA FROM tblTEST AS A " |   strSQL = strSQL & "WHERE A.ID = '" & txtTEST & "'" | |   lstTEST.RowSource = strSQL | |   lstTEST.Requery | | End Sub で、動くはずです…あくまではず、ですが^_^; > Access2003及び2007でテストしてダメでしたが、 > Access97では動作するようなのです。 うーん、、動くというのが不思議ですね。。 97と2000以降との仕様の違い、といってしまえばそれまでですが・・・。 ひょっとして、97(既存ですよね?)では、  SELECT ~ WHERE ID=[txtTEST] とオブジェクト指定になっている、とかいうイージーな話ではないですよね? ここは答えが出せませんが、上記のような作りが一般的なものだと思います。 ※DLookupも立派な解決策のひとつですが、  Accessの方言ということで自分は避けています。  更なるバージョンアップを見据えて、上記のように制御するのが、  最もオーソドックスな方法だと考えています。 以上、ご参考まで。

btom0106
質問者

補足

ご回答ありがとうございます。 大変参考になりました。 >ひょっとして、97(既存ですよね?)では、 > SELECT ~ WHERE ID=[txtTEST] >とオブジェクト指定になっている、とかいうイージーな話ではないですよね? ここは、VBA側の変数を見ているのは間違いないと思います。 ここに載せたサンプルを非常に単純化してしまったがために、 逆に質問の意図を伝えにくくしてしまったようで申し訳ありません。 実際は、テキストボックスに入力された値をキーにSOAPで別システムと やり取りをして、返ってきた値をVBA側の変数(サンプルではstrTESTにあたる変数)に 格納し、その変数をキーにリスト表示させています。 SQLももっと複雑なのですが、「SQLはリストボックスのRowSourceに記述されており、 変数名を[]で囲んで参照している」という箇所は変わりません。 ・・・と、思っていたのですが、皆さんの回答を頂いてちょっとその辺に 自信がなくなってきました^^;; #3の方の回答にも書いたとおり、もしかしたらぼくが既存の方式を見間違えて いたのかもしれないので、もう一度、その方式を確認してみます。 ありがとうございます。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

#1です DLookup 関数 http://office.microsoft.com/ja-jp/access/HA012288251041.aspx にある通りだよ リストボックスに、値が入ってるから・・・ それを元に DLookup("DATA","tblTEST","ID = " & Me.lstTEST) と、いう感じ > strTESTの値が取れてないのだと思います。 これは、パラメータと変数を混同していると言う話だと思うから、VBAでパラメータ値を変更するのは・・・どうしたかは^^; 普通は、「frmTSET」のレコードソース上で「lstTEST」の値を参照できるように作成するのが通常だけどね

btom0106
質問者

補足

Dlookup関数の使い方分かりました。ありがとうございました。 >> strTESTの値が取れてないのだと思います。 >これは、パラメータと変数を混同していると言う話だと思うから、 現在Access97では動作しているものが、このような方式であるように 思えたのですが、もしかしたらその方式を見間違えていたのかもしれません。 まずは、既存の方式を再確認してみたいと思います。 ありがとうございます。

  • kosamon
  • ベストアンサー率47% (11/23)
回答No.2

>テキストボックスに入力した値をVBAで加工して この件が良く解りませんが、テキストボックスに入力した値を 抽出条件にしたいと言うことでしょうか? だとすれば・・・という前提で。 テキストボックスの更新後処理に me.テキストボックス名.RowSource = "SELECT * FROM テーブル名 WHERE ID=" & Me.テキストボックス名 こんな感じかな。 >、「パラメータの入力」ダイアログが表示され、strTESTの値を入力するよう促されてしまいます。 >strTESTの値が取れてないのだと データ型の違いだと思われます。 抽出するフィールドのデータ型が提示されたSQLを見る限り数値であると思われるのに、なんでわざわざ文字列に変換させてるのですか? 正しいデータ型を指定しましょう。 あくまでも変数に拘りたいというならば別の方法もありますが、まずは データ型についての記述が無いため、そのあたりをはっきりお書きになってからという事で・・・。

btom0106
質問者

補足

質問の書き方が悪かったようです。申し訳ありません。 >あくまでも変数に拘りたいというならば別の方法もありますが 変数に拘りたいのです。 というのも、方式的にその方法が良いと考えているわけではなく、 現在Access97用に作られているものがその方式(変数を使った方式)を取っており、 それをAccess200xで動かすようにしたいのですが、同じような処理が 大量にあるため、VBAをすべて書き換えるのは大変なので、 可能であれば、RowSourceのところの書き換えだけで、なんとか Access97と同様の動作を実現できないかと思っています。 また、データ型の件ですが、ためしにInteger型などに変更してみましたが、 結果は同様でした。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

リストボックスから、何とかしようとするより、ソースへ値から、DLookup関数で取得すると言うのが普通だと思うけど?

btom0106
質問者

補足

早速のご回答ありがとうございます。 DLookup関数について調べてみたのですが、使用方法がいまいち分かりません。この関数を使うと、リストボックスのプロパティからVBAの変数を参照できるようになるのでしょうか? 質問に記載したサンプルに適用するには具体的にどうすればよいのでしょうか? 質問ばかりで申し訳ありませんが、よろしくお願いいたします。

関連するQ&A

  • アクセスVBA テキストボックス入力値からの参照

    マイクロソフトアクセス初心者です。 現在、アクセスでデータベースを作成しています。 2つのフォーム(フォーム(1)、フォーム(2))、2つのテーブル(入力情報、マスタ)、2つのテーブルをもとにした1つのレポートを作成しています。 『フォーム(1)』のテキストボックスAに入力された値を、Dlookup関数で『フォーム(2)』のテキストボックスBに数値を参照しています。 『フォーム(2)』のテキストボックスに表示された値を、『フォーム(2)』に設置されたコマンドボタンをクリックすると、VBAで『テーブル入力情報』のフィールドAに入力されるようにしています。フィールドAについてのマスタとなるテーブルが『テーブルマスタ』です。 リレーションシップを設定せず、ただ単に値を入力することは出来るのですが、レポートを作成するにあたって、『テーブル入力情報』と『テーブルマスタ』のフィールドAに1(テーブルマスタ)対多(テーブル入力情報)のリレーションシップを設定したいと思っています。 リレーションシップを設定し、テキストボックスBに表示された数値を『テーブル入力情報』に入力する際、『テーブルマスタ』から該当するデータを選択して『テーブル入力情報』に入力されるようにしたいと思うのですが、現状では、リレーションシップを設定すると、入力値が真っ白になってしまい、レポートにも入力したデータが反映されません。 ちなみに、入力する際はフィールドA=Me.テキストボックスBのようにしています。 何か良い解決策がありましたら、是非教えていただけませんでしょうか? 分かり難い文章かと思いますが、どうぞ宜しくお願い申し上げます。

  • アクセス(ACCESS)のリストボックスについて

    アクセスでフォームにテキストボックスとリストボックスを配置して、 テキストボックスに入力した文字列により、リストボックスに表示される データを変えたいのですが(フィルタをかけるというのでしょうか??) そこで、vbaを用い、リストボックスのプロパティの値集合ソースに SELECT * FROM aaa where aaa.bbb like "*あ*"; 'あ と言う文字のあいまい検索のつもり ”あ”はテキストボックス    に入力されている。 と入るような事を考えたのですが、ここで、aaaの部分がテーブルを基にした 場合は、該当するデータすべてが表示されますが、クエリーを基にすると 先頭のデータしか表示しないのです。 たぶん、素人の考えなのでしょうが、どうしてそうなるのかが分かりません。 教えていただけないでしょうか? できたら、クエリーを基にしても、該当データが表示できる方法も 教えてください。お願いします。 VBAは(?)かなりの初心者です。上記の方法も本に書いてあった物を やっと流用しました。猿にも解るくらいでお願いします。 ちなみに、アクセスは2000を使用しています。

  • AccessのVBAにおいて,アクセスフォームに表示されている「値」を

    AccessのVBAにおいて,アクセスフォームに表示されている「値」を変数の中に格納したい。  例えば,オートフォームの単票形式でフォームを作成した場合,「番号」「製品」といったフィールドが2個あるテーブルを使うと,「番号」「製品」という名前のテキストボックスが2個ほどできます。 (フィールド名やテキストボックス名は問題ではありません。) このフォーム上に「ボタン」を配置し,このボタンをクリックした時に,「製品」というテキストボックスの内容を,メッセージボックスで表示させたい。 MsgBox (Me.製品.Text) と書いてもエラーとなります。 実際には,このフォームで欲しいデータを見つけた時,ボタンクリックで,テキストボックスに表示されている内容をグローバル変数に格納したいのですが,方法が分かりません。 Access 初心者です。どなたかよろしくお願いします。

  • アクセスで同じ値を引き出してくる方法

    アクセス初心者です。 フォームのテキストボックス(txt開催日)に『12345』と言う値が入っています。 テーブル(T_受講料)で『12345』は『5000』と言うテーブルを作っています。(他、多数のデータがあります) そのテーブルは単独でリレーションを結んでいません。(構造上無理なため) どうやったら、フォームに新たに作ったテキストボックスに『5000』を入力できるのでしょうか? よろしくお願いします。

  • コンボボックスの値が消えてしまいます。

    コンボボックスの値が消えてしまいます。 フォーム(1)にコンボボックスA(値集合ソースはテーブル1)があります、この リスト外入力時で別フォーム(2)(レコード追加用)を開きテーブル1にレコードを追加、 フォーム(2)を閉じる時にコンボボックスAをリクエリかけてフォーム(1)に戻るとコンボボックスAが空になっているのでリストを開き選択し直さなければいけません! フォーム(1)に戻った時コンボボックスAに入力した値を選択させておくにはどの様にすれば良いか アドバイスよろしくお願いいたします。 WIN XP ACCESS 2003で作成しています。

  • [Access2013]リストボックスの値指定

    以下の様な事をしたいと思っていますが上手く行きません。 上手くいく方法はありますでしょうか? テーブル1 id 名称 →列名 1 みかん 2 りんご 30 トマト 上記の様なテーブルがありそれをフォーム上に配置したリストボックス(複数選択可)の値集合ソースにしています。 リストボックスから入力した値は、みかんのみを選択した場合は「1」、みかんとりんごを選択した場合は「1;2」とDBに保存しています。 (この部分は想定通りの動きをしています。) 入力用フォーム以外に、別フォームのデータシートビューで一覧表示をしています。 そこで上記リストボックス値でDBに入っている「1」や「1;2」を「みかん」や「みかん;りんご」と表示したいと思っています。 データシートビューにもリストボックスを配置し、値集合ソースは入力フォームと同じテーブル1に、コントロールソースを「1;2」が入っているフィールドにしましたが、「1」のみの場合は選択状態で表示されますが、「1;2」の場合未選択になってしまいます。 やりたいことは、ここで入力をするつもりはありませんのでただ文字列として「みかん;りんご」が出てくればいいです。 ただ、一々フォームロードなどでSQL文(+ループ処理)を書くと件数が数万件は少なくともあるのでロード時の待ちが長くなりそうです。 また、リンクテーブルマネージャで外部DBと接続しているので、テーブル定義をAccess独特のものに変更するのは難しいです。 idは自然増加に任せており桁数はまちまち、複数選択の個数も1~数十と様々です。 質問内容 ・リストボックスのコントロールソースにて複数値を指定する方法はありますか?(そもそもとして、そういうことが出来ないものなのでしょうか? また,区切りに変更、splitで配列化等はすでに行って駄目でした。) ・処理時間に影響が少ない方法で「みかん;りんご」とデータシートビューに表示する方法はありますでしょうか? ・例えばリストボックスを使用せずテキストボックス等に変更してコントロールソースでselect 名称 from テーブル1 where id in Replace("1;2",";",",")の様な事をした結果複数件出た場合は区切り文字で区切って全部出す等を可能なのでしょうか? よろしくお願いいたします。

  • アクセスでコンボボックスに表示されるリストの順番が狂ってしまう!

    アクセスでコンボボックスに表示されるリストの順番が狂ってしまう! アクセスのフォームでコンボボックスを使用しています。コンボボックスで表示されるデータは他のテーブルの値を表示させているんですが、その値が勝手に昇順?に並べ替えられてしまい困っています。テーブル作成時に入力した順番か、もしくは任意に表示させる方法はないでしょうか? ちなみにアクセス2000です。どうぞよろしくお願いいたします。

  • ACCESS2000の帳票フォームでテキストボックスの入力値を取得したい

    こんにちは。ACCESS2000でツールを作成しています。 テーブルはExcelにリンクさせ、クエリを介して帳票フォームで データを表示しています。 帳票フォームのレコード毎にテキストボックスを追加して それぞれ入力できるようにし、その値をVBAで取得したいのですが どうすればよいでしょうか。 テキストボックスを追加して実行すると、一つのテキストボックスに 入力した値が全てのレコードに反映されているようです。 帳票フォームのしくみがよく分かりません。 どなたか教えていただけないでしょうか。 宜しくお願いします。

  • Access2003 リストボックスの制限

    お世話になります。 環境:Access2003 以前、フォーム上にリストボックスを設置し、あるテーブルの内容をそのまま表示し、テキストボックスにListcountで算出した行数も表示するよう作成しておりました。 現状、そのテーブルは20万レコードを超えており、久しぶりに当該フォームを開いたところ、Listcountが65534と表示されました。リストボックスを見てみると確かにテーブル全てのレコードが表示されている訳ではなさそうでした。 また、リストボックスのプロパティより集合ソースを見ると、ちゃんとテーブル全てのレコードは表示されましたので、リストボックスの制限により6万ぐらいしか表示されてないと見受けられるのですが。。 Accessのリストボックスには表示できるレコード数(サイズ?)などの制限があるのでしょうか。 以上、宜しくお願い致します。

  • Accessのリストボックスを使って抽出

    抽出用のフォームを作成しているのですが、その中にリストボックスがあり、何も選択しなかった場合は、すべての項目が表示される様にしたいと思っております。自分なりに色々と調べたのですが、どうしても希望の動作になりません。どの様にすれば良いのか教えて頂けないでしょうか? Access2003を使用しております。 Form-A(メインフォーム名)←テーブルAを元に作成(項目名同じ) 番号(主キー)、氏名、性別、A1、A2・・・ A1、A2は、する・しないのどちらかを入力。 Form-B(サブフォーム名)←テーブルBを元に作成(項目名同じ) ID(主キー)、番号、担当、訪問日、次回訪問日、期間 担当は、値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあ(フィールドは担当のみ)5名程の名前を登録しし、リストボックスにて選択できる様にしています。 現在、下記の様な抽出用のフォームがあります。 Form-抽出(抽出用フォーム名) A1(チェックボックス) A2(チェックボックス) 担当(リストボックス:値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあを設定) [OK]ボタンを押すと抽出(クエリQにて条件を設定)する様にしています。 クエリQ(テーブルA、テーブルBを元に作成) 番号(主キー)、氏名、性別、A1、A2、ID(主キー)、番号、担当、訪問日、次回訪問日、期間 現在設定しているのは、 A1の抽出条件:IIf([forms]![Form-抽出]![A1]=True,True,False) A2の抽出条件:IIf([forms]![Form-抽出]![A2]=True,True,False) 担当の抽出条件:[Forms]![Form-抽出]![担当リストボックス] 訪問日の抽出条件(複数情報がある為、最近の訪問日のデータのみ対象となる様にしています。):DMax("訪問日","テーブルB","[テーブルB]![番号] ='" & [テーブルB]![番号] & "' And 訪問日 <Date()") 今の設定ですと、担当を選択しなかった場合、何も抽出されてきません。 これを、すべて表示出来る様にしたいのが希望です。 Access初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますので、どうぞよろしくお願い致します。

専門家に質問してみよう