- ベストアンサー
VBA マクロ 集計の方法
マクロで集計するツールを作っているのですが、 各々のエクセルに下記のようなデータが入っています。 data.xls 日付 名前 12/1 ああああ 12/5 いいいい 12/8 うううう ・ ・ ・ data2.xls 日付 名前 12/1 ああああ 12/5 いいいい 12/8 うううう 12/4 3333 ・ ・ このように色々なエクセルのデータを集計する場合、 集計しようとするデータの数がわからない場合は どのように処理したらいいのでしょうか? たとえば、配列をある程度考えられる数分確保し、 その分だけループさせて、日付又は名前が空になるところまでやる必要があるのでしょうか? どのようにしたら、効率よくデータ数を取得できるか教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
集計対象がB列だけであれば、このような方法も考えられます (B列の値が入っているセルだけを集計処理対象にする) Sub Macro() Dim r As Range For Each r In Columns("B:B").SpecialCells(xlCellTypeConstants, 3) ' 集計処理 Next r End Sub
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17070)
配列を使うやり方は素人くさい、すぐ思いつくが、挿入等でコードがごたごたしないかな。 日付別に集計するという意味なら データ数が増えても破綻しないやり方は ーーー 集計シート(最初空) データシート1(日付列で日付け順にソート) 日付をマッチング・キーにしてマッチングして一致したとき、データの計数を集計に足しこむ。 ーーー 次に集計シート データシート2(日付列で日付け順にソート) 日付をキーにしてマッチングして一致したとき足しこむ。 ーーー これをデータシートが終わるまで繰り返す。 この2ファイルのマッチングのアルゴリズムは、情報処理試験の解説書に載っています。 オフライン・バッチ処理では、古典的なアルゴリズムですが、私見では最強のアルゴリズムと思います。 コーディングがすっきりします。応用も広い。コード上の論理間違いも早く収まる。 今回使わなくても覚えておくと役立つと思います。
お礼
ありがとうございます。 勉強になります。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 頭から、Redim で決めてしまう方が楽といえば楽ですが、Redim Preserve で、動的配列にしてもよいと思います。除外するデータとか、空のデータとかもあったりして、取り扱わないものが出てくる可能性があるからです。データの数自体は、データがなくなる時でも、行数でもよいと思います。 ただし、あくまでも、配列変数に確保する場合であって、そうでなければ、そのまま、Rangeオブジェクトのままで扱ってもよいかと思います。
お礼
ありがとうございます。 勉強になります。
- driverII
- ベストアンサー率27% (248/913)
#1、#2さんのやり方で、最大件数を取得し、 配列を使う時は、Redimで確保。 ループで処理する。 というのが一般的かと思います。
お礼
ありがとうございます。
- sakuuuuu
- ベストアンサー率32% (67/209)
コマンドで最終行を取得し、最終行までループさせます。 例) x_row = Worksheets("sheet1").Range("A1").CurrentRegion.Rows.Count For i = 2 To x_row 処理内容 Next i (1行目は項目名称なので2行目から)
お礼
これですと、値が入っていない行までもカウントされたのですが。。
- ham_kamo
- ベストアンサー率55% (659/1197)
1行目がタイトル行とすると、 Range("A1").CurrentRegion.Rows.Count - 1 でデータの個数は取得できます。
お礼
これですと、値が入っていない行までもカウントされたのですが。。
お礼
ありがとうございます。うまく処理できました。