Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7全般 : Access 2010)
繰り返し処理の記述
投稿日時: 17/12/19 21:48:27
投稿者: tomachan

Accessのテーブルからエクセルへセルを指定した形で出力させたいです。
下記のパターンの場合
for文またはLoop文をどのように記述すれば少ない行数で簡潔に書けるでしょうか。
イコールの左側がエクセルのセル番地、右側がアクセスのテーブルのフィールド番号を表現しています。
(すみません、細かい部分は省略しております)
 
・テーブルをRSとしてレコードセットしています。
・エクセルの行カウントは2〜21まであり、列カウントのほうは3〜7の繰り返し。
・アクセスのテーブル側のフィールドカウントは1〜10の繰り返し
となります。
 
 
cells(2,3) = fields.count(1)
cells(2,4) = fields.count(2)
cells(2,5) = fields.count(3)
cells(2,6) = fields.count(4)
cells(2,7) = fields.count(5)
 
cells(3,3) = fields.count(6)
cells(3,4) = fields.count(7)
cells(3,5) = fields.count(Cool
cells(3,6) = fields.count(9)
cells(3,7) = fields.count(10)
RS.MoveNext
 
cells(4,3) = fields.count(1)
cells(4,4) = fields.count(2)
cells(4,5) = fields.count(3)
cells(4,6) = fields.count(4)
cells(4,7) = fields.count(5)
 
cells(5,3) = fields.count(6)
cells(5,4) = fields.count(7)
cells(5,5) = fields.count(Cool
cells(5,6) = fields.count(9)
cells(5,7) = fields.count(10)
RS.MoveNext
 
<以下省略>
 
 
21行までなのでこの続きをベタなカウントで書いてもいいかなとも思いますが
レコード数が膨大な量になった時のために、ちゃんとした繰り返し処理の記述が出来たらと思っています。
 
ご指南よろしくお願い致します。

回答
投稿日時: 17/12/20 15:03:51
投稿者: Islay

こうなるかと思います。
Dim i, j
For i = 2 To 21
    For j = 3 To 7
        cells( i , j ) = fields.Count(IIf((i Mod 2) = 0, (j - 2), (j + 3)))
    Next j
Next i

投稿日時: 17/12/21 21:25:53
投稿者: tomachan

Islay様
 
コメントいただきありがとうございます。
MODという演算子、まったく頭に入っていませんでした。
慣れていきたいなと思います。
この方法ですとレコードセットをMoveNextできないので同じ値の繰り返しになってしまうようです。
レコードセットのフィールドのIndex番号を取得できたら解決できるかなと思いますので探してみます。

回答
投稿日時: 17/12/22 14:58:48
投稿者: hatena
投稿者のウェブサイトに移動

tomachan さんの引用:
この方法ですとレコードセットをMoveNextできないので同じ値の繰り返しになってしまうようです。
レコードセットのフィールドのIndex番号を取得できたら解決できるかなと思いますので探してみます。

 
cells(2,3) = fields.count(1)
という書き方自体がおかしいと思いますが。
 
Dim ws As WorkSheet, rs As DAO.Recordset
・・・
ws.cells(2,3) = rs.fields(1)
 
の転記間違いかな?
とすれば下記のようにすれば、MoveNextできますよ。
 
Dim ws As WorkSheet, rs As DAO.Recordset
・・・・
rs.MoveFirst
Dim i, j
For i = 1 To 10 
    For j = 1 To 10 
        ws.cells(i * 2 + (j - 1) \ 5, ((j-1) Mod 5) + 3 ) = rs.fields(j) 
    Next j
    rs.MoveNext
Next i

 
ちなみに、フィールド番号(インデックス)は1から10でいいのですね。1列目はインデックス=0ですので、1列名は入力しないことになります。)
 
rsのレコード件数10件、セルは、2行〜21行 という前提です。
レコード件数が固定でなく、全件出力なら、
 
rs.MoveFirst
Dim i, j
Do until rs.eof
    i = rs.AbsolutePosition + 1
    For j = 1 To 10 
        ws.cells(i * 2 + (j - 1) \ 5, ((j-1) Mod 5) + 3 ) = rs.fields(j) 
    Next j
    rs.MoveNext
Loop

投稿日時: 17/12/26 21:25:01
投稿者: tomachan

hatena様
 
コメントいただき有難うございます。
 
fields.countは私の記述ミスでした。
申し訳ありません。
 
最後のソースを使用させていただきました。
i = rs.AbsolutePosition + 1の+1を削除してきちんと表の所定の位置に入るようになりました。
ありがとうございます。
 
繰り返し処理の変数に割り算の商や余りを使うということについて知識がなかったので勉強になりました。
Accessに限らずプログラミングの基礎だと思いますので引き続き勉強していきます。