今excel2003のVBEで外部データベースから店舗別の売上データを取得し
それをエクセルのワークシートに出力するというプログラムを作成しています。
ここで問題なのが扱うデータの量が多すぎでレコードセット検索を
使用してそれをDo Until RS.EOFで各店舗の日別売上に出力していくとものすごく時間がかかってしまいます。
そのため配列を使う方法を見つけたのですが配列を使ったことなくて
どうしたらよいのかわかりません。
なんとかレコードセットの中身を配列に格納後にそれを一気に範囲貼り付けしたいと思います。
でも配列内で売上表のフォーマットに整形を行うことができるのでしょうか?
レコードセットのフィールドは店舗別日別売上、売上日付、店舗コード、ブランドセクションです。
売上日付|ブランドセクション|店舗コード|店舗別日別売上
20100201 100 1001 100000
20100201 100 1002 10000
・ ・ ・ ・
・ ・ ・ ・
売上表のフォーマットは縦列に1から月末までの日にち、横行に各店舗名が並んでいて各店舗の日別売上が一目でわかるつくりになっています。
各店舗名の上に店舗コードを持たせてそれを元に入力列を取得するという方法も考えたのですがそれも効率的とは思えません。
なにか良い方法はないでしょうか?
アドバイスお願いします。
最後に文章だけの説明でわかりにくくてすみません。
よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
実際データベースとか、クエリを見ていないので
レコードセットの中身が分かりませんので
ソースをかけませんが、配列に入れてシートに貼り付ける
サンプルを作ってみました。
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
これだとデータがどんなに多くても高速です。
No.3
- 回答日時:
>ですのでレコードセットの中身を配列に格納して
>それを売上表のフォーマットに整形できれば
>それが一番ベストだと考えました。
配列に入れたらそのままでしょうから、
そうではなく、
レコードセットを売上表のフォーマット
に整形し、それを配列に格納して
ではないですか。順序が逆だと思いますが。
でなければ、データをExcelにコピーして
Excel上で成型すればすむことです。
実現したいフォーマットが、
日付 1001 1002 1003 1004 ← 店舗コード
0201 ** ** ** **
0202 ** ** ** **
0203 ** ** ** **
0204 ** ** ** **
ならばやることは限定的です。
No.1
- 回答日時:
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 ** ** ** **
当方の拙い説明で
ご理解いただけますでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
字面がカッコいい英単語
あなたが思う「字面がカッコいい英単語」を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
-
4
VBAの配列サイズとメモリに関して
Visual Basic(VBA)
-
5
array関数で格納した配列の型を変更する
Visual Basic(VBA)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
Excelで数値→文字列変換で指数表示になったものをいっぺんに直したい
Excel(エクセル)
-
8
ブック名、シート名を他のモジュールからも参照可能にする方法
Access(アクセス)
-
9
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
10
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
11
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
12
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
13
vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはど
Visual Basic(VBA)
-
14
エクセルVBAでOutlookメールの書式を変える
Excel(エクセル)
-
15
配列の中の最大値とそのインデックス番号を取得する方法
Visual Basic(VBA)
-
16
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
17
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
18
実行時エラー -2147217900 ADODBでレコードセットオープン時エラー
Access(アクセス)
-
19
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
20
Excel(エクセル) VBA プロシージャーをミリ秒で繰り返し実行する方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
複数のtextboxの処理を一括で行...
-
配列の中の最大値とそのインデ...
-
VBAで配列引数を値渡しできない...
-
Redim とEraseの違いは?
-
VBScriptでCSVファイルを読み出...
-
配列のペースト出力結果の書式...
-
countif/sumifのようなVBA関数
-
フォルダ内に入っている複数のE...
-
Segmentation Fault (メモリ制限?)
-
free()関数の多用 と Segment...
-
配列からのCSVファイルの作...
-
順位をつける VB.NET2008
-
ExcelVBAでデータを一括してセ...
-
定数配列の書き方
-
エクセルVBAからNotesでメー...
-
C#でbyte配列から画像を表示さ...
-
VBで配列に格納されているデー...
-
VBA: Select Caseを短くしたい
-
VB6のメモリ解放に関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
Excel2010のinputboxで複数デー...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
配列のペースト出力結果の書式...
-
COBOLの基本的な事なので...
-
大量の変数を定義するにはどう...
-
DBから取得した値を配列へ代入する
-
EXCEL VBAの課題です
-
VBScriptでCSVファイルを読み出...
-
VBAでMODE関数をつくる
-
配列の中の最大値とそのインデ...
-
定数配列の書き方
-
構造体配列内の文字列検索のよ...
-
CheckBoxの配列化
-
Excelのメモリ(配列)の上限は2G...
おすすめ情報