![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
みなさん教えてください。
今、実験で測定したデータの整理を行っています。
そこで、教えて頂きたいことがあります。
下記のようなデータの整理を行っています。
今行いたいことは、下図のようなプラスとマイナスの数値(図ではA・B・Cエリアと区別)に
おける各エリアの個別の平均値をマクロで求めたいと思っています。
<データの詳細>
・データ数は全部で約400個
・データは、下図のようにプラスの数値のあとにマイナスの数値がくるようになっています。
みなさんマクロで求める方法(構文)を教えて頂けないでしょうか。
よろしくお願いします。
![「エクセルVBAで平均値を求める方法」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/1/22919661_5497d279a2069/M.jpg)
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
質問者は、戻らないのかもしれませんが、#4のマクロをもう少しそぎ落としてみました。
数式と違う部分は、空白があっても、誤動作しません。文字に関しては、同じ仕様です。'*書きだし場所は変更出来ます。
'//
Sub EachAverage2()
Dim rng As Range
Dim i As Long
Dim iStr As Long, iEnd As Long
Dim dSum As Double, cnt As Long
Set rng = Range("A1", Cells(Rows.Count, 1).End(xlUp)) 'A1とCells(Rows.Count, 1)の1 の列は合わせること。
rng.Offset(, 1).ClearContents
iStr = rng.Cells(1).Row
iEnd = rng.Cells(rng.Cells.Count).Row '隣の列は一旦クリアされます。
Application.ScreenUpdating = False
'*
For i = iStr To iEnd
If Val(Cells(i, 1).Value) > -1 Eqv Val(Cells(i + 1, 1).Value) > -1 Then
dSum = dSum + Val(Cells(i, 1).Value)
cnt = cnt - (VarType(Cells(i, 1)) = vbDouble)
Else
dSum = dSum + Val(Cells(i, 1).Value)
cnt = cnt - (VarType(Cells(i, 1)) = vbDouble)
Cells(i, 2).Value = dSum / cnt '*
cnt = 0
dSum = 0
End If
Next i
Cells(i - 1, 2).Value = dSum / cnt '*
Application.ScreenUpdating = True
Set rng = Nothing
End Sub
No.6
- 回答日時:
数式で計算するなら以下のような一覧表を作成するのが簡単かもしれません(添付図参照)。
C2セルに「1」と入力
符号の切り替わりの行番号のC3セル(下方向にオートフィル)
=MIN(INDEX((INDEX($A$1:$A$400,C2):$A$400*(-1)^ROW(A2)>0)*1000+ROW(INDEX($A$1:$A$400,C2):$A$400),))
平均値のD2セル(下方向にオートフィル)
=IF(COUNT(A:A)<C2,"",AVERAGE(OFFSET($A$1,C2-1,0,C3-C2,1)))
数式が複雑になるので処理しませんでしたが、符号の切り替わりの行番号の最後の表示したいくない部分は、IF関数や条件付き書式で表示しないような設定にもできます。
![「エクセルVBAで平均値を求める方法」の回答画像6](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/e/1223543_5497e0f87e2e4/M.jpg)
No.5
- 回答日時:
#4の回答で、数式に触れましたので、数式は、あまり得意ではないのですが、数式も書いておきます。
B1 から、=IF(ROW(A1)=1,0,IF(OR((A1>-1)<>(A2>-1),ISBLANK(A2)),ROW(),""))
をフィルダウン・コピー(トップのフィルハンドルをダブルクリック)
C2 から、=IF(B2<>"",AVERAGE(INDEX(A:A,MAX($B$1:B1)+1,1):INDEX(A:A,B2,1)),"")
をフィルダウン・コピー(トップのフィルハンドルをダブルクリック)
つまり、マクロで数式を貼り付けてもよいかもしれませんね。
No.4
- 回答日時:
データに数値のないものが含まれるエラー処理を含めています。
計算の排出先は、* がついている部分ですから、列の隣なら、.Cells(i, 2).Value ですから、この2 を換えてあげればよいです。また、Celltop のセルの先頭を最初に設定すれば、場所を変えることが出来ます。 Average 関数は使いませんが、Average関数の文字に対するの考え方を反映するようにしました。
ただ、これは、あくまでも、VBAマクロという前提で、並んでいる環境なら関数でも可能なような気がします。
'//
Sub EachAvarages()
Dim CellTop As Range, rng As Range
Dim i As Long, cnt As Long
Dim dSum As Double
Dim F As Long, iFlg As Integer
Set CellTop = Range("G5") 'セルの先頭
Set rng = Range(CellTop, Cells(Rows.Count, CellTop.Column).End(xlUp))
If Application.CountA(rng) = 0 Then MsgBox "データがありません。", 48: Exit Sub
'rng.Offset(, 1).ClearContents '右隣の列のデータ削除(必要に応じて外してください)
Application.ScreenUpdating = False
With rng
For i = 1 To rng.Rows.Count
If F = 0 Then F = i: iFlg = Val(Cells(i, 1)) > -1
If i = rng.Rows.Count Then
If VarType(.Cells(i, 1)) = vbDouble Then cnt = cnt + 1
.Cells(i, 2).Value = (dSum + Val(.Cells(i, 1).Value)) / cnt '*
Exit For
End If
If VarType(.Cells(i + 1, 1)) = vbDouble Then
iFlg = Val(.Cells(i, 1).Value) > -1
If VarType(.Cells(i, 1).Value) <> vbDouble Then iFlg = 0
If CInt(Val(.Cells(i + 1, 1).Value) > -1) <> iFlg Then
dSum = dSum + Val(.Cells(i, 1).Value)
cnt = cnt + 1
.Cells(i, 2).Value = dSum / cnt '*
dSum = 0: F = i: cnt = 0
Else
dSum = dSum + Val(.Cells(i, 1).Value)
cnt = cnt + 1
End If
Else
dSum = dSum + Val(.Cells(i, 1).Value)
End If
Next i
End With
Application.ScreenUpdating = True
Set rng = Nothing: Set CellTop = Nothing
End Sub
No.3
- 回答日時:
いまこの質問を見ると画像が真っ黒で、どういうデータか判らないよ。
一般に
(1)例データは質問文にテキストで作成するようにしてほしい。
(2)質問者は質問をOKWAVEに上げた後、読者の立場で一度照会してみてほしい。
ーー
平均値を求める方法は
(1)エクセル関数で求める
AVERAGEIFやSUMIF
質問者にはこれで良いのでは。
(2)エクセル関数をVBAで使う方法
(3)各行のデータをとらえて計算していくとき
データ数と
そこの行までの合計を足していく、最後に合計を件数で割る
方法(有名な初歩的アルゴリズム)と在る。
ーー
本件も画像が見えないので答えられないが、クラス(A,B,Cか)分けと符号が尋常ではないようだから、
それを新しい列に普通のデータに作れば、後はエクセル関数利用などで簡単でしょう。
計算だけなら、VBAでやる意味は余り無いと思う。
VBAを使う理由を認識できているか疑問。
No.2
- 回答日時:
お遊びで参加
数式のみなんだけど(^^;)
Sub Macro1()
Application.ScreenUpdating = False
Dim 終わり行 As Long
終わり行 = Cells(Rows.Count, 1).End(xlUp).Row
Range("B:D").Insert
Range("B1") = Range("A1").Value
Range("B2:B" & 終わり行).Formula = _
"=IF(SIGN(A1)=SIGN(A2),SUM(A2,B1),A2)"
Range("C1") = 1
Range("C2:C" & 終わり行).Formula = _
"=IF(SIGN(A1)=SIGN(A2),SUM(1,C1),1)"
With Range("D1:D" & 終わり行)
.Formula = _
"=IF(SIGN(A1)<>SIGN(A2),B1/C1,"""")"
.Value = .Value
End With
Range("B:C").Delete
Application.ScreenUpdating = True
End Sub
No.1
- 回答日時:
A列にA1からデータが並んでいる。
sub macro1()
dim ha as range
dim i as integer
dim s
s = array(">=0", "<0")
application.screenupdating = false
range("1:2").insert shift:=xlshiftdown
range("B:B").insert
range("A1") = "h"
for i = 0 to 1
if application.countif(range("A:A"), s(i)) > 0 then
range("A:A").autofilter field:=1, criteria1:=s(i)
for each ha in range("A2:a" & range("A65536").end(xlup).row).specialcells(xlcelltypevisible).areas
ha.range("B1") = application.average(ha)
next
end if
next i
activesheet.autofiltermode = false
range("1:2").delete shift:=xlshiftup
application.screenupdating = true
end sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 【 数Ⅰ 分散 】 問題 20個の値からなるデータがあり, そのうちの8個の値の平均値は3,分散は4 4 2023/02/15 23:28
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- 数学 【 数I 分散 】 3 2023/02/26 21:55
- 統計学 統計学の問題です よろしくお願いします 代表値 次の15件のデータについて,以下の問いに答えよ。 結 1 2023/01/31 18:53
- 統計学 統計学の問題です よろしくお願いします 代表値 次の15件のデータについて,以下の問いに答えよ。 結 5 2023/01/31 23:35
- 統計学 確率統計の問題です。 3 2022/04/07 04:39
- 統計学 統計学 このデータはある母集団からとった標本である 42 41 48 40 45 37 43 47 4 2022/12/23 01:29
- 統計学 風速を1秒刻みで推定する方法 6 2023/03/03 11:58
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- 統計学 t値の計算方法 1 2022/11/29 18:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで 自動的に◯や数字を...
-
【マクロ】2回実行したら、エ...
-
エクセルのツールバーから数値...
-
特定の文字列を含む、住所を抽...
-
Excel 2019 [オプション]の[リボンのユ...
-
祝日と土曜、日曜の合計をカウ...
-
EXCELの散布図で日付が1900年に...
-
マイクロソフトのPADを使ってい...
-
絶対参照
-
エクセルでCtrl+Tでテーブルの...
-
【マクロ】名前を保存する際に...
-
エクセルのクイックアクセスツ...
-
【マクロ】VLOOKUPにて参照元に...
-
Excel分数の表示について
-
【EXCEL】画像の黄色部分の抽出...
-
DATE関数で現在の年齢を出した...
-
Excelについて
-
マクロエクセルのブロック解除
-
Excelピボットテーブルの1行目
-
REGEXREPLACE関数について、
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
半角カタカナをヘボン式ローマ...
-
(マクロ)vlookupの元データを同...
-
エクセルで上位バイトのセルと...
-
exselの質問です
-
Excel 大小比較演算子による「...
-
Excel VBについての質問です。
-
エクセルの問題です。絶対値の...
-
非表示列の再表示に失敗
-
職場の人から聞かれており、こ...
-
Excel関数-文字列で自動作成さ...
-
Excelデータをコピペして、ペー...
-
ユーザー定義関数をアドイン登...
-
【マクロ】for next構文について
-
エクセルの日付を編集する
-
【マクロ】VLOOKUPにて参照元に...
-
exselで最小数で並び替える関数
-
libre 表計算ソフトの計算がう...
-
エクセルで表
-
エクセルの表で1年間の曜日を...
-
西暦和暦
おすすめ情報