Excel VBA質問箱 IV

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

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


4462 / 13645 ツリー ←次へ | 前へ→

【56475】複数パラメタを指定する選択クエリで「引数が・・・」のエラー パンチパーマSE 08/6/18(水) 17:32 質問[未読]
【56476】Re:複数パラメタを指定する選択クエリで「... パンチパーマSE 08/6/18(水) 17:36 発言[未読]
【56482】Re:複数パラメタを指定する選択クエリで「... neptune 08/6/18(水) 22:33 発言[未読]
【56487】Re:複数パラメタを指定する選択クエリで「... パンチパーマSE 08/6/19(木) 10:09 発言[未読]
【56492】Re:複数パラメタを指定する選択クエリで「... neptune 08/6/19(木) 13:11 発言[未読]
【56539】Re:複数パラメタを指定する選択クエリで「... パンチパーマSE 08/6/20(金) 10:08 お礼[未読]
【56547】Re:複数パラメタを指定する選択クエリで「... neptune 08/6/20(金) 11:58 発言[未読]

【56475】複数パラメタを指定する選択クエリで「引...
質問  パンチパーマSE  - 08/6/18(水) 17:32 -

引用なし
パスワード
   VBA初心者です。
Excel2007でVBAを使用して、Access2007をデータベースとして
使用しています。
Access上に作った、複数パラメタを指定する選択クエリを
以下のコードで実行すると、
「引数が間違った型、許容範囲外、または競合しています」
というエラーが出てしまいます。
このクエリは、テーブルの「月度」というテキスト型の列に対して
「between [開始月度] and [終了月度]」という
条件を指定して、この期間の明細を選択表示するものです。

******** コード ********
  Dim myConnect As ADODB.Connection
  Dim myRSet As ADODB.Recordset
  Dim myCommand As ADODB.Command

  Set myConnect = New ADODB.Connection

  myConnect.Open "File Name=c:\DataLink.udl"
  
  Set myRSet = New ADODB.Recordset
  Set myCommand = New ADODB.Command

  With myCommand
    .ActiveConnection = myConnect
    .CommandText = "Q_複数パラメタの選択クエリ"
  End With

  '暫定対応
  myArray = Array(
          Format(Worksheets("Sheet1").Range("A1").Value, "yyyymm"),
          Format(Worksheets("Sheet1").Range("B1").Value, "yyyymm"))

  Set myRSet = myCommand.Execute(Parameters:=myArray)
*************************

Sheet1の「A1」「B1」には、「2008/06/01」「2008/07/01」の値が
入っており、セルの書式設定にて「yyyy年mm月」の設定を
行っております。

イミディエイトウィンドウで
Format(Worksheets("Sheet1").Range("A1").Value, "yyyymm")
を調べたところ、「200806」という値が帰ってきました。

ちなみに、Access上でこのクエリを実行すると、
「200806」「200807」を指定して、正常に動作します。

どなたかお助けください。

【56476】Re:複数パラメタを指定する選択クエリで...
発言  パンチパーマSE  - 08/6/18(水) 17:36 -

引用なし
パスワード
   補足ですが、選択クエリのパラメタ指定を片方無くし、
単独のパラメタ指定のクエリに変更すると、正常に
動作します。

***** コード *****
Set myRSet = myCommand.Execute
       (Parameters:=
        Format(Worksheets("Sheet1").Range("A1").Value, "yyyymm"))
**********************

すみませんが、よろしくお願いします。

【56482】Re:複数パラメタを指定する選択クエリで...
発言  neptune  - 08/6/18(水) 22:33 -

引用なし
パスワード
   ▼パンチパーマSE さん:
こんにちは

Access2007は持ってませんが、ADOなら同じじゃないだろうかと言う事で。

データ型のにおいがしますね。
////////////////以下MSDNより引用//////////////
Parameters
省略可能です。CommandText または CommandStream で指定した入力文字列
またはストリームと組み合わせて使われているパラメータ値を、バリアント型
(Variant) の配列で指定します。出力パラメータをこの引数で渡しても、
正しい値は返されません。
/////////////////引用ここまで/////////////////

若しくは、createparameterで明示的にキッチリ、データ型を指定してやる
方法を取るとか?こっちが確実な手とは思います。

【56487】Re:複数パラメタを指定する選択クエリで...
発言  パンチパーマSE  - 08/6/19(木) 10:09 -

引用なし
パスワード
   ▼neptune さん:
>若しくは、createparameterで明示的にキッチリ、データ型を指定してやる
>方法を取るとか?こっちが確実な手とは思います。

いつもありがとうございます。
CreateParameterの方法を試してみます。
使い方を習得するのに少し時間をください。

回避しようとして、問題の選択クエリのSQLを使用して、
以下のようにすると、正常に動作しました。
やはりパラメタのデータ型が明示されていないので、
エラーになっていたのでしょうかね?

With myRSet
  .ActiveConnection = myConnect
  .Source = "SELECT ・・・ from Table " _
     & "Where 月度 between '"
     & Format(Worksheets("Sheet1").Range("A1").Value, "yyyymm")
     & "' And '"
     & Format(Worksheets("Sheet1").Range("B1").Value, "yyyymm")
     & "' ) ;"
    .Open
  End With

【56492】Re:複数パラメタを指定する選択クエリで...
発言  neptune  - 08/6/19(木) 13:11 -

引用なし
パスワード
   ▼パンチパーマSE さん:
こんにちは


>回避しようとして、問題の選択クエリのSQLを使用して、
>以下のようにすると、正常に動作しました。
>やはりパラメタのデータ型が明示されていないので、
>エラーになっていたのでしょうかね?
私はもっぱらCreateParameterの方のやり方が判りやすいのでそちらを
使いますので、引数のほうで複数のパラメータ渡しはやったこと無いんですが、

又、勘で書きますと、
Worksheets("Sheet1").Range("A1").Value
で日付型のデータが格納されて、format関数で文字列型になるわけなので
本来は、問題は無いはずなんですが、よくある暗黙の型変換
が勝手にどこかで行われているのかもしれませんね。(Accessの方かな??)

でも、このせいかどうかはわかりませんが、いずれにしろデータ型をキッチリ
したら、原因の切り分けは1つできますからやる価値はあると思います。

【56539】Re:複数パラメタを指定する選択クエリで...
お礼  パンチパーマSE  - 08/6/20(金) 10:08 -

引用なし
パスワード
   ▼neptune さん:
>私はもっぱらCreateParameterの方のやり方が判りやすいのでそちらを
>使いますので、引数のほうで複数のパラメータ渡しはやったこと無いんですが、
>
>いずれにしろデータ型をキッチリ
>したら、原因の切り分けは1つできますからやる価値はあると思います。

ありがとうございました。CreateParameterはまだ習得できていませんが、
がんばります。

【56547】Re:複数パラメタを指定する選択クエリで...
発言  neptune  - 08/6/20(金) 11:58 -

引用なし
パスワード
   ▼パンチパーマSE さん:
こんにちは

もう見ないかもしれませんが、失礼します。

今、気が付いたんですが、文字列に対してbetweenを使ってますね。

確か、文字列でbetweenの使用は文字コード順か、辞書順での比較になりますよね。
承知の上で使っているだろうし、今回の件には関係ないとは思いますが、
一応書いておきます。

4462 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free