Access VBA質問箱 IV

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

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


140 / 2272 ツリー ←次へ | 前へ→

【12863】テーブルに存在する単語を1レコードずつクエリの抽出として利用する ゆう 15/7/3(金) 16:47 質問[未読]
【12864】Re:テーブルに存在する単語を1レコードずつ... かるびの 15/7/4(土) 0:17 回答[未読]
【12873】Re:テーブルに存在する単語を1レコードずつ... ゆう 15/7/6(月) 10:51 質問[未読]
【12874】Re:テーブルに存在する単語を1レコードずつ... かるびの 15/7/6(月) 13:55 回答[未読]
【12875】Re:テーブルに存在する単語を1レコードずつ... ゆう 15/7/8(水) 13:14 お礼[未読]

【12863】テーブルに存在する単語を1レコードずつ...
質問  ゆう  - 15/7/3(金) 16:47 -

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

テーブル作成クエリを利用して、
下記テーブルAから、顧客名を抽出条件として
テーブルを作成→Excelファイルに出力したいと考えています。

その際、テーブルBに存在する顧客名を一度に抽出条件として指定するのではなく、
1顧客ごとにクエリを実行し、Excelファイル出力時も
1顧客ごとにシートを分割して出力したいのですが、
そのようなことは可能でしょうか。

いろいろ検索してみたのですが、
ソースコードの書き方がわかりません。
お手数をおかけして恐縮ですが、ご指導よろしくお願いします。


【テーブルA】
 顧客名:テキスト 
 購入商品:テキスト
 購入単価:数値
 各種指標:数値
 
【テーブルB】
 連番:オートナンバー
 顧客名:テキスト

【12864】Re:テーブルに存在する単語を1レコードず...
回答  かるびの  - 15/7/4(土) 0:17 -

引用なし
パスワード
   >その際、テーブルBに存在する顧客名を一度に抽出条件として指定するのではなく、
>1顧客ごとにクエリを実行し、Excelファイル出力時も
>1顧客ごとにシートを分割して出力したいのですが、
>そのようなことは可能でしょうか。

 可能だと思います。


 その方法ですが、テーブルBのレコードセットを取得し、それをループさせます。
 各ループにおいて、第1に、テーブルBのレコードセットから顧客名を取得します。
 第2に、取得した顧客名を抽出条件としてテーブルAからレコードを抽出するクエリのレコードセット(rsA)を取得します。
 第3に、rsAをエクセルに展開します。
 これに当たっては、エクセルのCellプロパティを使ったり、
エクセルのCopyFromRecordsetメソッドを使います。


 なお、エクセルへの出力に当たって、TransferSpreadsheetメソッドやOutPutToメソッドが
使えるかと思いましたが、
これらメソッドでは、出力先のワークシートを指定したり、出力先のセル範囲を指定したりは
できないみたいですので、いずれも使えなさそうです。


 ところで、テーブルAのテーブル構成がまずいですね。
 テーブルAに顧客名フィールドが設けられていますが、
顧客名フィールドはテーブルBに既に設けられているので、
テーブルAに顧客名フィールドを持たせてはいけません(一事実一箇所の原則)。
 テーブルAには、顧客名フィールドに代えて、
テーブルBの連番フィールドと同じ値を持つフィールドを設けなければいけません。

【12873】Re:テーブルに存在する単語を1レコードず...
質問  ゆう  - 15/7/6(月) 10:51 -

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

早々にご教授いただきありがとうございます。
返信が遅くなり、大変申し訳ありません。


ご指摘いただいたテーブルAのテーブル構成ですが、
テーブルAには、顧客名フィールドに代えて、
テーブルBの連番フィールドと同じ値を持つフィールドを設定しました。


> 第2に、取得した顧客名を抽出条件としてテーブルAからレコードを抽出するクエリのレコードセット(rsA)を取得します。
> 第3に、rsAをエクセルに展開します。
> これに当たっては、エクセルのCellプロパティを使ったり、
>エクセルのCopyFromRecordsetメソッドを使います。

第1ステップまではできたのですが、
第2ステップで第1ステップで取得した顧客名をクエリにセットする以降の
コードがよく分かりません。

最悪、第1ステップで取得した顧客名を別テーブルにして
そのテーブルとテーブルBをリンクさせることも考えておりますが、
第3ステップのExcel出力部分については、
「CopyFromRecordset」で色々調べてはみたのですが
どのようなコードにすればいいのか見当がつきません。

やりたいこととしては、
クエリAで第1ステップで取得した顧客名を抽出条件にデータを抽出、
クエリBで、クエリAをもとに各種計算を実施し、
その後Excelファイルに、1シートずつ顧客名をつけて
データを出力したいと考えております。

お手数をおかけして大変恐縮ではございますが
ご指導いただけますと幸いです。

以上、宜しくお願い致します。

【12874】Re:テーブルに存在する単語を1レコードず...
回答  かるびの  - 15/7/6(月) 13:55 -

引用なし
パスワード
   >第2ステップで第1ステップで取得した顧客名をクエリにセットする以降の
>コードがよく分かりません。
 単純にレコードをセットを取得するだけです。
 下記のページが参考になると思います。

DAO入門講座
ht tp://www.accessclub.jp/dao/

レコードセットオブジェクトの作成_ダイナセットタイプ : DAO入門講座
ht tp://www.accessclub.jp/dao/07.html


 レコードセット作成に当たっては、
RecordsetOpenメソッドの第1引数にクエリを指定するのではなく、
SQL文を指定する必要があります。
 そうしないと、テーブルBからのレコードセットで取得した顧客名をrsAに渡せないからです。
 そのため、SQL文の知識も必要です。
 SQL文については、次のページが参考になると思います。

SQL入門講座
ht tp://www.accessclub.jp/sql/

選択クエリの作成と実行 : SQL入門講座
ht tp://www.accessclub.jp/sql/07.html

レコードの抽出 - WHERE句 : SQL入門講座
ht tp://www.accessclub.jp/sql/08.html

レコードの並び替え - ORDER BY句 : SQL入門講座
ht tp://www.accessclub.jp/sql/10.html


>第3ステップのExcel出力部分については、
>「CopyFromRecordset」で色々調べてはみたのですが
>どのようなコードにすればいいのか見当がつきません。

 エクセルのヘルプのCopyFromRecordsetのところに使用例が載っています。
   ws.Range("A2").CopyFromRecordset rs
 wsはワークシートオブジェクトを格納している変数、rsはレコードセットです。


 CopyFromRecordsetはエクセルのメソッドですが、
アクセスでこのメソッドを使うわけですから、
アクセルからエクセルを操作するということになります。
 ここが一つの山になりますが、アクセスからエクセルを操作するというのは頻出のテーマですので、
コードのサンプルはすぐに見つかると思います。


 アクセスからエクセルを操作するやり方ができれば、後は、エクセルVBAのコードを書くだけです。


 出力先のワークシートが事前に用意されており、それの名前を変えるだけでいいのか、
それとも、新規にワークシートを追加するのかによって、コードが変わってきます。

【12875】Re:テーブルに存在する単語を1レコードず...
お礼  ゆう  - 15/7/8(水) 13:14 -

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

早々にご回答いただきありがとうございます。
いただいたHP情報を参考にして作成してみます。

またご質問させていただくことがあるかもしれませんが
その際は宜しくお願い致します。

取り急ぎ御礼まで。

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