• ベストアンサー

各個体に対する平均値の自動計算(VBA-マクロ)

各個体に対する平均値の自動計算(VBA-マクロ)  VBAマクロのほぼ初心者です。 言葉だけではうまく説明できないので、画像を添付しました(データ例.jpg)。 ある列に入力されている各個体(A列)に対応する数値(B列)の平均値を自動計算したいです。 各個体のB列1行目は空白になっていて、それぞれの計算結果をそこに入力されるようにしたいです。 *各個体はすでに昇順で並んでいる状態です。 Do~Loopなど利用して色々試したのですが、なかなかうまくいきません。。 よい方法がありましたら、教えていただきたいです。 どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

データの最終行から始めると考えやすいかも知れませんね。 ●Average関数を使わない方法 '-------------------------------- Sub Test222()  Dim R As Long  Dim 件数 As Long  Dim 数値計 As Double  For R = Cells(Rows.Count, "B").End(xlUp).Row To 2 Step -1    If Cells(R, "B").Value = "" Then       Cells(R, "B").Value = 数値計 / 件数       件数 = 0       数値計 = 0    Else       件数 = 件数 + 1       数値計 = 数値計 + Cells(R, "B").Value    End If  Next R End Sub '-------------------------------------------------------- ●Average関数を使う方法 '-------------------------------------------------------- Sub Test222()  Dim R As Long  Dim EndRow As Long    '●各固体の最終行  Dim myRange As Range   '●各固体の数値のセル範囲  For R = Cells(Rows.Count, "B").End(xlUp).Row To 2 Step -1    If EndRow = 0 Then EndRow = R    If Cells(R, "B").Value = "" Then      Set myRange = Range(Cells(R + 1, "B"), Cells(EndRow, "B"))      Cells(R, "B").Value = WorksheetFunction.Average(myRange)      EndRow = 0    End If  Next R End Sub '--------------------------------------------------------------- 以上です。

monsika
質問者

お礼

ばっちりやりたいことができました! 丁寧に回答していただき本当にありがとうございました。

その他の回答 (4)

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

A 関数を使う(エクセルならVBAでなく関数を使うべきです) (1)2007ならAVERADEIF (2)2003ならSUMIFとCOUNTIF(両者割り算)を使う またはSUMPRODUCTとCOUNTIF(両者割り算)を使う (3)またはDAVERAGEを使う B 関数的なVBA http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1314252173 に載っている方法(ここには疑問があるようだがこれもよい1方法と思う) C VBA (1)行ごと条件該当分判定し集計し繰りかえし加算法      (2)ソートして、固体分類が切れる行まで足して(件数も数え)、件数で割る     (3)Findなどで該当分を集計する とりあえずコードは省略。 D エクセルのアクセス的機能でSQLの機能を利用 D 配列数式でAVERAGE関数やSUM関数を使う 例データ A2:B10 a 1 a 2 a 3 a 6 b 1 b 2 c 3 c 4 c 5 式は =AVERAGE(IF(A2:A10="a",B2:B10,""))と入れて、SHIFT+CTRL+ENTERを同時押しする。 結果 3 ただし配列数式は、データ数が多いと時間がかかったりするかもしれない。 ーー E列に a b c と作っておくと(データーフィルターフィルタオプションの設定ー重複するレコードは無視するの操作で(重複せず、もれの無いセットが)出せる。 F2に=AVERAGE(IF(A2:A10=E2,B2:B10,"")) SHIFT+CTRL+ENTERを同時押しする。 この式をF2で+ハンドルを出して下方向に引っ張り、F4まで式を、複写する。 結果 a 3 b 1.5 c 4

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

私もこの内容ならワークシート関数でやりますが、あえてVBAでやるのならばこんな感じかなぁ。 Sub Sample()  Dim y As Long    For y = 1 To Range("B" & Rows.Count).End(xlUp).Row   'B列が空で、A列が空以外の行なら次の処理   If (Range("B" & y).Value = "") * (Range("A" & y).Value <> "") Then    'A列の値が平均表示用の行しかない場合は何もしない    If Evaluate("COUNTIF(A:A,A" & y & ")") > 1 Then     Range("B" & y) = Evaluate("SUMIF(A:A,A" & y & ",B:B)/(COUNTIF(A:A,A" & y & ")-1)")    End If   End If  Next y End Sub

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.2

こんにちは。  少しデータの並べ方を変えてありますが、下記の方法ではどうでしょう。 では。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

こんなもんにVBA使う必要はありません。 シートがこの形のままだと循環参照が発生するので少し小細工こそ要りますが、ワークシート関数だけで行けますよ。 2007ならAVERAGEIF、2003以前ならSUMIFとCOUNTIFの組み合わせで出来ます。

関連するQ&A