プロが教えるわが家の防犯対策術!

ACCESS2007を使用しています。

マクロで、パラメータ付きのクエリを動かしたいのですが、
どのようにパラメータをセットすればよいのでしょうか。

そのままマクロを実行すると、パラメータを要求するboxが表示されます。
本来なら、パラメータには初期値をセットして、何も手を加えずにマクロを実行したいのです。

よろしくお願いします。

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

A 回答 (5件)

No.1です。



> この、「キー送信」というアクションがないような・・・

Access2007では、初期設定では、一部のアクションしか表示されなく
なっています。

「キー送信」など、全てのアクションを表示させるには、適当なマクロを
デザインビューで開いて、『デザイン』リボンの『表示/非表示』タブの
『すべてのアクションを表示』ボタンをクリックしてオン(オレンジ色表示)に
して下さい。

・・・なのですが・・・(汗)

> コードAには、[forms]![フォーム画面]![txtコードA]としています。

前回の回答は、「[forms]![フォーム画面]![txtコードA]」の形ではなく、
「[検索条件は?]」といった1組の角括弧で括ったパラメータを条件に
したものを想定していました(=フォームが開いているかどうかに関わらず
常にパラメータダイアログが出るタイプ)。
この場合でも「キー送信」でパラメータを渡すことはできるのですが、
前回回答でも触れたように、「キー送信」は確実性に欠けます。

ですので、フォーム参照型のクエリなのでしたら既に回答がある通り、
クエリ実行前にフォームを開くか、フォーム自体に今回のクエリを開く
ボタンを設置するか、で対応された方がよいと思います。

なお、フォームとクエリを開いた後、「閉じる」アクションを使って、すぐに
そのフォームを閉じているようでしたら、「フォームを開く」アクションでは
『ウィンドウ モード』引数を「非表示」にすることをお勧めしておきます。

また、今後「パラメータを初期値以外にしたい」といった場合があれば、
「フォームを開く」と「クエリを開く」の間に、「値の代入」を指定して、
「[forms]![フォーム画面]![txtコードA]」に値を入力することもできます
ので、併せて参考まで。


※Accessは、「現在開いているフォームの一覧」のようなものを内部に
 持っています(=Formsコレクション)。
 「[Forms]![フォーム画面]」というのは、このコレクションの中から、
 「フォーム画面」という名前のものを参照する、という意味です。
 従って、「フォーム画面」が開いていない状態では、コレクションに
 該当するものが見つからないため、パラメータダイアログで値が要求
 されることになります。
    • good
    • 0
この回答へのお礼

DexMachinaさん、ありがとうございます。

>「キー送信」というアクションがないような・・・
質問した後にすぐわかりました。
すべて最初から表示されていたわけではなかったのですね。


>クエリ実行前にフォームを開くか、フォーム自体に今回のクエリを開くボタンを設置するか、で対応された方がよいと思います。
「キー送信」が確実性に欠けるようでしたら、この方法で試してみます。

参考になりました。
また、よろしくお願いします。

お礼日時:2009/09/07 09:54

>ただ、これだけのことでよかったのかな。



フォームを閉じたまま手作業でクエリを開くとパラメータ入力のダイアログが表示されますが、フォームを開いておけばダイアログを表示することなくクエリを開くと思います。それと同じです。
クエリに「[forms]![フォーム画面]![txtコードA]」を設定しても、閉じたフォームを自動的にメモリに読み込まんだりはしないということでしょう。
    • good
    • 1
この回答へのお礼

cistronezkさん、ありがとうございます。

基本的なことをわかっていなかったようです。

助かりました。
また、よろしくお願いします。

お礼日時:2009/09/07 09:49

>コードAには、[forms]![フォーム画面]![txtコードA]としています



フォーム「フォーム画面」を開いた状態でも駄目ということでしょうか?

この回答への補足

cistronezkさん、こんにちわ。

先ほどの補足に、
(1)アクションには、”クエリを開く”を指定・・・
 としましたが、この前に、
アクションとして、”フォームを開く”を設定すると、うまくいきました。
ただ、これだけのことでよかったのかな。

補足日時:2009/09/04 15:09
    • good
    • 0

>そのままマクロを実行すると、パラメータを要求するboxが表示されます。



どういうマクロでしょうか?

この回答への補足

ACCESS2007のマクロ作成にて、
まず、
(1)アクションには、”クエリを開く”を指定、
 引数には、”クエリ名”、”データシートビュー”、モードは”編集”としています。
ここで使われるクエリは、パラメータを要求するクエリです。
具体的には、コードAという列に、フォームで入れられた値で選択しようとしています。
コードAには、[forms]![フォーム画面]![txtコードA]としています。

今回は、このクエリをフォーム画面からではなく、別の使い方で、
マクロを使って指定した値でクエリを動かしたいのです。
マクロの中で、この”[forms]![フォーム画面]![txtコードA]”にセットすればいけるのではないかと思うのですが、その方法がわかりません。
上記(1)の前に何かが必要なのでしょうか。

補足日時:2009/09/04 10:02
    • good
    • 1

> マクロで、パラメータ付きのクエリを動かしたいのですが、


> どのようにパラメータをセットすればよいのでしょうか。

クエリそのものを編集(または複製)して、パラメータの代わりに
セットしたい初期値を条件に指定、では問題があるのでしょうか(汗)


・・・とりあえず、問題がある、と仮定して、「キー送信(SendKeys)」を
使用した一案を提示しますが、この方法は通常の方法に比べて
動作の確実性が落ちますので、あまりお勧めできません(汗)

【「マクロ」オブジェクトの場合】
 「クエリを開く」アクションの前に「キー送信」アクションを追加します。
  ・「キー操作」引数には、「(パラメータに渡す値){Enter 2}」を指定。
   ※パラメータの初期値が「Test」なら、
     Test{Enter 2}
    と指定。
  ・「待機」引数は、既定値の「いいえ」のまま

【モジュール(VBA)の場合】
 「DoCmd.OpenQuery」の前に「SendKeys」を追加します。
 ※パラメータの初期値が「Test」の場合、
   SendKeys "Test{Enter 2}", False
  と指定。
  

※「{Enter 2}」は、Enterキーを2回押す動作を意味します:
 ・IMEがオンになっている場合、1回目で文字変換の確定を、2回目は
  パラメータダイアログのOKボタンのクリックを、それぞれ行います。
 ・IMEがオフの場合は、選択クエリならデータシート内の移動に
  なるだけですが、追加クエリなどの場合は確認メッセージで
  既定のボタンを自動でクリックしたことになるので注意が必要です。
  IMEを確実に制御できるなら、オフにした上で、「{Enter 2}」を
  「{Enter}」(=Enterキーの送信を1回のみ行う)にした方が無難です。

この回答への補足

DexMachinaさん、こんにちわ。

初歩的なことなのかもしれませんが、
>【「マクロ」オブジェクトの場合】
> 「クエリを開く」アクションの前に「キー送信」アクションを追加.
この、「キー送信」というアクションがないような・・・

ACCESS2007では別の表現になったのでしょうか。

おそらく、この方法がいければしたいことができる気がします。

補足日時:2009/09/04 10:19
    • good
    • 1

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

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

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

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

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

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QVBAからクエリのパラメータを設定したいです。

いつもお世話になっております。

クエリーは全く同じ内容ですが、
複数のフォームにパラメータを入力するユーザーインターフェースのため、ク
エリーを複数用意して、それぞれに
[forms]![F_TEST]![テキスト名]というパラメータを設定し、フォームの帳票やレポートの帳票に出力していま
した。

このクエリを一本にして、VBAから動的にパラメータを参照するフォームを指定
できないでしょうか?

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

Aベストアンサー

再びmaruru01です。
既存のクエリもVBAのSQLステートメント化をお奨めします。
それを標準モジュールに、

Public Sub myRunSQL(Para As String)

  Dim SQL As String

  SQL = "(SQL文の前の方)" & Para & "(SQL文の後ろの方)"
  DoCmd.RunSQL SQL

End Sub

という風にそれぞれのクエリを各プロシージャにしておけば、どこからでも呼び出せるわけです。
すでに作ってあるクエリを書き直すのは面倒ですが、一度書いてしまえばあとは楽です。
また、まったく同じじゃないんだけど結構似てるというクエリは、プロシージャをコピーして名前と中身をかえてやればすぐ出来るわけです。
ちなみに私は、基本的には、クエリもマクロも使用せず、すべてVBAで書いています。
では。

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 フォームを開くと「パラメーターの入力」ウィンドウが開いてしまう

access2007
OS:winXP
 access初心者です。
 テーブルにて主キーの変更を行なったらその後フォームを開くたびに「パラメーターの入力」ウィンドウが勝手に出てくるようになってしまいました。
 何も入力せずにOKを押せばそのままフォームは開くのですが煩わしいので非表示にしたいです。
 変更するにはどのようにしたら良いのでしょうか?また、再発防止のためになんでこのような設定になってしまったのかも教えていただけるとありがたいです。

Aベストアンサー

横レス失礼致します。

> 「パラメーターの入力」ウィンドウに出てくる項目はテーブルからは消去したのですが、
> フォームのデザインビューで表示されるフィールドリストの中には残っていました

フィールドリストに残っているということは、そのフォームのレコードソースに指定している
テーブル/クエリに、その名前のフィールドがある、ということを意味しています。
テーブルからは削除済みとのことですので、恐らくそのフォームはレコードソースに
クエリ(又はSQL文)を使用しているものと推測します。

テーブルから削除されたフィールドがクエリ内に残っていると、そのクエリを実行したとき
(→そのクエリをレコードソースとするフォームを開いた場合を含む:コントロールでの
使用有無は問いません)に、「パラメータの入力」ダイアログが表示されます。
ですので、まずはレコードソースに指定しているクエリまたはSQL文の中に、テーブルから
削除したフィールドが残っていると思いますので、探してみてください。
(フィールドリストに、そのフィールドの名前が出ている(=「式1」などになっていない)という
 ことは、クエリのデザインビュー上で「フィールド名: ~」とするか、SQL文上で「As」を
 使用して、別名をつけているものと思います)

横レス失礼致します。

> 「パラメーターの入力」ウィンドウに出てくる項目はテーブルからは消去したのですが、
> フォームのデザインビューで表示されるフィールドリストの中には残っていました

フィールドリストに残っているということは、そのフォームのレコードソースに指定している
テーブル/クエリに、その名前のフィールドがある、ということを意味しています。
テーブルからは削除済みとのことですので、恐らくそのフォームはレコードソースに
クエリ(又はSQL文)を使用しているものと推測します...続きを読む

QAccess パラメータクエリーをVBAで実行

初めての質問になります、宜しくお願いします。

Access2007でのPG開発を行っています。

Insertのパラメータクエリーを作成してました(以下Q_Inst)。

VBA側でパラメータをセットして実行するとエラーが出てしまいます。

実行時エラー3265
要求された名前、または・・・

dbCmd.CommandText = "Q_Inst"
dbCmd.CommandType = adCmdStoredProc
dbCmd.Parameters.Refresh
dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー
dbCmd.Parameters("[Name]") = TanakaTarou
dbCmd.Parameters("[Birth]") = "1980/12/01"

ADODB.Command をあまり使わないので勝手がいまいち分かりません。
SELECT、INSERT、UPDATEは今までdbCon.Execute(strSQL)でstrSQLの中にべた書きしてました。

エラーの対処方法をご教授お願い致しますm( _ _ )m

初めての質問になります、宜しくお願いします。

Access2007でのPG開発を行っています。

Insertのパラメータクエリーを作成してました(以下Q_Inst)。

VBA側でパラメータをセットして実行するとエラーが出てしまいます。

実行時エラー3265
要求された名前、または・・・

dbCmd.CommandText = "Q_Inst"
dbCmd.CommandType = adCmdStoredProc
dbCmd.Parameters.Refresh
dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー
dbCmd.Parameters("[Name]") = TanakaTarou
dbCmd.Parameters("[Birt...続きを読む

Aベストアンサー

以下もみてください。

ADOでのパラメータクエリの使用例

http://www.accessclub.jp/ado/createparameter.html
http://www.accessclub.jp/ado/refresh.html

QACCESSでVBAから選択クエリの抽出条件を指定したい

選択クエリの抽出条件はデザインビューの「抽出条件」欄に直接条件式を書き込むのが普通だと思いますが、この条件式をVBAで記述することは出来るでしょうか?

DoCmd.RunSQL ではアクションクエリしか実行できないようだし、
DoCmsOpenQuery では引数に抽出条件を指定することが出来ないし困っています。

Aベストアンサー

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてます(^^)

ちなみに、
Me.
と打ち込んだ時点でオートコンプリート(名称あってるかな~)
機能が働いて参照できるオブジェクトが表示される
はずです。
その中にKojiさんが書いた埋め込みオブジェクトが
きっとあるはず
もしかすると"FormA"とか名前を付けたつもりでも
Visual Basic Editor君が気を利かせて
Form_formA
とかになってる場合があります。
最近やってないんでうろ覚えなんですが、こんな処を注意すれば大丈夫!

追伸
このコードって検索とかで使えますから
覚えておくときっと役に立ちますよ♪

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてま...続きを読む

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

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

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

Aベストアンサー

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

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
とすれば良いでしょう。

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

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

こんにちは。

Access初心者です。

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

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

Aベストアンサー

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

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

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


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

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

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

Me.CurrentRecord

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

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を見た人がよく見るQ&A

人気Q&Aランキング