レコードセットを配列に変換し、ワークシートに出力する方法

このQ&Aのポイント
  • Excel2003のVBEを使用して、外部データベースから店舗別の売上データを取得し、ワークシートに出力するプログラムを作成しています。しかし、レコードセットの検索には時間がかかるため、配列を使用する方法を探しています。
  • これまで配列を使用したことがないため、どのようにすればレコードセットのデータを配列に格納し、ワークシートに一括で貼り付けることができるかわかりません。
  • また、配列内で売上表のフォーマットを整形する方法も知りたいです。売上表は、縦列に日にち、横行に店舗名が並んでおり、各店舗の日別売上が一目でわかるようになっています。効率的な方法はありませんか?
回答を見る
  • ベストアンサー

レコードセットの中身を配列に、そしてワークシートに。

今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 これだとデータがどんなに多くても高速です。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

>ですのでレコードセットの中身を配列に格納して >それを売上表のフォーマットに整形できれば >それが一番ベストだと考えました。 配列に入れたらそのままでしょうから、 そうではなく、 レコードセットを売上表のフォーマット に整形し、それを配列に格納して ではないですか。順序が逆だと思いますが。 でなければ、データをExcelにコピーして Excel上で成型すればすむことです。 実現したいフォーマットが、 日付  1001  1002  1003  1004 ← 店舗コード 0201   **   **   **   ** 0202 ** ** ** ** 0203   **   **   **   ** 0204   **   **   **   **  ならばやることは限定的です。

回答No.1

Sheets("Sheet1").Range("A2").CopyFromRecordset rs ではだめですか。 又は、 Do Until RS.EOF でどの様な処理をしているか教えていただければ 多分なんとかなると思います。

anman0201
質問者

補足

回答ありがとうございます。 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

  • 【VBA】レコードセットからグラフを作成

    Excel2002とAccess2002を使っています。 (1)Accessから取得したレコードセットをデータソースにして  グラフを作成する事はできますでしょうか?  (シートにレコードセットを格納せずに) (2)上記が実現不可なら、レコードセットを配列に代入し、  その配列をデータソースにしてグラフを作成する事はできますでしょうか? レコードセットを一度シートに吐き出す事は考えていません。 (1)、(2)とも具体的なコードを書いて頂けると助かります。 よろしくお願いします。

  • レコードセット検索

    excel vbaでレコードセットの中身を検索して レコードセット内の別フィールドのデータを取得する方法がわかりません。やりたいことは、 |店舗名称|店番号|  渋谷店   01  池袋店   02  目黒店   03 というレコードセットがあって渋谷店を コンボボックスで選択したときに、店番号の"01"が 別のコンボボックスで表示されるようにしたいのですが うまくいきません。どなたか分かる方教えてください。 お願いします。

  • 配列操作

    SQLで取得した配列データを新たな配列に作り直したいのですがやり方がわかりません。おしえてください。 取得される配列例です。 $Array[i][日付][タイプ][個数][タイプ別レコード数] ↓ $Array[0][0901][1][3][2] $Array[1][0901][2][4][2] $Array[2][0901][3][5][2] $Array[3][0902][1][5][2] $Array[4][0902][2][10][2] $Array[5][0902][3][7][2] この配列を日付が同じものだけ1レコードに作りなおしたいのですがどのようにすればいいでしょうか。 期待する配列例 $Table[i][日付][タイプ1個数][タイプ2個数][タイプ3個数][レコード数] ↓ $Table[0][0901][3][4][5][6] $Table[1][0902][5][10][7][6] よろしくお願いします。

    • 締切済み
    • PHP
  • Accessのパラメータクエリを他のクエリから呼ぶ

    VBAで日付を指定してSelectするクエリなのですが、同じ処理をたくさんつくるのが嫌なので、 パラメータクエリにしたいのですが、、、 例えば、 日別売上クエリ: Parameters pDate datetime; を持つ        (VBAから直接呼ぶのはこれだけ) このクエリは、以下の2つのJoinからなる  日別レジ別売上クエリ: 下位クエリで、Parameters pDate datetime; を持つ (客数を得るクエリ) 日別部門別売上クエリ: 下位クエリで、Parameters pDate datetime; を持つ (金額を得るクエリ) 共に、Where を日付=pDateとしてます。 そうしておいて、VBAから set rs1=DB1.Openrecordset(”Select  、、、、From  日別売上クエリ(#” & strDate  & ”#) ”) とやったのですが、ダメでした。 パラメータクエリを他のクエリから呼ぶ構文をお教え下さい。 尚、「パラメータクエリをクエリから呼」や「パラメータクエリをSQLから呼」でGoogleったのですが、 見つかりませんでした。

  • ODBC SQL構文 VBA

    excel VBから直接ODBCにSQLを実行した時にエラーが出ます。 ソースコードは下記のようになっています。 strSQL = strSQL & "SELECT" strSQL = strSQL & " 店舗別売上明細_22.売上年月日" strSQL = strSQL & ",店舗別売上明細_22.抽出用屋号" strSQL = strSQL & ",店舗別売上明細_22.抽出用商品ブランド名" strSQL = strSQL & ",店舗別売上明細_22.出荷取引分類区分名" strSQL = strSQL & ",SUM(店舗別売上明細_22.売上金額) as 合計" strSQL = strSQL & ",店舗別売上明細_22.取引先コード" strSQL = strSQL & " FROM" strSQL = strSQL & " 店舗別売上明細_22" strSQL = strSQL & " GROUP BY" strSQL = strSQL & " 店舗別売上明細_22.売上年月日" strSQL = strSQL & ",店舗別売上明細_22.抽出用屋号" strSQL = strSQL & ",店舗別売上明細_22.抽出用商品ブランド名" strSQL = strSQL & ",店舗別売上明細_22.出荷取引分類区分名" strSQL = strSQL & ",店舗別売上明細_22.抽出用取引先名" strSQL = strSQL & ",店舗別売上明細_22.商品区分" strSQL = strSQL & ",店舗別売上明細_22.取引先コード" strSQL = strSQL & " HAVING" strSQL = strSQL & " 店舗別売上明細_22.売上年月日" strSQL = strSQL & " Between 2010/01/01 And 2010/01/31" strSQL = strSQL & " AND" strSQL = strSQL & " 店舗別売上明細_22.抽出用商品ブランド名 = '****'" strSQL = strSQL & " AND" strSQL = strSQL & " 店舗別売上明細_22.商品区分 <> '05ノベルティ'" GROUP BYを使わずにWHEREで実行するとうまくいきます。 原因がわかりますでしょうか?

  • レコードセットデータのExcelシートへの出力方法

    VBEで外部データベースにアクセスしてデータを取得することは出来るんですがそのデータを綺麗にエクセルデータに出力できません。 下記のコードはデータ出力のモジュールなんですがこれだと、レコードセットの中身をただ書き出してるだけになり見た目もよくありません。 どなたかレコードセットデータを綺麗に整形するいい方法を知っている方がいれば助けて頂きたいです。 ### モジュールの一部 ##### ' オブジェクトのインスタンス化 Set cmdCommand = New ADODB.Command Set cmdCommand.ActiveConnection = myConn Set myRS = New ADODB.Recordset Set myRS.ActiveConnection = myConn ' コマンドテキストの設定 With cmdCommand .CommandText = strSQL .CommandType = adCmdText .Execute End With ' レコードセットのオープン myRS.Open cmdCommand, , adOpenForwardOnly, adLockReadOnly ' データの削除 Worksheets("sheet2").Cells.Clear ' フィールド名の表示 For colnum = 0 To 29 Worksheets("sheet2").Cells(2, colnum + 2) = myRS(colnum).name Next ' データの表示 rownum = 0 Do Until myRS.EOF For colnum = 0 To 29 Worksheets("sheet2").Cells(rownum + 3, colnum + 2) = myRS(colnum).Value Next myRS.MoveNext rownum = rownum + 1 Loop '###### 完了メッセージの表示 ################################ If Worksheets("Sheet2").Range("B3") = "" Then MsgBox "抽出条件に該当するデータが存在しません" Else MsgBox "データを出力しました" End If 'レコードセットの開放 myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing End Sub

  • エクセル VBA で条件を指定する方法

    日別売上集計表が1年分1枚のシートにまとめてあります。 品物は全部で5種類です。 別のシートに入力画面を作成しました。 入力画面の一番上に、対象となる日付が入っています。 入力画面に数字を入れて、ボタンを押せば、1年分の日別売上表の対象日付の部分に、数字が入るようにしたいのです。 日別売上表の方にvlookup関数を入れれば、入力画面の数字は反映されますが、それだと次データーを入力画面に入れると、消えてしまいます。 どのようにすれば良いでしょうか? うまく説明できなくてすみません・・。 よろしくお願い致します。

  • Access クエリで、レコードの無い日付も出力したい

    売上テーブル 日付   名前 金額 2007/01/01 A 100 2007/01/02 B 200 2007/01/05 C 500 2007/01/05 A 500 希望するクエリ結果 日付  件数 売上高 2007/01/01 1 100 2007/01/02 1 200 2007/01/03 0  0 << これを表示したい 2007/01/04 0  0 << これを表示したい 2007/01/05 2 1000 売上.日付 でグループ化すると、レコードの無い日付が表示されません。 集計期間内の全日付が表示されるようにするには、どうすればよいのでしょうか? 別に日付テーブルを作らなければならないのでしょうか?

  • 至急Accessでフォームで検索できるようにしたい

    Accessのフォームで店舗IDと日付(例:201501-201502まで)を入力して検索ボタンを押したら、A店B店C店の過去1年分の売上履歴を蓄積したテーブルから(仮:テーブル名:全店舗売上履歴)その月の売上履歴がサブフォームにエクセルのような形式(表形式)でレコードが出てきて 別の枠に集計金額を表示させるような「売上履歴検索ツール」を作りたいのですが、どうしてもうまく行きません。 サブフォームを作りましたが どうしてもエクセルのような表形式でみれるように作れません。 また、店舗IDと日付で検索させるには VBAみたいな命令文が必要でしょうか? 作り方をアドバイスいただけると助かります。 (1)サブフォームに履歴をレコードごとに表示させたい (2)店舗ID、日付で検索させたい (3)検索範囲での集計金額を表示させたい (4)月の売上履歴をテーブルに蓄積させたい この4つのやり方を探しています。 【フォーム】 店舗ID→検索入力 日付→年月の検索入力 サブフォームに 日付(年月) 店舗ID 店舗名 販売商品名 数量 金額 をレコードごとに表示 その他(枠:フレーム) 集計した金額を表示 手順的な形で教えていただけると分かり良いです。 よろしくお願いいたします。

  • Flash 外部テキスト読み込み 配列

    Flash初心者です。PHPスクリプトは多少組める程度です。 現在、Flashであらかじめ用意しておいた%をテキストに,区切りで保存しています。txtファイルには地域別に1日~31日までの%を記述してあります。 テキストは読込めたのですが、splitでうまく分割できません。日別(本日の日にち)で出力させたいのですが配列が不慣れです。どなたか教えてください。

    • ベストアンサー
    • Flash

専門家に質問してみよう