- 締切済み
【MS ACCESS】 クエリの結果を文字列で書き出す事に悩んでいます。
お世話になります。 選択クエリの結果を文字列として書き出したいので、いろいろ調べてみると 以下のコードを見つけました。 ======================== Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst .Open "顧客マスタ", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect strData = .GetString(adClipString, 10) Debug.Print strData .Close End With cnn.Close ================================== これはテーブルを文字列としてイミディエイトウィンドに書き出すものなのですが、これがテーブルだけしか使えず、難儀しております。変更しようにもなにぶん実力がないもので手が出ません。 どうぞ、選択クエリの結果を文字列として表示させる方法を教えてください。 お願いします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- CHRONOS_0
- ベストアンサー率54% (457/838)
>「パラメータが少なすぎます。1を指定してください。」 このエラーはパラメータ付きのクエリをVBAで開こうとしたときにでます パラメータはAccessウィンドウからクエリを開くときにしか使えません VBAから開くときにはパラメータを値としてSQLにセットしてやるか QueryDefのParameterオブジェクトに値をセットしてやります ここまでのやり取りから判断させてもらったあなたのVBAの実力では ちょっと難しいかもですね クエリの結果をタブ区切りのテキストファイルにしたいというだけならVBAなど持ち出さず、 [ファイル][エクスポート]で区切り記号にタブを指定するだけでいいんじゃないの
- CHRONOS_0
- ベストアンサー率54% (457/838)
>Dim cnn As New ADODB.Connection >Dim rst As New ADODB.Recordset >Dim strData As String >Set cnn = CurrentProject.Connection >With rst オープンが抜けてます strData="" >Do Until .EOF strData = strData &[商品名] & vbTab & [型番] & vbTab & [単価] & vbCrLf >.MoveNext Loop >Debug.Print strData >.Close >End With >cnn.Close
補足
お世話になります。 お手間をかけていただきありがとうございます。 オープンの記述が間違っているためかこのようなエラーが出ます。 「パラメータが少なすぎます。1を指定してください。」」 クエリだけだと正常に表示しています。 すみませんが、どの行をどのように変更すれば動きますでしょうか? ご迷惑をおかけしますがお答えをいただければ助かります。 よろしくお願いします。 Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst .Open "Q注文内容", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect ←この行でエラー表示 strData = "" Do Until .EOF strData = strData & [商品名] & vbTab & [色] & vbTab & [サイズ] & vbCrLf .MoveNext Loop Debug.Print strData .Close End With cnn.Close なお、クエリは選択クエリで、条件行にはにフォームにある1個のコントロールと合致するものを抽出するようにしています。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>「レコードセットをオープン」など、具体的にどうすればいいか困っています。 最初の質問でやっているじゃないですか
補足
お世話になります。教えていただいていることはこのようにすることだと思いましたが、やっぱり動作しません。 関数なら何とか理解しているだけなので、それ以上は手探り状態です。ご迷惑をおかけしますが、下のようにしなさいという意味ではないのでしょうか?? Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst Do Until .EOF strData = [商品名] & [型番] & [単価] & vbTab .MoveNext Debug.Print strData .Close End With cnn.Close 回答いただければうれしいです。よろしくお願いします。
- CHRONOS_0
- ベストアンサー率54% (457/838)
[文字変数をクリア] [レコードセットオープン] with rst '全てのレコードを読みこむループ DO until .EOF [フィールド連結] [改行連結] '次のレコードへループ .Movenext Loop
補足
たびたびのご回答ありがとうございます。 ただ、せっかく回答をいただきましたが、「レコードセットをオープン」など、具体的にどうすればいいか困っています。 そのコードを乗せていただくわけにはいかないでしょうか? わからないながらあれこれやっては見たもののまだ動作しておりません。ご面倒をおかけしますがどうぞよろしくお願いします。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>結果で表示される複数行のレコードを、1つのまとまった文字列として変数に入れる方法を望んでいます。 1レコード内の各フィールドは&で繋げるだけですね(間にタブを挟んで) &で繋げれば数字もテキストに型変換されます ちなみにタブの文字コードは9ね 複数レコード分をつなげるのは、読み出しはレコード単位でしか出来ませんから レコード読み出しをループでまわして次々と結合するだけです(間に改行を挟んで) 改行の文字コードは13
補足
ご回答ありがとうございます。 はい、フィールドを&でつなげたり、vbTABやchr(13) & chr(10)も理解しています。ただ、複数行をまとめる方法が思いつかないため、最初のコードを利用しようと思った次第です。 恥ずかしながら、ループでまわす方法がよくわかっていないのです。 もし、それがお手数じゃなければ教えていただいてもよろしいでしょうか? お願いします。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>選択クエリの結果が >商品番号1/あああああ/いいいい/5000 ってどういうこと この4つはフィールドですか 選択クエリの結果が >商品番号1/あああああ/いいいい/5000 と >商品番号1 あああああ いいいい 5000 の違いは何?
補足
回答ありがとうございます。 そうです。最初の4つはフィールドです。 たくさんのフィールドの中から4つだけを選んでいます。 フィールド1/フィールド2/フィールド3/フィールド4 さらに、それを条件で絞り込んで、3レコードや5レコードや1レコードを抽出させています。 この結果を文字列として、変数 StrData に改行コードごとまとめて代入したいのです。 3レコードなら、 StrData には 「フィールド1 tab フィールド2 tab フィールド3 フィールド4 (改行) フィールド1 tab フィールド2 tab フィールド3 フィールド4 (改行) フィールド1 tab フィールド2 tab フィールド3 フィールド4( 改行)」 と結果がほしいのです。 結果で表示される複数行のレコードを、1つのまとまった文字列として変数に入れる方法を望んでいます。 すみませんがよろしくお願いします。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>選択クエリの結果を文字列として表示させる方法 これだけのことならVBAなど持ち出さないで クエリでCStr関数やFormat関数を使って文字列に変換してやればいいだけのことでは
補足
回答ありがとうございます。 選択クエリの結果が 商品番号1/あああああ/いいいい/5000 商品番号2/aaaaaaaaaa/BBBBBBB/4600 商品番号3/ももももも/のののの/5400 の時に、文字列として 「商品番号1 あああああ いいいい 5000 商品番号2 aaaaaaaaaa BBBBBBB 4600 商品番号3 ももももも のののの 5400」 を抽出することが可能でしょうか? よい方法が思いつかないのです。 その方法を具体的に教えてもらえませんでしょうか よろしくお願いします。
- dedededede
- ベストアンサー率20% (1/5)
たぶんadCmdTableDirectのオプションが問題かと思います。 データの変更や削除を可能にするオプション VS 変更不可のクエリ という矛盾です。 そこで、 .Open~の部分を .Open "クエリ名称", cnn, adOpenStatic, adLockReadOnly のようにしたらいけるんじゃないかと・・・
補足
ありがとうございます。 しかしながら、クエリに条件を設定してないときは結果が表示されるのですが、条件を設定して必要なものだけを抜き出そうとすると 実行時エラー' パラメータが少なすぎます。1を指定して下さい。 と表示されます。 クエリに条件をつけてエラーが出ないようにしようと、リンク先をじっくり読んだつもりなのですが、いまひとつよくわかりません。 引き続きお願いします。 よろしくお願いします。
お礼
長くお付き合いいただきありがとうございました。 エクスポートは何度か使ったことがありますが、変数に代入する方法はまだ知りません。今後はこの方面で考えていきます。 目的は達成できませんでしたが、いろいろ勉強になりました。 いつかは私も質問者への回答を返せるように成長したいと思います。 ありがとうございました。