• 締切済み

平均値を出す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)

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

配列に、エクセルシートデータを入れると処理が早いとの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)
回答No.1

>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でおこなうには、? 教えて下さい。宜しくお願い致します。

  • エクセル、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つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

専門家に質問してみよう