- 締切済み
平均値を出すVBAを教えて下さい!
平均値を出すVBAを教えてください!! 下記の関数をCA2に入れて下に引っ張って使っているのですが、 データ量が多すぎて砂時計状態のまま動きません!! データはA列~BVまでで50万行位あります。 一番上は見出しです。 VBAで関数を使わないで平均値を出す方法を教えてください!! C列に日付が記入されており、シート11のセルで期間を以上と以下で設定しています。 答えが一緒であればどんな方法でも構いません。 ぜひよろしくお願いします。 =AVERAGEIFS(AC:AC,A:A,A10,C:C,Sheet11!$A$1,C:C,Sheet11!$B$1,AB:AB,2)
- ryu072207220722
- お礼率0% (0/2)
- Visual Basic
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17068)
配列に、エクセルシートデータを入れると処理が早いとのWEBの記述がある。 それで下記をやってみた。 ーー モジュール外に(Module1など、全体コードの一番上に貼り付け。時間計測のためのAPIを使うため)下記1行を置く(関数の利用宣言) Public Declare Function timeGetTime Lib "winmm.dll" () As Long 標準モジュールに下記を貼り付け Sub test06() nStart = timeGetTime() Dim a As Variant a = Range("A1:C500000") x = 0: s = 0 For i = 2 To 500000 If a(i, 2) >= #3/1/2016# And a(i, 3) = "男" Then x = x + 1 s = s + Cells(i, 1) 'MsgBox a(i, 2) End If Next i nEnd = timeGetTime MsgBox (CDbl(nEnd) - CDbl(nStart)) / 1000 & "秒" MsgBox s / x End Sub テストデータは、第2行から第50万行、 A列に平均を考える計数、B列に日付(シリアル値であること)、C列に性別の男か女を入力されている。 上記では、条件は3月以降のデータで、かつ男のデータ(の平均を計算)。 ーーー 実行時間は0.5秒ぐらいとでた。 ーー >VBAで関数を使わないで平均値を出す方法を教えてください こんなのは、コンピュタープログラムの1番はじめにやる、例題のアルゴリズムだよ。 むつかしいことから入って、基礎学習を飛ばしているのかな。 ーー VBA処理でとか、コンピュターの処理速度を上げる方法を明確に説明できる人は 少ないだろうと推測する。コンピュターの基礎の基礎(メモリやアドレスやOSのプログラムを実行する仕組みなど)をわかってないと理由を示して説明できないが、そんな回答者をここに求めても無理だろう。他の同時実行プログラムも影響する。 コンピュターの「りソース」というものを勉強するのがよい。 データ(フィールド・列)の中身の多様性はあまり影響ないでしょう。上記の男女が多数の商品の1つに置き換わっても。 データのことは何も質問に説明もない。式などストレートに挙げず、文章で説明を望む。 ー エクセル関数を使って、配列で処理を試みたが、条件がつくとうまく行かなかった(条件なしの(全データの)AverageやSUM関数なら配列データを使える。小生の力不測?) ==== 方法転向のすすめ (1)ピボットテーブルを使う、や (2)ADOを使って、SQL処理に持ちこめば、WHEREやHAVINGが使えるので やりやすいかも。SQLには、AVG関数がある。
- chie65535
- ベストアンサー率43% (8519/19367)
>50万行位あります。 50万件あると、VBAでやっても「AVERAGEIFSよりも遅い」です。 こういうのは「条件に合う行の行数を数える」「100分割するなどして、5000件づつの小計を出す」「5000件づつの小計を足して総合計を出す」「総合計を、条件に合う行の行数で割って、平均を出す」など、作業用セルを用いて、処理を小分けして下さい。 CA列、CB列、CC列、CD列が「未使用で空いている」と仮定します。 1.CA2に「=AND(C2>=Sheet11!$A$1,C2<=Sheet11!$B$1,AB2=2)*1」と入れます。 2.CB2に「=AC2*CA2」と入れます。 3.CA2、CB2を範囲選択して「Ctrl+C」を押します。 4.CA3~CB500000を選択します。表の「データが最終行まで埋まっている列」で「Ctrl+↓」を押せば表の最終行まで飛びますから、表の最終行に飛んだら、CB列に移動。CB列の最終行にカーソルを合わせ、「Shift+Ctrl+↑」「Shift+↓」「Shift+←」の順に押すと、CA3~CB500000が選択できます。 5.選択したら「Ctrl+V」を押して貼り付けします。貼り付けに時間がかかりますが、辛抱強く待ちましょう。 6.CC2に「=SUM(OFFSET(CA$2,(ROW()-2)*5000,0,5000,1))」と入力します。 7.CC2をコピーしてCD2に貼り付けします。 8.CC2~CD3をコピーして、CC3~CD101に貼り付けます。CC列は「5000行ごとの、条件に一致する行数」に、CD列は「5000行ごとの、条件に一致する小計」が、100個づつ出来ます。 9.「=SUM(CD2:CD101)/SUM(CC2:CC101)」で平均を求めます。
関連するQ&A
- Excel VBAで、VLOOKUP関数をうまく使って見出しからデータ
Excel VBAで、VLOOKUP関数をうまく使って見出しからデータをコピーしたいです。 sheet3 に見出しだけ入れたら、その見出しのデータを丸ごとVLOOKUPを使って、以下のようにコピーしてきたいと思ってます。 sheet1 動物系 植物系 雑貨系 家電系 … パンダ チューリップ かご テレビ … うさぎ パンジー キーホルダー ビデオ … ・ ・ ・ ・ … ・ ・ ・ ・ … ・ ・ ・ ・ … sheet2 形容詞系 無料系 … かわいい ただ … かっこいい 0円 … すてきな むりょー … ・ ・ … ・ ・ … ・ ・ … sheet3(sheet2の同じ列に入ってるキーワードと、かけあわせたいsheet1の見出しだけ入ってます) A B C D E … 動物系 動物系 ○○系 ○○系 ○○系 … 雑貨系 ○○系 ○○系 ○○系 ○○系 … 家電系 ○○系 ○○系 ○○系 ○○系 … ○○系 ○○系 ○○系 ○○系 ○○系 … ・ ・ ・ ・ ・ … ・ ・ ・ ・ ・ … ・ ・ ・ ・ ・ … VBA初心者で、関数をうまく使えばできると思うのですが、わかりません。 dictionaryとfindも調べたのですが、どうも違うようでVLOOKUPをうまく使って、見出しだけ入れたらコピーしてみたいのです。 どうしたらいいでしょうか? 教えていただけると助かります。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- どのようなVBAを書けばよいでしょうか
以下のような表があります。 (sheet1) A列 B列 続く… タイトル1 タイトル2 … (←一行目にタイトル) 13 5 (←二行目から数字がランダムに) 18 14 44 33 36 87 22 11 14 14 27 24 21 39 32 62 35 5 44 4 12 3 (以下続く。各列が何行で終わるかもランダム) 「各列の数列の平均と分散」「列全体を含めての平均と分散」 を、新たなシートに書き出したいのです。 上の例からすると、 (sheet2) A列 B列 C列 平均 分散 (←一列目) タイトル1 ?? ?? (←二列目から結果を) タイトル2 ?? ?? … 全体 ?? ?? のような感じです。 データの量が多いので、手作業で関数を使っていては、莫大な時間を要してしまいます。 どのようなVBAを書けばいいのでしょうか。 分かる方、よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- VLOOKUP関数をVBAで使用したい
VLOOKUP関数をVBAで使用したい 「検索」シートにID番号を入力すると、「データ」シートのA列に入っているデータから入力されたID番号を検索し、該当するID番号のある行の横並びに入っている別の列データ(B~AG列)を取り出し、それぞれを「検索」シートの様々なセルに表示するVBAを作っていますが、VBAでVLOOKUP関数を用いる方法がよく分からず苦戦しています。 「データ」シートの1、2行目は見出しで、検索されるデータが入っているのは3行目からです。また、「データ」シートには不定期に新しいデータが追加されていきます。 「検索」シートに検索結果を表示する際も、以下のように規則性のないセル配置なので少しややこしいです。 「検索」シートのセル=「データ」シートの列 B6=B列 B8=C列 B10=D列 B11=E列 B12=F列 B13=G列 B14=H列 B16=I列 D16=J列 F16=K列 B17=L列 D17=M列 F17=N列 B20=O列 C20=P列 E20=Q列 B21=R列 C21=S列 E21=T列 B22=U列 C22=V列 E22=W列 B23=X列 C23=Y列 E23=Z列 B24=AA列 C24=AB列 E24=AC列 B26=AD列 E26=AE列 B29=AF列 B31=AG列 このような動作をVBAでさせることは可能でしょうか? また、検索して該当するID番号がなかった際も、VBAだとそこで動作が止まってしまうので、「該当するID番号がありません」といったエラー判定が出るようにすることはできますか? 教えてください。よろしくお願いします。
- 締切済み
- オフィス系ソフト
- エクセル VBAで関数
こんばんわ。いつもお世話になっております。 エクセルでデータを加工しているのですが、関数で加工するととても遅くなってしまうので なんとかVBAで作業できないかと模索中です。 Sheet1の、A列=取引先 B列=支店名 となっており、それが3,000行ほどあります。 Sheet2も、A列=取引先 B列=支店名 となっており、 Sheet1のC列に、Sheet1のA列のB列という支店が、Sheet2にあるか確認したいのです。 現在は、Sheet1のC列に、SUMPRODUCT関数でカウントさせているのですが、大変重いです。 ほかのSheetで、VBAを使って関数のような働きをさせている部分があります(前任者作成) そのように、なんとかVBAを使用したいのですが、なかなかうまく出来ません・・・。 どうか、お力を貸してください!! うまく説明できなくて、わかりづらかったらごめんなさい。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAで表の平均値を出す。
はじめまして、よろしくお願いします。 シート2に A B C D ・ ・ ・ ・ IV 1 赤 青 ・ ・ ・ ・ ・ 2 7 14 ・ ・ ・ ・ ・ 3 6 12 ・ ・ ・ ・ ・ 4 5 10 ・ ・ ・ ・ ・ 5 4 8 ・ ・ ・ ・ ・ 6 3 6 ・ ・ ・ ・ ・ 7 2 4 ・ ・ ・ ・ ・ 8 1 2 ・ ・ ・ ・ ・ 9 という表があります。その表の(C5-C6),(C4-C5),(C3-C4),(C2-C3)の平均値をシート1のC2へ、同じく(D5-D6),(D4-D5),(D3-D4),(D2-D3)の平均値をシート1のD2へ、列IVまで計算するVBAの仕方を教えていただきたいと思います。実際のシートでは計算行数はかなり多くなります。列では途中空白列があります。できる方、よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAでのまとめ計算
初めまして、よろしくお願いします。 データーで A B C D E ・・・ 1 5 7 2 2 3 7 0 3 4 6 3 6 5 2 8 3 6 0 3 4 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 100 3 4 5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルの質問 条件で求めたものの合計について
あのエクセルについての質問です A B C D E 1 50 100 ab 2000 5 2 50 200 ab 1500 2 3 60 200 ba 1000 3 4 60 100 ab 2000 4 5 50 100 ba 1000 3 6 50 100 ab 2000 2 7 60 500 ab 1000 4 8 50 200 ab 2000 5 9 60 150 ca 2000 2 10 50 200 ab 1000 7 11 50 300 ba 2000 8 12 60 100 ca 2000 2 13 50 100 ab 2000 1 14 50 150 ba 1000 5 15 60 200 ab 2000 9 Aが50でありなおかつBが100でなおかつ CがabでなおかつDが2000の行のE列の合計を求める関数をしりたいのですか どうか教えてください。 いわゆる上のこの表ではE列の1行目と6行目と13行目を足した ”答えが8”になる関数を使用した公式を知りたいんですが。 また、Aが50でありなおかつBが100でなおかつ CがcdでなおかつDが2000の行のE列の合計などを求める方法、 を教えてくれないでしょうか。 条件として一つのセル内で計算を行い データー行は500行以上あるということです。 オートフイルターを使用なしということです。 VBAはわからないので使わないものをお願いします できるのでしょうか 教えてください どうかよろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAでの質問です。
エクセルVBAでの質問です。 以下のようなA列にID、B列、C列にそれぞれIDに対応したデータがあります。 A B C ID 名前 住所 10000 ~ 39999 IDを10000~19999、20000~29999、30000~39999で分けて別シートに もっていこうと思っています。 自分としては、ID左端の数字をLeft関数を使って何とかしようと思っていましたが、 どうしてもうまくいきません。 何かいい方法はないでしょうか。
- ベストアンサー
- オフィス系ソフト
- Excel VLOOKUPをVBAでやりたいのですが、分からなくて困っ
Excel VLOOKUPをVBAでやりたいのですが、分からなくて困ってます。 Sheet1のC列2行目行こうにSheet2のI列のデータを取得し (A列にデーターが入っている分、(時と場合により表示数が違う為)) なおかつ Sheet1のD列2行目以降にB-Cの差し引きをおこなう 以上のことをSheet1をアクティブにした時VBAでおこなうには、? 教えて下さい。宜しくお願い致します。
- ベストアンサー
- Visual Basic
- エクセル、VBA、抽出複数検索について
エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)