• ベストアンサー

access テキストボックスの値取得

いつもお世話になりますm(_ _)m access VBAをかじり始めた「超・初心者」です(^^;) フォームの画面にテキストボックスを作成し、そこに入力した値を取得したいのですが、どのようにすればよろしいのでしょうか?別に置いたコマンドボタンをクリックすると取得するようにしたいのです。 気軽に、コマンドボタンのイベントプロシージャに、 ----- dim rec as variant rec=textbox1.text   'recは、「テキストボックス1」に入力した値 ----- なんてやってみたんですが、全然ダメで、いろいろ検索してもさっぱり分かりません。 あほくさいほど初歩的な質問で恐縮ですが、なにとぞよろしくお願いいたしますm(_ _)m xp+access2003です。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.5

No.1です。 No.3の方の回答のように「Me!」を使ったときに「'textbox1'フィールドが見つかりません」 というエラーが返されるのだとすると、そのフォームに「textbox1」というコントロールがなく、 レコードソースとなるテーブル(連結フォームの場合)にも同名のフィールドがない、 ということになります。 最初のご質問文の中でも「textbox1/テキストボックス1」と表記揺れがありますので、 まずこの点(→フォームとコードでの名前の一致)をもう一度確認してみて下さい。 ただ、単に「フォーム上のコントロール/テーブル上のフィールド」に存在しないものを 指定した場合、通常返されるのは「変数が定義されていません」というメッセージで、 「オブジェクトが必要です」とは言われないと思うので、他にも問題を抱えた部分が あるように思います。 参考になるかわかりませんが、テキストボックスに入力した値を元に、簡単な式で 処理した結果を返すコードを、サンプルとして提示しますので、よければ動作を 確認してみて下さい。 作成手順;  1)新規フォームを作成  2)テキストボックス2つ(TB1,TB2)とコマンドボタン(Cmd1)を設置  3)Cmd1のクリック時イベントに下記のコードを貼り付け   (このとき、「Private Sub ~」と「End Sub」の行は、重複させないで下さい)  4)適当な名前をつけてフォームを保存 '~~~以下を貼り付け~~~ Private Sub Cmd1_Click() On Error GoTo エラー処理 '変数Stageは、エラーがどこで発生したかを把握するのに使用 Dim Rec As String, Stage As Integer Stage = 0 'RecにTB1の値を代入(RecをStringとしたため、TB1がNullの場合は 'エラーとなるのを、Nz関数で長さ0の文字列に変換することで回避) Rec = Nz(TB1) Stage = 1 'TB2にメッセージを表示 TB2 = "入力値は「" & Rec & "」です。" Stage = 2 Exit Sub エラー処理: 'エラー発生時、エラー情報と発生位置(=Stage)を表示 MsgBox Err & ":" & Error$ & Chr(13) & "Stage= " & Stage, , Me.Name & " Cmd1_Click" Exit Sub End Sub '~~~以上を貼り付け~~~ なお、サンプル中の「Rec=Nz(TB1)」を「Rec=TB1」に変更した後、TB1が空(Null)の 状態でCmd1をクリックすると、エラー時の動作を確認できます。 (エラーメッセージに「Stage= 0」と表示されるので、Stage=0とStage=1の代入の  間でエラーが発生したとわかります) コード作成中は、面倒でもこうしておくと、どこでエラーが起きたか特定しやすく なりますので、これも参考までに。

prairie-gentian
質問者

お礼

>最初のご質問文の中でも「textbox1/テキストボックス1」と表記揺れがありますので、 まずこの点(→フォームとコードでの名前の一致)をもう一度確認してみて下さい。 この点の確認を怠っていましたので、あらためて「テキストボックス」「プロパティ」「その他」「名前」のところを確認しましたところ・・・(^^;)(^^;)(^^;) 全くその通りでしたm(_ _)m 大勢の皆さんに大変なお手数をおかけいたしました。まことに申し訳ございません<(_ _)> 初心者“以前”の間抜けなミスで、穴があったら入りたい気持ちです。 これに懲りず、これからもご指導・ご教授のほど、よろしくお願い申し上げます<(_ _)> DexMachinaさんへの御礼で、ご回答下さった皆さんへの御礼をかねさせていただきます。まことにありがとうございました。

prairie-gentian
質問者

補足

ご回答、ありがとうございますm(_ _)m ご教示のフォームをさっそく作ってみました。すると、「438:オブジェクトは、このプロパティ、またはメソッドをサポートしていません。Stage=0」と出てきます。 全く意味が分かりません(^^;) なにとぞご指導のほど、よろしくお願い申し上げます<(_ _)>

その他の回答 (11)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.12

約1週間ぶりですが(汗)、No.7です。 > >アンインストール&再インストール > なんて、余り気が進みません。 Access2000で確認したところ、AccessObjectのライブラリファイルの損傷であれば、 Accessの再インストールまでしなくても、自動修復機能で対応可能であることが わかりました。 以下、手順をお知らせします; 1)以下のファイルの名前を適当に変える(「~\Dummy_MSACC.OLB」など)  C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB  (以上はAcc2003の場合の既定の位置。Acc2000の場合は   C:\Program Files\Microsoft Office\OFFICE\MSACC9.OLB)  *もしくは、別フォルダへのファイル移動でも可 2)AccessObjectを使用したmdbファイル(→現在エラーを起こしているファイル)を  起動させる(もしかしたら単にAccessの起動だけでOKかもしれませんし、  逆に、エラーを起こしている動作まで実行させる必要があるかもしれません) 3)「修復しますか?」という趣旨のエラーが出たら、「はい」を選択 ・・・以上です。 上記ファイルの損傷によるエラーであれば、これでAccessObjectのライブラリ ファイル(MSACC.OLB)が再成されることにより、解決する可能性があります。 (ちなみに、こちらで試した限りでは、インストールディスクを要求されることは  ありませんでした;サービスパックを当てたもののため、HDD内に元のファイル  ば存在、という可能性もあるので、そちらでも同じになるかはわかりませんが) よろしければお試し下さい。 なお、上では「AccessObject」に決め打ちしていますが、これをやってもエラーが 発生するようでしたら、No.7で貼り付けたサイトを参考に、VBAなどのライブラリ についても、同様にしてみて下さい。 (万が一修復で戻らないと困るので、元のファイルは削除せずあくまでダミー化で)

prairie-gentian
質問者

補足

DexMachinaさんにもお手数をおかけしました。 ちょっと頭を冷やしてよくよく考え直してみたいと思います。 これまでいろいろとご教示、ありがとうございました<(_ _)>

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.11

進展しているのか、余計に泥沼に引きずり込んでいるだけのような気もします・・・ テスト1 他のPCで問題のMdbを開いてやってみる   問題なければご質問者のPCに問題あり     ヘルプのメニューの中のアプリケーションの修復。検証。     Accessの再インストール。検証。     OSから全てインストールのやり直し。※検証。     (OSインスト時にはアンチウィルスソフトは※検証後に入れる)     の順番で行ってみる      テスト2 テスト1で問題があった場合   Mdbに問題がありそうなので     新規MDBにテーブルとクエリだけをインポート     フォームはインポートせずに、一から作り直し     問題のイベントの記述から先に進めてゆく。    位しか思いつきません。 > Debug.Print ctl.Name & vbTab & ctl.Value ではこちらではエラーとは なっておりませんし・・・ なんか変 他のPCが無ければこの様な物で http://www.microsoft.com/japan/windows/virtualpc/default.mspx あっ!。新たな泥沼へのご招待かもしれない・・(^^ゞ ご参考までに。

prairie-gentian
質問者

補足

>あっ!。新たな泥沼へのご招待かもしれない・・(^^ゞ ご参考までに 私の“山勘”ですが、きっとどこかに、トンデモナイ“ポカ”があるような気がしてきました。 ACCESSの場合は、設定項目が多く、細かくアレンジできるのはいいのでしょうが、煩わしい面もあります(^^;) しばらく頭を冷やして考えてみます。いろいろとご教示いただき、ありがとうございました<(_ _)>

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.10

なんでかな~ これを標準モジュールに貼り付けて実行してイミディエイトウィンドウに 何が出力されますか?? ※フォームは開いて置いて下さい。またフォーム名は実際の名前で。 Sub test() Dim frm As Form Dim ctl As Control Set frm = Forms("フォーム名") For Each ctl In frm   If TypeName(ctl) = "TextBox" Then     Debug.Print ctl.Name & vbTab & ctl.Value   End If Next End Sub そもそもVariant 型なら何でも格納されるはずなんですけどね。 例えNullであっても。 しつこいようですが実際のコードを Sub ・・・ から End Sub までコピペしてアップして下さい サービスパックはSP1のようですね。ヘルプ バージョンで確認してあたってたらOK http://office.microsoft.com/ja-jp/downloads/CD010798671041.aspx

prairie-gentian
質問者

補足

>なんでかな~ ホントにお手数をおかけいたしておりますm(_ _)m >これを標準モジュールに貼り付けて実行してイミディエイトウィンドウに何が出力されますか?? やってみましたところ、各フィールドの値がすべて表示され、「テキスト1」の値も、ちゃんと表示されました! ただし、「ドット()、! 演算子、かっこ()の使い方が正しくありません」というエラーメッセージが出ます。該当するコードは、 ----- Debug.Print ctl.Name & vbTab & ctl.Value ----- の部分です。 >しつこいようですが実際のコードを ----- Private Sub コマンド2_Click() Dim rec As Variant rec = Me!textbox1.Value MsgBox "textbox1=" & rec Debug.Print rec End Sub ----- これだけです。 ご教示のコードで、値が取得できていますので、解決しそうな“予感”はしてきました・・・(^^;)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.9

多分、至極簡単なところの見落としのような気がするのですが 直接触れる事が出来ないので、隔靴掻痒の感。 前回のレスで誤解を与えてしまうような表現がありましたので訂正。 > 編集タブの「変数の宣言を強制する」にチェックが入ってなかったら > 入れてみてください > Option Explicit ←これが各モジュールの頭(二行目)にあれば不要です。 変数の宣言を強制する」にチェックが入っていれば 自動的に各モジュールの先頭に「Option Explicit 」が自動的に挿入されますので (チェックは)「不要です。」という意味です。 こんな風であればOK Option Compare Database Option Explicit Private Sub Cmd1_click()   'あーたらこーたら End Sub Private Sub Form_Open(Cancel As Integer)   '処理 End Sub 本題に戻ります。 コマンドボタンの所のコードを丸ごとアップしてあったら良かったのですが (次回のアップを希望) dim rec as variant msgbox me!textbox1 '追加 rec=me!textbox1    で 何を言ってきます?

prairie-gentian
質問者

補足

大変お手数をおかけしておりますm(_ _)m >で 何を言ってきます? このケースですと「Nullの使い方が不正です」と出てきます。 コードは以下の通りで至極簡単なものです。 Dim rec As variant rec = Me!textbox1.Value MsgBox "textbox1=" & rec End Sub この場合は、メッセージボックスが表示されて「textbox1=」とだけ表示されます。イミディエイト ウインドウで、debug print すると「null」と表示されます。 ということは、テキストボックスに入れた値を全然、受け取っていないということなんでしょうね(^^;) さっぱり訳が分かりません!!!

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.8

VBEの方のツール→オプションにて 編集タブの「変数の宣言を強制する」にチェックが入ってなかったら 入れてみてください Option Explicit ←これが各モジュールの頭(二行目)にあれば不要です。 あと、デバッグ → ○○のコンパイルで、無事に終了するかも確認を。 ・・の一つ覚えですが、新規MDBに全てインポートか最適化。 Accessのサービスパックはあたってます?

prairie-gentian
質問者

補足

>編集タブの「変数の宣言を強制する」にチェックが入ってなかったら入れてみてください はい、入れてみました。が、変化はありません(^^;) >Option Explicit ←これが各モジュールの頭(二行目)にあれば不要です これは最初からありませんでした。 >あと、デバッグ → ○○のコンパイルで、無事に終了するかも確認を 特に異常はないようです。 >・・の一つ覚えですが、新規MDBに全てインポートか最適化 やってみましたが、やはり「Null値の使い方が不正です」というメッセージが出ます。 >Accessのサービスパックはあたってます? 2003のサービスパックというのが、ダウンロードリストに見あたらないのですが・・・。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.7

No.6です。 > 以上4個すべてにチェックが入っています。 だとすると、参照先のライブラリファイルが破損しているのかもしれません。 (Nz関数、No.1で回答した「.Value」とも、Access Object関連なので、  今回ご質問の件は、そこに集約される気がします) あいにく、私自身はこような事例に遭ったことがないので推測になりますが、 Accessの再インストールで復旧するかもしれません。 但し、単にアンインストール&再インストールだけ行うと、ライブラリファイルは そのまま残る可能性があった気がします。 ですので、まずアンインストール後にそのファイルがどうなっているかを確認し、 残ったままだった場合はそれを一旦別名で保存するなどしてダミー化してから (→後で戻せなくなると困るので、削除はしない)再インストールすれば、 ライブラリファイルも同時にインストールされるのではないかと思います。 なお、もしかしたらインストール時のオプションで「カスタム」を選択すれば、 Access本体のアンインストールはせずに、ライブラリファイルのみの復旧(?)が 可能かもしれません。 (やったことがないので、全くの憶測ですが・・・) ライブラリファイルの場所についてはこちらを参考に; (No.3の方ご紹介のサイトとともに、こちらのサイトのサンプルもよく参考にさせて  戴いています) http://www.tsware.jp/download/tsdoc2005/html1/referenceslist.htm > 簡単そうに見えるのに、なぜうまく行かないのか?不思議でなりません。 ・・・心中お察し致します。 私もAccessの経験は十年に満たない(しかもコードをいじるようになってからは まだ1年ちょっと)程度ですが、ご質問のようなトラブルは初めてです。 (私の場合はプログラムミスでのトラブルが殆どなので、自分の責任ですから・・・)

prairie-gentian
質問者

補足

>だとすると、参照先のライブラリファイルが破損しているのかもしれません そんな状態なんですか、私のACCESSって・・・(^^;) >アンインストール&再インストール なんて、余り気が進みません。これに先だって、他にもコードを書いたのですが、こちらは異常なく動いています。webから自動的にサイトをダウンロードして、ACCESSのデータベースに追加してゆくものですが・・・。 >・・・心中お察し致します ありがとうございますm(_ _)m ひょっとしたら、実に簡単な“ポカ”をしているのかも知れない・・・という淡い期待を持っている状態です。 しかし、コード的にはこれ以上ない単純なものですから、そんなことも考えにくいし・・・。 もう少し皆さんからのご回答を待ってみます。ご教示・ご指導、ありがとうございましたm(_ _)m

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.6

No.5です。 > 438:オブジェクトは、このプロパティ、またはメソッドをサポートしていません。Stage=0 ・・・Nz関数に対応していない、ということですね。 とりあえず、コードを編集する画面のメニューで「ツール→参照設定」を選択して下さい。 『参照設定』ダイアログが開きますが、ひょっとして、その中の「Microsoft Access ○.○ Object Library」のチェックが外れたりしていないでしょうか・・・? (ヘルプの関数リファレンスで調べたところ、Nz関数はどうやらVBAではなくそちらで  規定されているようなので) 今回も、参考になるかわかりませんが、私のAccess(ac97)でチェックがオンになっている ものを以下に挙げておきます; ・Visual Basic for Applications ・Microsoft Access ○.○ Object Library ・Microsoft DAO ○.○ Object Library 職場のac2000ではこの他に、Microsoft ActiveX Data Objects ○.○ Library(ADO)と ・・・他に1,2個チェックがついていた気もします(汗) (OLE Automation、だったかも・・・) とりあえず、この(ADOを含めた)4つのチェックがついているかどうか確認して下さい。 (チェックが外れていたらオンにして動作確認、もしオンにできなければAccessの  再インストール・・・ぐらいしか思いつきません)  *文中の「○.○」はバージョン番号。Accessのバージョンで既定の設定値が変わる   ので、数値は省略。

prairie-gentian
質問者

補足

再度のご回答、ありがとうございます。 > ・Visual Basic for Applications ・Microsoft Access ○.○ Object Library ・Microsoft DAO ○.○ Object Library ... Microsoft ActiveX Data Objects ○.○ Library(ADO)と > 以上4個すべてにチェックが入っています。また、 >OLE Automation にも、チェックが入っていました。 >文中の「○.○」はバージョン番号 Microsoft Access ○.○ Object Library・・・11.0 Microsoft DAO ○.○ Object Library・・・3.6 Microsoft ActiveX Data Objects ○.○ Library(ADO)・・・2.5 です。 簡単そうに見えるのに、なぜうまく行かないのか?不思議でなりません。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

フォームのデザインビューで メニュー → 表示 でフィールドリストってのが有りますので そこの一覧にあります? あるいはどこかの変数とダブっているとか? ついでに思い出しました VBEではないほうの画面のツール→オプション→全般タブの「名前の自動修正」は、 チェックを外しておいたほうが無難のようです。 便利な機能ではありますが、時々いたずらしますので・・ 前回のリンク先の教材ですが理解するには結構長い時間が必要かと 思われますので、あせらないで確実に進めてゆけば良いと思います。

prairie-gentian
質問者

補足

ご回答、ありがとうございますm(_ _)m > メニュー → 表示 でフィールドリストってのが有りますので そこの一覧にあります? > はい、ちゃんと「textbox1」とあります。 > VBEではないほうの画面のツール→オプション→全般タブの「名前の自動修正」は、チェックを外しておいたほうが無難のようです > はい、外してみました。 すると、エラーメッセージがこれまでとは違い「Nullの使い方が不正です」と出ました(^^;) どういう意味でしょうか?

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

dim rec as variant rec=textbox1.text textbox1 と言われてもAccess君は何のことか分かりません。 自身のフォーム上のテキストボックスコントロールでしたら rec = Me!textbox1 他のフォームなら rec = Forms!フォーム名!textbox1 として下さい。 http://www.accessclub.jp/beginer/index.html などでサンプルを調べてみると勉強になると思います。

prairie-gentian
質問者

補足

> textbox1 と言われてもAccess君は何のことか分かりません。 自身のフォーム上のテキストボックスコントロールでしたら rec = Me!textbox1 > とのことですが、これも既に試してみました。すると、「指定した式で参照されている'textbox1'フィールドが見つかりません」と出てきます。「textbox1」を「フィールド名」と誤解しているのでしょうか? ご案内のサイトは覗いたことがあるのですが、分量が多いので、時間を掛けて調べてみます。 しかし、一体どうなってるんでしょうか(^^;) 取り急ぎ、ご回答御礼までm(_ _)m

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.2

取得というのは非連結テキストボックスの値を テーブルのフィールドに挿入ということでしょうか? Private Sub ボタン名_Click() Me.フィールド名 = テキストボックス名 End Sub ボタンを押した時に選択したレコードのフィールドにテキストボックスの値がセットされます。

prairie-gentian
質問者

補足

ご回答、ありがとうございますm(_ _)m > 取得というのは非連結テキストボックスの値を テーブルのフィールドに挿入ということでしょうか? > いえ、テキストボックスの値を取得して、そのあとのプロシージャで使用したいのです。テキストボックスから値を取得して、その数字をもとにVBAで計算などしてゆこうと考えているわけです。 例えば、フォームフィルターを使わずに、テキストボックスに入力した値でフィルターを掛けるとか・・・。 ラベルが「氏名」であるテキストボックスに「山田」と入力したら、「山田某」という名前の人のデータがテーブルから抽出されて、フォーム上に表示されるようにしたいのですが・・・。 なんか、基本的に“方法”が間違っているのかも知れません(^^;)

関連するQ&A