既存のプログラムを元に、
以下のようなソースを作成したのですが、
取得出来ませんでした。
参照設定やパスの設定、SQL文は正しいです。
どこがマズイのでしょうか?
アドバイスをお願い致します。
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim SQL As String
'データベース接続
Set db = OpenDatabase("DBのパス")
'データ検索SQL
SQL = ""
SQL = " SELECT文 "
'ACCESSより取得
Set rs = db.OpenRecordset(SQL)
db.Close
rs.Close
No.10
- 回答日時:
>Getrowsの箇所(※の箇所)を、GetValuesにすると
>コンパイルエラー「メソッドまたはデータ メンバが見つかりません」
あちゃ、またチョンボしちゃいました。すみません。
Getrowsが正解です。
>「カレントレコードがありません」のエラーが出ます。
そのままです。レコードが取得されていません。
Debug.Print SQL
で、SQL文を表示してみてください。
せっかく直前に設定した年月日の条件、何にも入っていませんよね。
そのSQLですと、日付が'取得開始日'という文字列から'取得終了日'という文字列の間のものを抽出しようとします。
もちろんそんなのないのでレコードが取得できないわけです。
SQL = " SELECT * From カレンダー where 日付 between " & 取得開始日 & " and " & 取得終了日 & " order by 日付 ; "
としてください。
あと、9月より大きい月、0ついちゃってますよ。
#おまけにアドバイス。
取得開始日 = 年 * 10000 + 月 * 100 + 1
だったら月の桁数気にしなくても・・・
回答ありがとうございます。
SQLの発行はうまくいきましたが、
SQL発行以下で質問があります。
'レコードセット取得
Set rs = db.OpenRecordset(SQL)
Set vntValues = rs.GetRows(最大値)
Debug.Print vntValues(0, 0)
vntValuesはvariant型で定義したのですが、
「型が一致しません」のエラーになりました。
String型など他の型を使ってみましたが、ダメでした。
アドバイスや他のやり方などがありましたら、
書き込みお待ちしております。
No.9
- 回答日時:
>SQL文を書くと、
>
>SELEST * FROM カレンダー
>WHERE 日付 BETWEEN YYYYMM+01 AND YYYYMM+その月の最終日
#7の方の他に、あと
ORDER BY 日付
を入れたほうがいいんでは?
>取得したその月の日付と休日状況を、配列なり変数なりに
>入れるということです。
ということであれば、DAOを使っていることですし、
GwrRowsメソッドを使えば一発です。
'ACCESSより取得
Set rs = db.OpenRecordset(SQL)
Dim vntValues As Variant
Set vntValues = rs.GetValues(31) '最高で31行
Debug.Print vntValues(0, 0) '最初の行の最初の列の値
rs.Close
db.Close
vntValuesは、レコードがあれば2次元の配列になっています。
>う~ん。一つ気になったのがtaka_tetsuさんのNo6の回答の中で
>loopの前に"rs.MoveNext" が抜けているように思います。
>
>これはどうですか?MoveNextしないと永久ループになるのですが?
失礼しました。チョンボしました(^^;;
ないとまずいですね。
でも、上の例では要らないです。
回答ありがとうございます。
回答を元に、以下のソースを作りました。
'データベース接続
Set db = OpenDatabase("DBのパス", True)
'データ検索SQL
SQL = ""
If 月 <= 9 Then
取得開始日 = 年 & 0 & 月 & 0 & 1
取得終了日 = 年 & 0 & 月 & 表示月の最終日
End If
If 月 > 9 Then
取得開始日 = 年 & 0 & 月 & 0 & 1
取得終了日 = 年 & 0 & 月 & 表示月の最終日
End If
SQL = " SELECT * From カレンダー where 日付 _
between '取得開始日' and '取得終了日 ' order by 日付 ; "
'レコードセット取得
Set rs = db.OpenRecordset(SQL)
Dim vntValues As Variant
Set vntValues = rs.Getrows(表示月の最終日)※
Debug.Print vntValues(0, 0)
rs.Close
db.Close
End Select
これを実行すると、
「カレントレコードがありません」のエラーが出ます。
ヘルプを表示しても参照出来ませんでした。
DBもデータもSQLもチェックしましたが、ダメでした。
Getrowsの箇所(※の箇所)を、GetValuesにすると
コンパイルエラー「メソッドまたはデータ メンバが見つかりません」
(Error 461)が出ました。
環境設定が間違っているのでしょうか?
No.8
- 回答日時:
こんにちは No7のものです
>SELEST * FROM カレンダー
>WHERE 日付 BETWEEN YYYYMM+01 AND YYYYMM+その月の最終日
>SELEST * FROM カレンダー
>WHERE 日付>= YYYYMM+01 AND 日付=< YYYYMM+その月の最終日
了解です。YYYYMM+01とYYYYMM+その月の最終日の部分というのは
200210+01で20021001となっているから
↓正解ということですよね。
>日付の文字列編集はOKでした。
このまま数値だと200210+01で200211となりそうですが・・・
>また、ACCESSでSQL文のチェックも行いました。
ちゃんとクエリを実行されましたか?
その時結果のシートも表示されましたか?
それでる駄目ということは
う~ん。一つ気になったのがtaka_tetsuさんのNo6の回答の中で
loopの前に"rs.MoveNext" が抜けているように思います。
これはどうですか?MoveNextしないと永久ループになるのですが?
No.7
- 回答日時:
こんにちは
>SQL文でBETWEEN文を使ったり、
>for文を使って1回ずつSQLを切ったりしたのですが、ダメでした。
>申し訳ありませんが、再度アドバイスを頂ければ幸いです。
ということですが、どういうSQL文なのか示していただかないと
みんな答えようがないと思います。
で、ですね。私がよくやる、SQL文がうまく動かない場合のデバッグ
方法を書きますのでご自身でチャレンジしてください
1.アクセスからVBへ、SQLの貼り付け
これはやりたいことがわかっている場合、アクセスでクエリを作成し
それが正しければ、SQL文を表示しVBへコピペ。
2.VBからアクセスへ、1.の逆です
VBのデバッグウィンドでSQL文を表示させ、アクセスのクエリにコピペ
ちょっとした構文のタイプミスでもSQL文のエラーになるので
正常に動くVBのSQLでアクセスにクエリ化しもそこに手を加えていく
というやり方がいいでしょう
回答ありがとうございます。
どういうSQL文かと言うと
カレンダーと言うテーブルがありまして、
指定した年月分の内容を取得するものです。
カレンダーの構成はこうなっています。
・日付(数値型8桁、YYYYMMDD)
・休日(YES/NO型、休日はオン)
例えば2002年xx月分のデータを取得するとしたら、
2002xx01TRUE, 2002xx02TRUE…といったように
取得したその月の日付と休日状況を、配列なり変数なりに
入れるということです。
SQL文を書くと、
SELEST * FROM カレンダー
WHERE 日付 BETWEEN YYYYMM+01 AND YYYYMM+その月の最終日
又は
SELEST * FROM カレンダー
WHERE 日付>= YYYYMM+01 AND 日付=< YYYYMM+その月の最終日
です。
日付の文字列編集はOKでした。
また、ACCESSでSQL文のチェックも行いました。
再度アドバイス等頂ければ幸いです。
No.6
- 回答日時:
では、途中から
'ACCESSより取得
Set rs = db.OpenRecordset(SQL)
'最後のレコードまで取得
Do While rs.EOF = False
'下の3種類のどの方法でもかまいません。
'速度的には下になるほど遅くなります
Debug.Print rs(0) 'SELECT文中の、一番左の項目
Debug.Print rs![フィールド名]
Debug.Print rs("フィールド名")
Loop
'クローズ(後から開いたものを先に閉じましょう)
rs.Close
db.Close
回答ありがとうございました。
上記のソースを使って動かしてみたら、
取得は出来ました。
Set rs = db.OpenRecordset(SQL)の部分のSQLを、
範囲指定して複数の内容を取得し、配列の中に格納したいのですが、
SQL文でBETWEEN文を使ったり、
for文を使って1回ずつSQLを切ったりしたのですが、ダメでした。
申し訳ありませんが、再度アドバイスを頂ければ幸いです。
No.4
- 回答日時:
>こけた所は、プログラムを実行しても
>取得が出来ませんでした(set rsの所)
ということは、エラーは発生していないということなんですけど。
>Debug Printを使うと「型が一致しません」の
>エラーになりました。
あのう、rsをDebug.Printしてもオブジェクトなんで中身が見えるわけではないのですが・・・
Recordsetは、”取得したレコードの結果のセットです”
もしかして、rsの中身に単純に文字列が入っているとお考えでしょうか?
あと、
>Set rs = db.OpenRecordset(SQL)
と、
>db.Close
>rs.Close
の間の処理はどうされていますか?
>もしかして、rsの中身に単純に文字列が入っているとお考えでしょうか?
その通りです(^^;
SELECT文の結果が入ってくると思っていました。
処理としてはSELECT文の結果を取得したいだけなので、
その方法例を教えて頂ければ幸いです。
No.3
- 回答日時:
No.2
- 回答日時:
こんばんわ。
確かにtaka_tetsuさんのおっしゃる通り、どこでこけてるのかわからないです。
ので、私なら
dim ws as workspace
dim db as database
dim rs as recordset
set ws = dbEngine.workspace(0)
set db = ws.opendatabase("dbpath",true)
set rs = db.openrecordset("select・・・",dbopendynaset)
てな感じでアクセス使ってます。
手法はいろいろあると思いますので、参考程度に・・・
>回答者の方へ
回答ありがとうございます。
こけた所を書いていませんでしたね。
すみませんでした。
こけた所は、プログラムを実行しても
取得が出来ませんでした(set rsの所)
Debug Printを使うと「型が一致しません」の
エラーになりました。
このプログラムの中には、INSERT文を使って
処理する箇所がありまして、そちらは
正常終了するのですが。SELECT文の箇所はダメでした。
引き続き、書き込みをお待ちしております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
実行時エラー3131 FROM 句の構文エラーです について
Access(アクセス)
-
アクセス VBAについて FROM句の構文エラー
Access(アクセス)
-
エクセルVBA オートフィルタでの絞り込みと並び替えについて
Excel(エクセル)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
VBAをつかってクエリの情報を抽...
-
PHP(PDO)でDBの情報を完全一...
-
SQL文が実行できません
-
エラー3011
-
SELECT文を発行して、ACCESSよ...
-
codeigniter 複数モデルでトラ...
-
バイナリ画像データのサイズ変更
-
テキストボックスに入れた内容...
-
MySQLについて
-
MySQLでデータベースにデータin...
-
Accessへ日付をINSERT
-
ACCESSのテーブルをHTMLファイ...
-
PHP初心者です。syntax error, ...
-
phpで複数の検索語を検索対象に...
-
DB(MySQL)から複数行のデータを...
-
insert1つの処理でもトランザ...
-
JAVA SQLServerException 列名 ...
-
INSERT,DELETEを同時に
-
SQLのif()に関して。。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
VBAをつかってクエリの情報を抽...
-
SQL文が実行できません
-
エラー3011
-
テキストボックスに入れた内容...
-
Accessのテーブルへ複数の主キ...
-
PEAR でprepareメソッドがエラーに
-
LocalのNotesメールDBをVBAで参...
-
PHP(PDO)でDBの情報を完全一...
-
時刻型にNULLでセットしたい
-
SQL文の実行に失敗しました???
-
ASPでRecordCountが使用でき...
-
SELECT文を発行して、ACCESSよ...
-
in 'where clause'のエラーの理由
-
データフォームウィザードで追...
-
得られた処理結果を、その前の...
-
データ入力条件
-
PHP5でpostgresqlのデータベー...
-
ExcelVBAでAccessのデータを検...
-
PHP内でUPDATE構文を使用してい...
おすすめ情報