Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


49 / 500 ページ ←次へ | 前へ→

【12337】パラメータが少なすぎます。1を指定して...
質問  まくりや  - 13/6/18(火) 15:47 -

引用なし
パスワード
   前回と同じような質問ですがよろしくお願いします。

クエリをそのままクリックするときちんとでるのに

Dim db As DAO.Database
Dim rsa As DAO.Recordset
Set db = CurrentDb()
Set rsa = db.OpenRecordset("クエリ名")
MsgBox (rsa!項目)
rsa.Close: Set rsa = Nothing
db.Close: Set db = Nothing

VBAで書くと、上記題名がでます。
パラメータをフォームからとってくるクエリです。

何か、クエリの書き方に工夫がいるのでしょうか。
何か、設定がいるのでしょうか。
・ツリー全体表示

【12336】Re:アクションクエリ(テーブル作成)を...
回答  かるびの  - 13/6/15(土) 3:27 -

引用なし
パスワード
   >db.Execute "クエリー名"
 SQL文を引数とするExecuteメソッドは、さんざん使ってきましたが、
クエリ名も引数にとれるんですね。初めて知りました。

さて、
>パラメータが少なすぎます。1を指定して下さい。
とのエラーが出た以上、アクションクエリを実行できるはずです。

 このエラーはアクセスをいじっていると、頻出するエラーです。
 そして、何を言っているのか、メッセージの意味がわからないエラーの代表でもあります。

 このエラーは、アクセスが認識できないフィールド名がクエリにあるときに
起こります。

 そのクエリを直接、データベースウィンドウから開くと、
パラメータ・ボックスが出るはずです。
 そして、パラメータ・ボックスには、フィールド名が記載されています。
それが、アクセスが認識できないフィールド名です。
 そのフィールド名を直してやれば、アクションクエリが実行されるはずです。
・ツリー全体表示

【12335】アクションクエリ(テーブル作成)をVBA...
質問  まくりや  - 13/6/14(金) 13:12 -

引用なし
パスワード
   いつもお世話になっています。
下記のようにVBAに書いたところ

Dim db As DAO.Database
Set db = CurrentDb()
db.Execute "クエリー名"
db.Close

パラメータが少なすぎます。1を指定して下さい。

とでました。

このような、VBAではアクションクエリは操作できないのでしょうか。
・ツリー全体表示

【12334】Re:BETWEENを使った検索、片方のみ入力さ...
お礼  nneeww  - 13/6/12(水) 13:53 -

引用なし
パスワード
   クエリを変えることを全く思いつきませんでした。

> ただ、この方法は、odf、odtともにNullの場合には使えないですね。
これをどう処理してよいかわからなかったので最終的に場合分けを行うことで解決しました。
(なぜ使えないのかすらわかっていないレベルなので勉強します;)
具体的には、between odf and odt,sp,cmの三つで場合分けを行っていたのをbetwee odf and odt,sp,cm,odfの四つで場合分けを行い、odtのみの入力を拒むようにしました。

無事目的を果たすことができ、とても助かりました。
どうもありがとうございました。
・ツリー全体表示

【12333】Re:BETWEENを使った検索、片方のみ入力さ...
回答  かるびの E-MAIL  - 13/6/11(火) 14:41 -

引用なし
パスワード
    クエリ「結果表示」の日付についての抽出条件欄において、
コントロールを参照しているところに、Nz関数をかませたらどうでしょうか。

 例えば、odfの代わりに、
   Nz(odf.Value,odt.Value)
とする方法です。
 odfがNullの場合、この関数はodtの値を返しますので、
odtが2013/6/11とすれば、抽出条件を
   2013/6/11 Between 2013/6/11
とすることができます
(前の2013/6/11はNz関数の適用結果、後はodtの値)。

 ただ、この方法は、odf、odtともにNullの場合には使えないですね。
・ツリー全体表示

【12332】BETWEENを使った検索、片方のみ入力され...
質問  nneeww  - 13/6/11(火) 11:03 -

引用なし
パスワード
   お世話になっております。

複数のテキストボックス(odf,odt,cm,sp)を使って条件を入力し検索を行うフォームを作っています。
odfとodtは日付を入力するテキストボックスで、betweenでodfからodtの期間を指定するようになっています。

二つとも入力が行われれば問題なく検索できるのですが、片方だけの入力だとすべてのデータが表示されてしまいます。
今、両方に日付が入力されていない場合検索が行えないようにしているのですが片方にだけ日付が入った状態で検索が押されたとき、もう一方にも同じ日付が入っているとして検索を行うのが理想です。考えてみましたがどうしたらよいかわかりませんでした。
日付の入力方法はカレンダーをクリックするor手入力(入力規則設定)です。

ご存知の方、どうぞよろしくお願いいたします。


'  入力された値のチェック
  If IsNull(odf) And IsNull(odt) And IsNull(cm) And IsNull(sp) Then
'  /すべて空欄のとき-「すべてのデータを表示しますか?」
    a = MsgBox("すべてのデータを表示しますか?", vbYesNo)
      If a = vbYes Then
        DoCmd.OpenQuery "結果表示"
      End If
      Exit Sub
'  /日付にだけ値が入力されている場合、検索に移る
    ElseIf IsNull(cm) And IsNull(sp) Then
      GoTo kekka
'  /数字以外が含まれているとき-「数字を入力してください」
    ElseIf IsNumeric(cm) = False And IsNumeric(sp) = False Then
      MsgBox "数字を入力してください"
      Exit Sub
'  /桁数が違うとき-「有効な値であるか確認してください」
    ElseIf Len(cm) <> 5 Then
      MsgBox "有効な値であるか確認してください"
      Exit Sub
    ElseIf Len(sp) <> 3 Then
      MsgBox "有効な値であるか確認してください"
      Exit Sub
  End If

'  (Ifに該当しない場合)結果を表示
kekka:
'  /片方にしか日付が入力されていない場合、検索を行わない
  If IsNull(odf) = False Or IsNull(odt) = False Then
    If IsNull(odf) Or IsNull(odt) Then
      MsgBox "日付が片方にしか入力されていません"
    Exit Sub
    End If
  End If
  
  DoCmd.OpenQuery "結果表示"
・ツリー全体表示

【12331】Re:オブジェクト?の指定の仕方がわかり...
お礼  nneeww  - 13/5/30(木) 18:17 -

引用なし
パスワード
   質問させていただいた件ですが、記載していないところに問題がありました。
大変失礼いたしました。
(カレンダーがあるフォーム名とカレンダー名が全く同じだったのが問題でした。)

何もわからなくておろおろしていた所に返信をいただいて本当にありがたかったです。

ご回答いただきありがとうございました。
・ツリー全体表示

【12330】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/30(木) 16:20 -

引用なし
パスワード
   ▼kuma さん:
>T中止テーブルのテーブル名と項目名を見直して、
>コピペでVBAに書き込みましたが、
>
>・DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了日],#1111/11/11#) <> #1111/11/11#"
>
>・DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了日] Is Not Null"
>
>のどちらでも パラメータの入力 [T中止].[中止終了日]
>のインプットボックスが出てしまいます。

ひょっとすると、F顧客 のレコードソースは、T顧客 で、中止終了日 フィールドは含まれていないということかな?

で、対応する T中止 の 中止終了日 に Null があったらその顧客は抽出しないということかな?


DoCmd.OpenForm "F顧客", acNormal, , "DLookup('顧客NO','T中止', '中止終了日 Is Not Null AND 顧客NO=' & [顧客NO]) Is Null"

これでどうだろう。サンプルで確認していないのでミスがあるかも。

考え方は、
DLookup で T中止から顧客NOが一致して中止終了日がNUllのレコードを検索→対象レコードがないとき NUll→結果がNullのレコートを抽出
・ツリー全体表示

【12329】Re:Access VBA OpenFormの抽出条件
お礼  kuma  - 13/5/30(木) 15:45 -

引用なし
パスワード
   返信ありがとうございます。

>> 「パラメータの入力」というインプットボックスが出てきてしまいます。

>その時のボックスの上の標題は何になってますか。
>その標題のものが見つからないということですので、それの記述ミスだと思いますが。

インプットボックスには   [T中止].[中止終了日]   と出ています。
T中止テーブルのテーブル名と項目名を見直して、
コピペでVBAに書き込みましたが、

・DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了日],#1111/11/11#) <> #1111/11/11#"

・DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了日] Is Not Null"

のどちらでも パラメータの入力 [T中止].[中止終了日]
のインプットボックスが出てしまいます。
(念のためVBA上から[T中止]を外して実行してみましたが、
 ボックスの文字が パラメータの入力 [中止終了日]  になっただけでした)
・ツリー全体表示

【12328】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/30(木) 13:33 -

引用なし
パスワード
   > DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],'#1111/11/11#') <> ('#1111/11/11#')"

' と () が余分です。' で囲むと文字列になっちゃいます。あと全角空白がありますが、半角空白にしてください。

DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],#1111/11/11#) <> #1111/11/11#"

繰り返しになりますが、

DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了] Is Not Null"

とするのがペスト解だと思います。

> 「パラメータの入力」というインプットボックスが出てきてしまいます。

その時のボックスの上の標題は何になってますか。
その標題のものが見つからないということですので、それの記述ミスだと思いますが。
・ツリー全体表示

【12327】Re:Access VBA OpenFormの抽出条件
お礼  kuma  - 13/5/30(木) 13:08 -

引用なし
パスワード
   かるびのさん、hatenaさん
返信ありがとうございました。

どうにも上手くいきませんでした。

あがきで、NZ関数に第二引数に1111/11/11という日付を入力しましたが
「パラメータの入力」というインプットボックスが出てきてしまいます。

コマンドはこれです。
DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],'#1111/11/11#') <> ('#1111/11/11#')"

変に難しい事考えないで、別クエリ作って、別フォームを呼び出すようにした方が
早いでしょうか……
・ツリー全体表示

【12325】Re:オブジェクト?の指定の仕方がわかり...
回答  かるびの  - 13/5/30(木) 2:58 -

引用なし
パスワード
   >Accessでのオブジェクト?の指定はどうすれば良いでしょうか?
>(Excelだったら.で繋ぐだけでしたが、違いがありますか?)
 エクセルにおいても「.」でつなぐだけというのは、厳密に言うと、不正確だと思いますが、
大体のところであれば、アクセスでも「.」でつなぐだけという理解でOKです。


>Forms("検索画面").orderformfrom = Me.カレンダー.Value
のコードには特に構文上の誤りはないと思います。

 なお、「.」と「!」の使い分けという観点からすると、
   Forms("検索画面")!orderformfrom = Me!カレンダー.Value
の方が好ましいと思います。

 ひとつ気になるのは、「Forms("検索画面")」です。
 Formsコレクションは、開いているフォームの集まりですから、
このコードの実行時に「検索画面」フォームが閉じていたら、このコードは成功しません。
・ツリー全体表示

【12324】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/29(水) 15:00 -

引用なし
パスワード
   ▼kuma さん:
>単純なので全顧客レコードを引っ張ってくれますが、ここで「中止除く」を選んだ場合に、
>「テーブルT中止の中止終了日が空白の人は抽出条件で弾く」ということをしたいです。
>T中止では顧客NOの重複があります。
>(例えばAさん1回目中止開始2012/12/01 中止終了日2013/01/15
>    Aさん2回目中止開始2013/04/01 中止終了日 (空白というかNull))
>
>作ったVBAは下の通りですが…上手く動きません。
>
>DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

かるびのさんも指摘しているように、) が余分ですね。

"NZ([T中止].[中止終了]) <> """""

これはクエリのWHERE句で
NZ([T中止].[中止終了]) <> ""
と設定したのと同じ事になります。

ここで、中止終了 は日付/時刻型ですよね。
"" は空文字列でテキスト型になります。
これではデータ型違いですね。
NZでの変換と暗黙の型変換で、動作しますが、ちょっと無駄ですね。

Null を除く という条件式は正しくは、

[中止終了] Is Not Null

です。

DoCmd.OpenForm "F顧客", acNormal, , "[中止終了] Is Not Null"
・ツリー全体表示

【12323】オブジェクト?の指定の仕方がわかりませ...
質問  nneeww  - 13/5/29(水) 12:02 -

引用なし
パスワード
   Access初心者です。

フォーム「検索画面」とフォーム「カレンダー」を作成し
1.検索画面のボタンを押すとカレンダーが表示され
2.カレンダーをクリックするとクリックされた日付が検索画面のボックス(orderformfrom)に入力される
というものを作っています。

カレンダーを表示させるところまではdocmdで出来たのですが
二つ目の、カレンダーから元のフォームに値を入力する所ができません。

---------------------------------------------
Public Sub カレンダー_Click()

  Forms("検索画面").orderformfrom = Me.カレンダー.Value
  
End Sub
---------------------------------------------
Forms.検索画面.orderformfromとしてみたりMe!カレンダーとしてみたり
したのですが上手くいきません。

Accessでのオブジェクト?の指定はどうすれば良いでしょうか?
(Excelだったら.で繋ぐだけでしたが、違いがありますか?)
上の例ではどうすればよいのかも教えていただければありがたいです。

どうぞ、よろしくお願いいたします。
・ツリー全体表示

【12322】Re:Access VBA OpenFormの抽出条件
回答  かるびの  - 13/5/29(水) 2:03 -

引用なし
パスワード
   >DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

 まず、第4引数の一番後の閉じ括弧ですが、
これに対応する開き括弧はどこにあるのでしょうか。

 次に、第4引数の「[T中止].[中止終了]」ですが、
確かに、ヘルプを見ると、
「有効な SQL WHERE 句を文字列式で指定します。」と書いてあるし、
「NZ([T中止].[中止終了]) <> """"」というのは、
SQL文のWHERE句の書き方として間違っていないんですね。
 でも、ここはレコードソースのフィールド名を指定すべきです。
 レコードソースのフィールド名には、ほかに同名のフィールド名がなければ、
テーブル名指定の部分は入りません。   

 それから、Nz関数の第2引数はきちんと指定してあげた方がいいと思います。
 第2引数を指定せずにNz関数を適用した場合、数値型なら0が返るし、
テキスト型なら長さ0の文字列が返りますが、
日付型のときに何が返ってくるかちょっと不安だからです。
 また、SQL文の中で、アクセスの関数を、引数を省略して使おうとすると、
SQLがその関数を解釈できないことがあります。
・ツリー全体表示

【12321】Access VBA OpenFormの抽出条件
質問  kuma  - 13/5/28(火) 9:24 -

引用なし
パスワード
   初めて利用します。
Access2010を利用しています。

DoCmd.OpenFormの抽出条件が上手く動かなくて困っています。

【テーブル構成】
T顧客
 ・顧客NO(主キー)
 ・氏名
T中止
 ・中止NO(主キー)
 ・顧客NO(リレーションシップ有り)
 ・中止開始(日付)
 ・中止終了(日付)

【フォーム作成】
フォーム F顧客
フォーム F中止
フォーム 開始

フォーム開始にオプショングループで「中止含む」「中止除く」「中止のみ」を作成してあります。
中止含むの場合は以下のプログラムです

DoCmd.OpenForm "F顧客"

単純なので全顧客レコードを引っ張ってくれますが、ここで「中止除く」を選んだ場合に、
「テーブルT中止の中止終了日が空白の人は抽出条件で弾く」ということをしたいです。
T中止では顧客NOの重複があります。
(例えばAさん1回目中止開始2012/12/01 中止終了日2013/01/15
    Aさん2回目中止開始2013/04/01 中止終了日 (空白というかNull))

作ったVBAは下の通りですが…上手く動きません。

DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

どのようにしたらいいでしょうか。
・ツリー全体表示

【12320】Re:カレンダーコントロールを複数のテキ...
お礼  くやっち  - 13/5/27(月) 16:01 -

引用なし
パスワード
   hatena さん
いつもありがとうございます。

せっかく教えていただき、ホームページも見させていただきましたか、私には理解できる頭がありませんでした。

結局、4種類テキストボックス毎にカレンダーを起動させ、それぞれOPEN、CLOSEのマクロおよびコードを作成し、値を代入する方法が一番わかりやすいのだと考えました。

色々とご迷惑をおかけし、貴重な時間をさいていただき、申し訳ありませんでした。

また何かありましたら、こんな私ですがご指導の程よろしくお願いいたします。
・ツリー全体表示

【12319】Re:カレンダーコントロールを複数のテキ...
回答  hatena  - 13/5/25(土) 8:23 -

引用なし
パスワード
   ▼くやっち さん:
>フォームに年月日を手入力ができるテキストボックスを作りました。
>このテキストボックスをダブルクリックすることでカレンダーが表示され、更に日付をダブルクリックすることで、該当の日にちが入力できるようにしました。
>
>Private Sub カレンダー_DblClick()
>  DoCmd.SelectObject acForm, "サービスフォーム", False
>  Forms!サービスフォーム!受注日 = Me.カレンダー.Value
>  DoCmd.Close acForm, "カレンダー"
>End Sub

カレンダーコントロールは別フォーム「カレンダー」に配置してあるのですね。

テキストボックスをダブルクリックで呼び出すということは、そのテキストボックスにフォーカスがあるということなので、カレンダーフォームが開くときに Screen.ActiveControl で取得出来ます。

カレンダーフォームのモジュールは下記のようになります。

Option Compare Database
Option Explicit
Dim ctl As Control

Private Sub Form_Load()
  Set ctl = Screen.ActiveControl
  If IsDate(ctl.Value) Then
    Me.カレンダー.Value = CDate(ctl.Value)
  Else
    Me.カレンダー.Value = Date
  End If
End Sub

Private Sub Calendar0_Click()
  ctl = Me.カレンダー.Value
  DoCmd.Close acForm, "カレンダー"
End Sub

テキストボックスに既に日付が入力されいるときは、カレンダーもその日付が選択された状態、
日付が入力されていないときは、今日の日付が選択される仕様にしています。

上記の仕様を汎用的な関数にしたサンプルが下記にありますので、ご参考に。

カレンダーコントロールを利用した日付入力汎用関数 - hatena chips
hatenachips.blog34.fc2.com/blog-entry-33.html
・ツリー全体表示

【12318】Re:カレンダーコントロールを複数のテキ...
お礼  くやっち  - 13/5/23(木) 23:52 -

引用なし
パスワード
   かるびの さん:

回答ありがとうございます。
やっぱり変数ですよね。
仰っていることは良く分かります。
しかし、私にはそれをどのように組み込んでいけばよいかさっぱり検討がつきません。
N88BASICなら分かるのですが…(笑)

誠に申し訳ありません。
・ツリー全体表示

【12317】Re:カレンダーコントロールを複数のテキ...
回答  かるびの  - 13/5/23(木) 1:39 -

引用なし
パスワード
    カレンダー・コントロールは使ったことがありませんが、
次のような方法はどうでしょうか。
 
 ダブルクリックされたテキストボックスを格納するモジュールレベル
のオブジェクト変数(データ型はテキストボックス型)を
予め用意しておく。
   例 Dim objDblClickTxt As Textbox
 テキストボックスのダブル・クリックイベントで、
ダブル・クリックされたテキストボックスを上記変数に格納する。
 カレンダーコントロールのダブル・クリックイベントで、
上記変数のValueプロパティにカレンダー・コントロールの日付を代入し、
上記変数を初期化する。
・ツリー全体表示

49 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078291
(SS)C-BOARD v3.8 is Free