[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『SUMPRODUCTに代わるVBAって可能ですか?』(ワンコゥ)
VBAのことをよくわかっていません。
できるなら勉強と考えておりますが…。
あるシート(入力表)から複数の情報をSUMPRODUCTで別のシート(計算)に抽出して計算しています。
情報量が多すぎて計算に5分くらいかかってしまいます。(10,000行から抽出)
現在、手動で再計算が必要なときだけやっていますが…
SUMPRODUCTに代わるうまい方法がないものでしょうか?
<入力表>
A B C D E F
1 年 月 場所 種別 予算内/外 金額
2 2005 1 便所 モップ 1 1200
3 2005 1 風呂 タワシ 0 300
4 2005 2 風呂 洗剤 1 200
5 2005 3 台所 洗剤 1 600
6 2005 4 風呂 洗剤 0 1360
7 2005 5 庭 ホウキ 1 500
8 2005 5 便所 タワシ 1 250
<計算表>
A B C D E F
1 種類 合計 4月 5月 6月 7月
2 便所
3 モップ 5000 0 500 200
4 たわし 3600 200 400 400
5 洗剤 8200 0 700 400
6 ほうき 2200 500 0 1200
7 風呂
8 モップ 6500 100 タワシ 800
Bの列は単純にSUMでよいとして
問題はC,D,E,F…です。
例えばC3には
=SUMPRODUCT((入力表!$B$2:$B$10000=4)*(入力表!$C$2:$C$10000="便所")*(入力表!$D$2:$D$10000="モップ")*(入力表!$E$2:$E$10000=1)*(入力表!$H$2:$H$10000))
これを他のセルにも同じようにして反映させ、計算表の5000セルにいろいろと計算させてます。(他のシートからも引っ張ってきている)
VBAではこうした自動計算は可能でしょうか?
可能であれば勉強して作成したいと考えております。
ヒントや書籍等も教えていただければ幸いです。
乱文失礼しました。
Excel2000
Win2000
おはようございます。 もしも私がこのような場面に直面したとしたら、多分以下の様にすると思います。 先ず、今、問題になっているのはSUMPRODUCT関数では無くてデータ数が多いからではないのですか? つまり、そのデータから重複を除いて集計してあげればいいのではないのですか? Sheet1のフィールドが以下の様になっていたとして A B C D E H 年 月 場所 種別 予算内/外 金額 重複を除いた集計をSheet2に書き出します。そのSheet2を元に計算されてはどうですか? データの種類にもよると思いますが、40000件のレコードでテストした結果、私のオンボロPCで約5秒ほどでした。 Option Explicit Sub てすと() Dim MyTbl As Range Dim MyA As Variant Dim MyB As Variant Dim MyC As Variant Dim ii As Long, i As Long Dim MyTimer As Single MyTimer = Timer With Sheets("Sheet1") Set MyTbl = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 5) MyA = MyTbl.Value MyC = MyTbl.Offset(, 7).Resize(, 1).Value End With With Sheets("Sheet2") .Cells.ClearContents MyTbl.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("A1"), Unique:=True MyB = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 6).Value For ii = 2 To UBound(MyB, 1) For i = 2 To UBound(MyA, 1) If MyB(ii, 1) = MyA(i, 1) And MyB(ii, 2) = MyA(i, 2) And _ MyB(ii, 3) = MyA(i, 3) And MyB(ii, 4) = MyA(i, 4) And MyB(ii, 5) = MyA(i, 5) Then If IsNumeric(MyC(i, 1)) Then MyB(ii, 6) = MyB(ii, 6) + MyC(i, 1) End If End If Next Next .Range("A1").Resize(UBound(MyB, 1), UBound(MyB, 2)).Value = MyB End With Erase MyA, MyB, MyC Set MyTbl = Nothing MyTimer = Timer - MyTimer MsgBox Format(MyTimer, "###0.000") & "秒 抽出完了!!" End Sub (SoulMan)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.