プロが教える店舗&オフィスのセキュリティ対策術

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

 VBAマクロのほぼ初心者です。

言葉だけではうまく説明できないので、画像を添付しました(データ例.jpg)。
ある列に入力されている各個体(A列)に対応する数値(B列)の平均値を自動計算したいです。
各個体のB列1行目は空白になっていて、それぞれの計算結果をそこに入力されるようにしたいです。
*各個体はすでに昇順で並んでいる状態です。

Do~Loopなど利用して色々試したのですが、なかなかうまくいきません。。
よい方法がありましたら、教えていただきたいです。
どうぞよろしくお願いいたします。

「各個体に対する平均値の自動計算(VBA-」の質問画像

A 回答 (5件)

データの最終行から始めると考えやすいかも知れませんね。




●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
'---------------------------------------------------------------

以上です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/16 10:49

A 関数を使う(エクセルならVBAでなく関数を使うべきです)


(1)2007ならAVERADEIF
(2)2003ならSUMIFとCOUNTIF(両者割り算)を使う
またはSUMPRODUCTとCOUNTIF(両者割り算)を使う
(3)またはDAVERAGEを使う
B 関数的なVBA
http://detail.chiebukuro.yahoo.co.jp/qa/question …
に載っている方法(ここには疑問があるようだがこれもよい1方法と思う)
C VBA (1)行ごと条件該当分判定し集計し繰りかえし加算法
     (2)ソートして、固体分類が切れる行まで足して(件数も数え)、件数で割る
    (3)Findなどで該当分を集計する
とりあえずコードは省略。
D エクセルのアクセス的機能でSQLの機能を利用
D 配列数式でAVERAGE関数やSUM関数を使う
例データ A2:B10
a1
a2
a3
a6
b1
b2
c3
c4
c5
式は
=AVERAGE(IF(A2:A10="a",B2:B10,""))と入れて、SHIFT+CTRL+ENTERを同時押しする。
結果

ただし配列数式は、データ数が多いと時間がかかったりするかもしれない。
ーー
E列に
a
b
c
と作っておくと(データーフィルターフィルタオプションの設定ー重複するレコードは無視するの操作で(重複せず、もれの無いセットが)出せる。
F2に=AVERAGE(IF(A2:A10=E2,B2:B10,"")) SHIFT+CTRL+ENTERを同時押しする。
この式をF2で+ハンドルを出して下方向に引っ張り、F4まで式を、複写する。
結果
a3
b1.5
c4
    • good
    • 0

私もこの内容ならワークシート関数でやりますが、あえて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
    • good
    • 1

こんにちは。



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

では。
「各個体に対する平均値の自動計算(VBA-」の回答画像2
    • good
    • 0

こんなもんにVBA使う必要はありません。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!