dポイントプレゼントキャンペーン実施中!

VBA初心者です。宜しくお願い致します。

テーブルのデータをエクセルに出力しているのですが
特定の行まで出力したら、別のシートに出力先を変更したいのです。
以下コードの★部分で処理するのではないかと思っているのですが
どのように書けばいいのかさっぱりわからず、ご質問させて
いただきました。

どうぞ、宜しくお願い致します。

-----------------------

'既存の Excel Book をテンプレートとして開き、
'位置を指定して、テーブルのデータを出力

Dim cnADO As ADODB.Connection 'ADO コネクション確立
Dim rsADO As ADODB.Recordset

Dim xls As Excel.Application
Dim wkb As Excel.Workbook
Dim fName As Variant
Dim stDetail As String 'Query OR Table Name
Dim stPath As String 'mdb & Excel Book Path
Dim stXLName As String 'Book Name
Dim stSheet As String 'Sheet Name
Dim stSheet2 As String 'Sheet2 Name
Dim stRng As String 'Range Address

stPath = "\\marketing\" '自mdb & Excel Book のパス
stXLName = "marketing.xls" 'テンプレート用の Book
stDetail = "出力テーブル" 'テーブル名
stSheet = "marketing" '出力するシート名1
stSheet2 = "marketing2" '出力するシート名2
stSheet3 = "marketing3" '出力するシート名3
stRng = "A26" '出力開始セル番地

Set cnADO = CurrentProject.Connection
Set rsADO = cnADO.Execute(stDetail)


'テンプレート としてオープン
Set xls = CreateObject("Excel.Application")
xls.Workbooks.Add template:=stPath & stXLName
Set wkb = xls.Workbooks(1)


'★rsADOのレコード数を1行目のデータから30行目までに制限
'★明細データ貼り付け1(rsADOの1行目のデータから30行目までを貼り付け処理)

With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rsADO
End With


'★rsADOのレコード数を31行目のデータから75行目までに制限
'★明細データ貼り付け2(rsADOの31行目のデータから75行目までを貼り付け処理)
With wkb.Worksheets(stSheet2)
.Range(stRng).CopyFromRecordset Data:=rsADO
End With


'★rsADOのレコード数を76行目のデータから100行目までに制限
'★明細データ貼り付け3(rsADOの76行目のデータから100行目までを貼り付け処理)
With wkb.Worksheets(stSheet3)
.Range(stRng).CopyFromRecordset Data:=rsADO
End With


'Excel画面を表示して終了(保存しない)
xls.Visible = True

Set xls = Nothing
Set wkb = Nothing
Set fName = Nothing

rsADO.Close: Set rsADO = Nothing
cnADO.Close: Set cnADO = Nothing

A 回答 (3件)

CopyFromRecordset メソッド をヘルプで調べてください。



expression.CopyFromRecordset(Data, MaxRows, MaxColumns)

MaxRows 省略可能です。バリアント型 (Variant) の値を使用します。ワークシートにコピーするレコードの最大数を指定します。この引数を省略すると、Recordset オブジェクトのすべてのレコードをコピーします。
-------------------------------------------------------------
MaxRows に、30, 45, 25 をそれぞれ指定して出力すればOKです。
 
    • good
    • 0
この回答へのお礼

御礼が遅くなりすいません。
大変参考になりました!
ありがとうございました!!

お礼日時:2008/01/30 10:50

専門家ではありませんので詳しいことを良く知りませんが、



問題は何を根拠に何番目のレコードであるとするかだと思います。
アクセスでインデックスがない場合はは追加された順に見えますが、
そうである保障があるかどうかは(私は)わかりません。
よって、レコードセットを作成するとき何らかの形で順番をつけたほうが
良いと思います。 それを念頭において考えると、一行ずつ書き出す場合は、
DIM CON AS ADODB.CONNECTION
DIM RST AS NEW ADODB.RECORDSET
DIM STSQL AS STRING
DIM I AS INTEGER
SET CON = CURRENTPROJECT.CONNECTION
STSQL = "SELECT * FROM 出力テーブル ORDER BY ......."
RST.OPEN STSQL,CON,ADOPENKEYSET,ADLOCKOPTIMISTIC
I = 0
DO UNTIL RST.EOF
I = I + 1
SELECT CASE I
CASE < 31
'一行ずつ書き出す処理
CASE > 30 AND < 76
....
CASE > 75 AND <101
....
END SELECT
RST.MOVENEXT
LOOP
RST.CLOSE
(殴り書きですので、デバッグ等行っていません)
のような感じになりますが、私個人的にテーブルに連番を入れておいて
それを元にレコードセットを作ることをお勧めします。
その場合は、SQLにてレコードセットをお好みの番号だけに制限して
作成することができますので、パフォーマンスもコードも簡単です。

参考URL:http://www.geocities.jp/cbc_vbnet/ADO/recordset. …
    • good
    • 0
この回答へのお礼

御礼が遅くなりすいません。
大変参考になりました!
ありがとうございました!!

お礼日時:2008/01/30 10:50

エクセル側についてはまるで何も知らないのでアクセスの話を、



アクセスVBAを使っておられるなら、アクセスでテーブルを
三つに分けてしまうのが簡単だと思います。

テーブルの変更が可能なら、連番でインデックスを振っておいて、
対象範囲内のみを抽出するのが簡単だと思います。

そうでなければ、ADOなどでテーブルをあけて一件ずつ
数をカウントしながらmovenext してデータ処理していくとか
(件数が多いと大変です。)
    • good
    • 0
この回答へのお礼

テーブルは増やしたくないのでなんとかVBAでやりたいです。

>そうでなければ、ADOなどでテーブルをあけて一件ずつ
>数をカウントしながらmovenext してデータ処理していくとか

こちらのアドバイスの可能性を探りたいのですが、初心者なものでもう少しどのように書くのか、教えていただければ幸いです。
できれば既述のVBAをあまり大きく変更せずに対応できれば一番いいのですが。。。わがままですいません。。

お礼日時:2008/01/24 19:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す