プロが教える店舗&オフィスのセキュリティ対策術

今excel2003のVBEで外部データベースから店舗別の売上データを取得し
それをエクセルのワークシートに出力するというプログラムを作成しています。
ここで問題なのが扱うデータの量が多すぎでレコードセット検索を
使用してそれをDo Until RS.EOFで各店舗の日別売上に出力していくとものすごく時間がかかってしまいます。
そのため配列を使う方法を見つけたのですが配列を使ったことなくて
どうしたらよいのかわかりません。
なんとかレコードセットの中身を配列に格納後にそれを一気に範囲貼り付けしたいと思います。
でも配列内で売上表のフォーマットに整形を行うことができるのでしょうか?

レコードセットのフィールドは店舗別日別売上、売上日付、店舗コード、ブランドセクションです。

売上日付|ブランドセクション|店舗コード|店舗別日別売上
20100201      100     1001     100000
20100201      100     1002     10000
・          ・      ・      ・
・          ・      ・      ・ 


売上表のフォーマットは縦列に1から月末までの日にち、横行に各店舗名が並んでいて各店舗の日別売上が一目でわかるつくりになっています。

各店舗名の上に店舗コードを持たせてそれを元に入力列を取得するという方法も考えたのですがそれも効率的とは思えません。
なにか良い方法はないでしょうか?
アドバイスお願いします。

最後に文章だけの説明でわかりにくくてすみません。
よろしくおねがいします。

A 回答 (3件)

実際データベースとか、クエリを見ていないので


レコードセットの中身が分かりませんので
ソースをかけませんが、配列に入れてシートに貼り付ける
サンプルを作ってみました。

Sub test()

Dim varArray(1 To 100, 1 To 26) As Variant

varArray(1, 1) = "日付" 'range("A1")
varArray(1, 2) = "1001" 'range("B1")
varArray(1, 3) = "1002" 'range("C1")
varArray(1, 4) = "1003" 'range("D1")
varArray(1, 5) = "1004" 'range("E1")

varArray(2, 1) = 20100201 'range("A2")
varArray(3, 1) = 20100202 'range("A3")
varArray(4, 1) = 20100203 'range("A4")
Range("A1:Z100") = varArray
End Sub

これだとデータがどんなに多くても高速です。
    • good
    • 0

>ですのでレコードセットの中身を配列に格納して


>それを売上表のフォーマットに整形できれば
>それが一番ベストだと考えました。

配列に入れたらそのままでしょうから、
そうではなく、

レコードセットを売上表のフォーマット
に整形し、それを配列に格納して

ではないですか。順序が逆だと思いますが。
でなければ、データをExcelにコピーして
Excel上で成型すればすむことです。
実現したいフォーマットが、

日付  1001  1002  1003  1004 ← 店舗コード
0201   **   **   **   **
0202 ** ** ** **
0203   **   **   **   **
0204   **   **   **   ** 

ならばやることは限定的です。
    • good
    • 0

Sheets("Sheet1").Range("A2").CopyFromRecordset rs


ではだめですか。

又は、
Do Until RS.EOF
でどの様な処理をしているか教えていただければ
多分なんとかなると思います。

この回答への補足

回答ありがとうございます。
Do until RS.EOF = True
 myRng = GetRng(myRS!売上日付, myRS!ブランドセクション, myRS!店舗コード)
myRngはfunctionで日付が20100201ならセル4行目、店舗コードが1001ならA列、ブランドセクションが100ならSheet1、みたいに貼り付ける先のセルを取ってきています。
でそれを
myRng = myRS!店舗別日別売上
の形でloopしようと思っています。
(まだイメージの段階で実際にコードを書いてません)
ただこの方法だとmyRngを取得する際にVB内で店舗コード1001="A列"、1002="B列"、1003="C"...と何百店舗にも処理を分けなければいけないのか?それとも別シートに店舗マスタなどを作成して
そこから取得すればいいのか?など非効率的なアイデアしか浮かびません。
実際の店舗コードは序列ではなくforでi+1など回せる気もしません。
ですのでレコードセットの中身を配列に格納してそれを売上表のフォーマットに整形できればそれが一番ベストだと考えました。
こんなフォーマットになっています。

日付  1001  1002  1003  1004 ← 店舗コード
0201   **   **   **   **
0202 ** ** ** **
0203   **   **   **   **
0204   **   **   **   ** 

当方の拙い説明で
ご理解いただけますでしょうか?
よろしくお願いします。

補足日時:2010/02/25 16:18
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A