今だけ人気マンガ100円レンタル特集♪

いつもお世話になりますm(_ _)m

access VBAをかじり始めた「超・初心者」です(^^;)

フォームの画面にテキストボックスを作成し、そこに入力した値を取得したいのですが、どのようにすればよろしいのでしょうか?別に置いたコマンドボタンをクリックすると取得するようにしたいのです。

気軽に、コマンドボタンのイベントプロシージャに、
-----
dim rec as variant
rec=textbox1.text   'recは、「テキストボックス1」に入力した値
-----
なんてやってみたんですが、全然ダメで、いろいろ検索してもさっぱり分かりません。

あほくさいほど初歩的な質問で恐縮ですが、なにとぞよろしくお願いいたしますm(_ _)m

xp+access2003です。

このQ&Aに関連する最新のQ&A

A 回答 (12件中1~10件)

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の代入の
 間でエラーが発生したとわかります)
コード作成中は、面倒でもこうしておくと、どこでエラーが起きたか特定しやすく
なりますので、これも参考までに。

この回答への補足

ご回答、ありがとうございますm(_ _)m

ご教示のフォームをさっそく作ってみました。すると、「438:オブジェクトは、このプロパティ、またはメソッドをサポートしていません。Stage=0」と出てきます。

全く意味が分かりません(^^;)

なにとぞご指導のほど、よろしくお願い申し上げます<(_ _)>

補足日時:2006/12/06 17:13
    • good
    • 1
この回答へのお礼

>最初のご質問文の中でも「textbox1/テキストボックス1」と表記揺れがありますので、
まずこの点(→フォームとコードでの名前の一致)をもう一度確認してみて下さい。

この点の確認を怠っていましたので、あらためて「テキストボックス」「プロパティ」「その他」「名前」のところを確認しましたところ・・・(^^;)(^^;)(^^;)

全くその通りでしたm(_ _)m

大勢の皆さんに大変なお手数をおかけいたしました。まことに申し訳ございません<(_ _)>

初心者“以前”の間抜けなミスで、穴があったら入りたい気持ちです。

これに懲りず、これからもご指導・ご教授のほど、よろしくお願い申し上げます<(_ _)>

DexMachinaさんへの御礼で、ご回答下さった皆さんへの御礼をかねさせていただきます。まことにありがとうございました。

お礼日時:2006/12/15 18:35

約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などのライブラリ
についても、同様にしてみて下さい。
(万が一修復で戻らないと困るので、元のファイルは削除せずあくまでダミー化で)

この回答への補足

DexMachinaさんにもお手数をおかけしました。

ちょっと頭を冷やしてよくよく考え直してみたいと思います。

これまでいろいろとご教示、ありがとうございました<(_ _)>

補足日時:2006/12/13 19:26
    • good
    • 0

進展しているのか、余計に泥沼に引きずり込んでいるだけのような気もします・・・


テスト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 …
あっ!。新たな泥沼へのご招待かもしれない・・(^^ゞ ご参考までに。

この回答への補足

>あっ!。新たな泥沼へのご招待かもしれない・・(^^ゞ ご参考までに

私の“山勘”ですが、きっとどこかに、トンデモナイ“ポカ”があるような気がしてきました。

ACCESSの場合は、設定項目が多く、細かくアレンジできるのはいいのでしょうが、煩わしい面もあります(^^;)

しばらく頭を冷やして考えてみます。いろいろとご教示いただき、ありがとうございました<(_ _)>

補足日時:2006/12/13 19:23
    • good
    • 0

なんでかな~


これを標準モジュールに貼り付けて実行してイミディエイトウィンドウに
何が出力されますか??
※フォームは開いて置いて下さい。またフォーム名は実際の名前で。

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/CD01 …

この回答への補足

>なんでかな~

ホントにお手数をおかけいたしております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
-----
これだけです。

ご教示のコードで、値が取得できていますので、解決しそうな“予感”はしてきました・・・(^^;)

補足日時:2006/12/12 18:13
    • good
    • 0

多分、至極簡単なところの見落としのような気がするのですが


直接触れる事が出来ないので、隔靴掻痒の感。

前回のレスで誤解を与えてしまうような表現がありましたので訂正。
> 編集タブの「変数の宣言を強制する」にチェックが入ってなかったら
> 入れてみてください
> 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   
で 何を言ってきます?

この回答への補足

大変お手数をおかけしておりますm(_ _)m

>で 何を言ってきます?

このケースですと「Nullの使い方が不正です」と出てきます。

コードは以下の通りで至極簡単なものです。

Dim rec As variant
rec = Me!textbox1.Value
MsgBox "textbox1=" & rec
End Sub

この場合は、メッセージボックスが表示されて「textbox1=」とだけ表示されます。イミディエイト ウインドウで、debug print すると「null」と表示されます。

ということは、テキストボックスに入れた値を全然、受け取っていないということなんでしょうね(^^;)

さっぱり訳が分かりません!!!

補足日時:2006/12/11 18:10
    • good
    • 0

VBEの方のツール→オプションにて


編集タブの「変数の宣言を強制する」にチェックが入ってなかったら
入れてみてください
Option Explicit ←これが各モジュールの頭(二行目)にあれば不要です。

あと、デバッグ → ○○のコンパイルで、無事に終了するかも確認を。

・・の一つ覚えですが、新規MDBに全てインポートか最適化。
Accessのサービスパックはあたってます?

この回答への補足

>編集タブの「変数の宣言を強制する」にチェックが入ってなかったら入れてみてください

はい、入れてみました。が、変化はありません(^^;)

>Option Explicit ←これが各モジュールの頭(二行目)にあれば不要です

これは最初からありませんでした。

>あと、デバッグ → ○○のコンパイルで、無事に終了するかも確認を

特に異常はないようです。

>・・の一つ覚えですが、新規MDBに全てインポートか最適化

やってみましたが、やはり「Null値の使い方が不正です」というメッセージが出ます。

>Accessのサービスパックはあたってます?

2003のサービスパックというのが、ダウンロードリストに見あたらないのですが・・・。

補足日時:2006/12/10 00:09
    • good
    • 0

No.6です。



> 以上4個すべてにチェックが入っています。

だとすると、参照先のライブラリファイルが破損しているのかもしれません。
(Nz関数、No.1で回答した「.Value」とも、Access Object関連なので、
 今回ご質問の件は、そこに集約される気がします)

あいにく、私自身はこような事例に遭ったことがないので推測になりますが、
Accessの再インストールで復旧するかもしれません。

但し、単にアンインストール&再インストールだけ行うと、ライブラリファイルは
そのまま残る可能性があった気がします。
ですので、まずアンインストール後にそのファイルがどうなっているかを確認し、
残ったままだった場合はそれを一旦別名で保存するなどしてダミー化してから
(→後で戻せなくなると困るので、削除はしない)再インストールすれば、
ライブラリファイルも同時にインストールされるのではないかと思います。

なお、もしかしたらインストール時のオプションで「カスタム」を選択すれば、
Access本体のアンインストールはせずに、ライブラリファイルのみの復旧(?)が
可能かもしれません。
(やったことがないので、全くの憶測ですが・・・)

ライブラリファイルの場所についてはこちらを参考に;
(No.3の方ご紹介のサイトとともに、こちらのサイトのサンプルもよく参考にさせて
 戴いています)
http://www.tsware.jp/download/tsdoc2005/html1/re …


> 簡単そうに見えるのに、なぜうまく行かないのか?不思議でなりません。

・・・心中お察し致します。
私もAccessの経験は十年に満たない(しかもコードをいじるようになってからは
まだ1年ちょっと)程度ですが、ご質問のようなトラブルは初めてです。
(私の場合はプログラムミスでのトラブルが殆どなので、自分の責任ですから・・・)

この回答への補足

>だとすると、参照先のライブラリファイルが破損しているのかもしれません

そんな状態なんですか、私のACCESSって・・・(^^;)

>アンインストール&再インストール

なんて、余り気が進みません。これに先だって、他にもコードを書いたのですが、こちらは異常なく動いています。webから自動的にサイトをダウンロードして、ACCESSのデータベースに追加してゆくものですが・・・。

>・・・心中お察し致します

ありがとうございますm(_ _)m

ひょっとしたら、実に簡単な“ポカ”をしているのかも知れない・・・という淡い期待を持っている状態です。

しかし、コード的にはこれ以上ない単純なものですから、そんなことも考えにくいし・・・。

もう少し皆さんからのご回答を待ってみます。ご教示・ご指導、ありがとうございましたm(_ _)m

補足日時:2006/12/07 21:34
    • good
    • 0

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のバージョンで既定の設定値が変わる
  ので、数値は省略。

この回答への補足

再度のご回答、ありがとうございます。


・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
です。

簡単そうに見えるのに、なぜうまく行かないのか?不思議でなりません。

補足日時:2006/12/06 23:48
    • good
    • 0

フォームのデザインビューで


メニュー → 表示 でフィールドリストってのが有りますので
そこの一覧にあります?
あるいはどこかの変数とダブっているとか?
ついでに思い出しました
VBEではないほうの画面のツール→オプション→全般タブの「名前の自動修正」は、
チェックを外しておいたほうが無難のようです。
便利な機能ではありますが、時々いたずらしますので・・

前回のリンク先の教材ですが理解するには結構長い時間が必要かと
思われますので、あせらないで確実に進めてゆけば良いと思います。

この回答への補足

ご回答、ありがとうございますm(_ _)m


メニュー → 表示 でフィールドリストってのが有りますので
そこの一覧にあります?


はい、ちゃんと「textbox1」とあります。


VBEではないほうの画面のツール→オプション→全般タブの「名前の自動修正」は、チェックを外しておいたほうが無難のようです


はい、外してみました。

すると、エラーメッセージがこれまでとは違い「Nullの使い方が不正です」と出ました(^^;)
どういう意味でしょうか?

補足日時:2006/12/06 17:10
    • good
    • 0

dim rec as variant


rec=textbox1.text
textbox1 と言われてもAccess君は何のことか分かりません。
自身のフォーム上のテキストボックスコントロールでしたら
rec = Me!textbox1

他のフォームなら
rec = Forms!フォーム名!textbox1
として下さい。

http://www.accessclub.jp/beginer/index.html
などでサンプルを調べてみると勉強になると思います。

この回答への補足


textbox1 と言われてもAccess君は何のことか分かりません。
自身のフォーム上のテキストボックスコントロールでしたら
rec = Me!textbox1


とのことですが、これも既に試してみました。すると、「指定した式で参照されている'textbox1'フィールドが見つかりません」と出てきます。「textbox1」を「フィールド名」と誤解しているのでしょうか?

ご案内のサイトは覗いたことがあるのですが、分量が多いので、時間を掛けて調べてみます。

しかし、一体どうなってるんでしょうか(^^;)

取り急ぎ、ご回答御礼までm(_ _)m

補足日時:2006/12/05 17:42
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessでテーブルの値をテキストボックスに代入するには?

[ID][文字列]の2つのフィールドからなる単純なテーブルがあり、削除クエリを併用して常に最新のデータしか格納されていない状態に工夫できました。(データは常に1つ)
そこでフォーム上にあるテキストボックスにこのテーブルの[文字列]フィールドのデータを表示させたいのですが、
どうしたらよいでしょうか?

また、このテーブルの[文字列]フィールドのデータを直接変数として使いたい場合はVBAでどのように記述すればよいのでしょうか?

Aベストアンサー

テーブルに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名")」
IDごとに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名","[ID]='" & Me.ID & "'")」

Dlookup関数のヘルプ
http://office.microsoft.com/ja-jp/assistance/HP010496551041.aspx

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

Qテキストボックスにクエリ結果を表示させたい

フォームにテキストボックスAがあり、そこに入力した文字(下記テーブルのフィールド1の文字)をクエリーの「抽出条件」にし、同じフォーム上のテキストボックスBに表示しようと思っています。

クエリを開くとパラメータの入力を求めてきて、入力するとうまく抽出されます。

テーブルは
フィールド1|フィールド2
  A   |  10
  B   |  20
  C   |  30
  D   |  40
のような簡単なものです。

テキストボックスBのコントロールソースに
「=[○×クエリ]![フィールド2]とやっても「#Name?」と表示されてしまいます。

どのようにやればよいのでしょうか?

Aベストアンサー

クエリは必要ありません。

フォームのレコードソースに無いデータを表示させる
場合には DLookUp を使います。

テキストボックスBのコントロールソースに
=DLookUp("フィールド2","テーブル名","フィールド1='" & [テキストボックスA]) & "'"

上記は「フィールド1」が文字列型の場合です。

数値型の場合は次のようになります。
=DLookUp("フィールド2","テーブル名","フィールド1=" & [テキストボックスA])

DLookUp 関数は コントロールソースに限らず
VBA でも使用し、Access では、非常に使用頻度の高いものです。

ヘルプで調べて、ぜひマスターしてください。

もし Access でなかったら、このレスは無視して下さい。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング