エクセルVBAで表の平均値を出す

このQ&Aのポイント
  • エクセルVBAを使用して表の平均値を求める方法を教えてください。
  • 計算するセル範囲は(C5-C6),(C4-C5),(C3-C4),(C2-C3)と(D5-D6),(D4-D5),(D3-D4),(D2-D3)です。
  • 途中に空白列がある場合でも、列IVまで計算する方法を教えてください。
回答を見る
  • ベストアンサー

エクセル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の仕方を教えていただきたいと思います。実際のシートでは計算行数はかなり多くなります。列では途中空白列があります。できる方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

> (C5-C6),(C4-C5),(C3-C4),(C2-C3)の平均値 って、(C2-C6)/4と言う意味でよろしいですか?(例の場合、(7-3)/4=1 ) その程度ならVBAでは無く演算式で、Sheet1のC2に↓を入れて右方向にコピーしては? =IF(Sheet2!C2="","",(Sheet2!C2-Sheet2!C6)/4) 私が何か勘違いしているような気もしますが……。

kei__2000
質問者

お礼

 回答ありがとうございます。回答内容を読み、なんと馬鹿な質問をしてしまったのかと自分の軽率さを恥ずかしく思います。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 6行目以下にデータがあっても関係なく2行目~6行目で操作すればよいわけですよね? 一応そういうことだとして・・・ 尚、空白セルは「0」とみなしてしまいますが、 ごく簡単な一例です。 ↓のコードを標準モジュールにコピー&ペーストしてマクロを実行してみてください。 Sub test() 'この行から Dim i, j As Long Dim Val1, Val2 As Variant Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") For i = 3 To 256 For j = 2 To 5 Val1 = ws1.Cells(j, i) - ws1.Cells(j + 1, i) Val2 = Val2 + Val1 Next j ws2.Cells(3, i) = Val2 / 4 Val2 = 0 Next i End Sub 'この行まで 外していたらごめんなさいね。m(__)m

kei__2000
質問者

お礼

 回答ありがとうございます。いい勉強をさせていただきました。ありがとうございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

> (C5-C6),(C4-C5),(C3-C4),(C2-C3)の平均値 C5からC6を引いたもの+C4からC5を引いたもの+C3からC4を引いたもの+C2からC3を引いたものを4で割るってことですか? では一例です。 途中に空白があるとのことですが、特に指定が無いので空白は0とみなしました。 Sub test01()   Dim myV, myW   Dim i As Long, n As Long, j As Long   myV = Sheets("Sheet2").Range("C2:IV6").Value   ReDim myW(1 To UBound(myV, 2))   For j = 1 To UBound(myV, 2)     n = 0     For i = 1 To UBound(myV) - 1       n = n + 1       myW(j) = myW(j) + myV(i, j) - myV(i + 1, j)     Next i     myW(j) = myW(j) / n   Next j   Sheets("Sheet1").Range("C2").Resize(, UBound(myV, 2)) = myW End Sub

kei__2000
質問者

お礼

 回答ありがとうございます。いい勉強になりました。ありがとうございます。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

単純に、2行目から6行目までのセルで、上から4組の差の平均値を求めたいなら、マクロを使うより以下のような関数で求めるほうが簡単です。 =AVERAGE(INDEX(Sheet1!C2:C5-Sheet1!C3:C6,))

kei__2000
質問者

お礼

 回答ありがとうございます。参考にさせていただきたいと思います。

関連するQ&A

  • Excel VBA : 追加でコピペする方法

    ExcelのVBAでマクロを作成したので教えて下さい。 sheet(1)C3からC列にDATAが入力済みです。 (同じく、D3からD列にもC列と同じ行数DATAが入力済みです。) DATAは、途中で空白セルは無く、全て埋められた状態です。 (つまり、C列とD列の使用されている行数は全く同じです。) それぞれのDATA(C列、D列)をコピーして Sheet(2)のB3(B列)とC3(C列)から下方にペーストするのですが、 Sheet(2)のB列とC列には既に旧DATAが入力済みなので 旧DATAは消去せず下側に追加する形式でコピペしたいのです。 (旧DATAの直下の行に新規にDATAを追加) 利用済みの行数を取得してコピーは下記で良さそうですが ?   Cells(3,3).end(xlDown).Row.copy 書き込み(ペース)で思考が停止状態です。 どのようにすれば良いでしょうか ?

  • エクセル2003のVBAで困っています。

    エクセル2003のVBAで困っています。 D3~D50の中で○のセルが合った場合にその行のA列~C列までのセル背景を青く塗るようにしたいです。 ちなみに△の場合は黄色で×の場合は赤色でそれ以外の場合は塗色なしにしたいです。 上記の説明が分かにくいかもしれないので、もう少し具体例を言います。 D3~D50の中でD5が○だったらA5~C5の背景を青色 D10が△だったらA10~C10の背景を黄色 D15が×だったらA15~C15の背景を赤色 D20がそれ以外だったらA20~C20の背景を塗色なし を各行(D3~D50)になるようにしたいです。 以上ですが、急ぎですので誰かお願い致します。

  • エクセル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で解る方、よろしくお願いします。

  • エクセルで表の相違確認をVBAでしたい。

    お世話になっております。 下記の様な表がシート1とシート2に有、 シート2がシート1と比較して、行が多かったり、または 数量だけが変わっていたり、行が減っていたり、 表の行数は100から200行くらいあるので、VBAでどこが 違うかをすぐ分かる様に確認したいと思っています。 下記の表はあくまでも例ですが、実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。 どの様に記述していいか分からなく、ご教示下さいます様宜しくお願い致します。    記 A列  B列  C列   D列   E列    No  品番  品名   地区   数量  236  A6TET  みかん  市川   3本 248  A7TGR  りんご  松戸   5本 273  B9GKT  ぶどう  柏    14本 273  A8UFE  すいか  行徳   6本    381  C2ROF  いちご  平井   22本

  • EXCEL表の文字列が対象セル内に含まれるか

    シートAのB2の文字列が000-みかん_東京_001とあるとして、 シートBのB2:りんご、B3:みかん、B4:いちご C2:横浜、C3:東京、C4:名古屋 D2:赤、D3:青、D4:白 という表があるとします。 シートAのB2セルにシートBのB列とC列から両方含まれる行を探し、D列の値を取得したいのですがどのような関数を利用するのが望ましいでしょう? ちなみに、シートAのB2が調査文字でC2を答えとして、調査対象の行を追加していきたいと思ってます。 お知恵をおかしいただければ幸いです(^^)

  • エクセルVBAでレイアウトを変えて表作成

    こんにちは。 お世話になります。 エクセルの表をレイアウトを変えてcsv出力したいと考えています。 「これを大きく二つに分けると既存の表を別レイアウトの表にし直す」 + 「エクセルの表をcsv出力する」 になり、後者はどうもやり方が見つけられそうですので今回は割愛します。 表のレイアウト変更について、以下に例示します。 【既存の表】 A           B     C     D     E     F アイテム名 カラー  100cm 120cm 150cm 200cm アイテムA 赤 1 アイテムA 青 3 2 1 0 アイテムB 白 4 5 アイテムC 2 【レイアウト変更した表】 アイテムA 赤 120cm 1 アイテムA 青 100cm 3 アイテムA 青 120cm 2 アイテムA 青 150cm 1 アイテムA 青 200cm 0 アイテムB 白 150cm 4 アイテムB 白 200cm 5 アイテムC 100cm 2 現在、既存の表の対象範囲をCells(j,i)でjとiをLOOPさせて 空白行でなかったら…というIF分岐まで作りました。 残すは 空白ではない値に出会ったら、 その行のA列の値+B列の値+その列の1行目(サイズタイトルセル)の値+空白でない値(在庫数) を1レコードとして任意の場所にセット 改行してまた進めていく です。 そこまでできたら、csvデータ出力の方法をググり再開しようと思っています。 Cells関数を使えば上記の各値を取得することはできそうですが、それをどうやって保持する?か、 どうやって任意の場所に貼り付けるか、のあたりがわかっていません。 VBAデビュー後間もないのでできるだけ簡易で具体的なアドバイスをお願いいたします。

  • excelで1つの表から2つの表の作り方

    excelの表について教えてください。 sheet1に1つの表が下のようにあります。   A  B  C  D  E  F  G 1 1 あ 亀 白 32 目 木 2 2 い 鶴 赤 25 耳 海 3 2 う 猿 青 44 鼻 川 4 1 え 牛 緑 76 口 湖 5 1 お 犬 黄 14 手 沼 6 2 か 猫 紫 83 足 丘 ここから2つの表を別のsheetに作りたいのです。 sheet2には、   A  B  C  D  E  F  G 1 1 あ 亀 白 32 目 木 2 1 え 牛 緑 76 口 湖 3 1 お 犬 黄 14 手 沼 と、A列の「1」の行だけを、また sheet3には、   A  B  C  D  E  F  G 1 2 い 鶴 赤 25 耳 海 2 2 う 猿 青 44 鼻 川 3 2 か 猫 紫 83 足 丘 と、A列の「2」の行だけを、それぞれ作りたいのです。 しかも、sheet1のA列に、1か2を入力することで、 自動的に、sheet2に1を記入した行を、sheet3に2を記入した行を割り振るようにしたいのです。  よろしくお願いいたします。

  • ExcelのVBAでデータをツリー構造にしたい

    Excelのあるシート「シート1」に親子関係が記されたデータがあります。 列の親には親の名前が、子にはカンマ区切りで所属する子の名前が記されています。 <シート1> 親 子 A1 A2,B1,B2,B3 B1 C5 A2 C1,C2,C4 B2  C1 C2 C3 C4 B3 D1,D3 D1 D2 D3 D2 これを下のシート2のようなツリー構造で親子関係を表現したいです。 1、2、3、4はそれぞれ列で、セルの行と列を変更することで、 ツリーの親子構造を表現します。 <シート2> 1 2 3 4 A1   A2     C1     C2       C3     C4   B1     C5   B2   B3     D1     D3       D2 条件は以下のようになります。 a.シート1の記述順は順不同だが、一番上の行は必ず、一番上の親が来る。 b.一番上の行の親以外は、必ず親を持ちます。逆を言えば、「A1」以外には必ず親が存在し、親をたどると必ず「A1」になります。 そんなに難しくないかとは思うんですが、循環関数を作って考えるのが、今の眠い頭でできなくて…。

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

  • エクセルVBAの問題?

    Excelのファイルがあります。 例として sheet1: ********************************************* Jan-O4 Feb-04 Mar-04 Apr-04 a1-------b1------c1-----d1 a2-------b2------c2-----d2 a3-------b3------c3-----d3 May-04 Jun-04... e1-------... e2-------... e3-------... ********************************************* (注:-は空白の事です、04は2004年の事です。) sheet2: ********************************************* Feb-04 Mar-04 Apr-04 May-04 b1------c1-----d1------e1 b2------c2-----d2------e2 b3------c3-----d3------e3 Jun-04 July-04 ...----... ...----... ...----... **************************************** (注:-は空白の事です。) sheet1からsheet2ができるようにしたいです。 (毎月同じようなの操作の繰り返しです) すなわち、来月になるとsheet1の最初の月のデータを削除して、残りのデータをsheet2にコピー、最後sheet2に新しい月のデータを入力する、データの量はいつも半年のデータです、表のデザインも同じです。 ただ、実際データの量が多いので、普通のセルコピー、シートコピーのようなのやり方、時間が掛かります。 ほかにいい方法がありますか?(VBAなど?) 教えてください! できれば、サンプルも欲しいです。 お願いします。

専門家に質問してみよう