- ベストアンサー
各個体に対する平均値の自動計算(VBA-マクロ)
- みんなの回答 (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 '--------------------------------------------------------------- 以上です。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
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)
私もこの内容ならワークシート関数でやりますが、あえて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)
- D-Matsu
- ベストアンサー率45% (1080/2394)
こんなもんにVBA使う必要はありません。 シートがこの形のままだと循環参照が発生するので少し小細工こそ要りますが、ワークシート関数だけで行けますよ。 2007ならAVERAGEIF、2003以前ならSUMIFとCOUNTIFの組み合わせで出来ます。
お礼
ばっちりやりたいことができました! 丁寧に回答していただき本当にありがとうございました。