
お世話になります。
ExcelでのVBAを教えてください
A列にデータ、B列にコメントがある表が有ります。
B列のコメントが未入力のA列のデータを用いてC列に平均値と標準偏差を出したいと考えています
下記の様にやってみたのですが、コメント入力されているデータも使用されてしまいます。
どこが違うのかご教授いただけますでしょうか
よろしくお願いします。
Fro i=1 to Cells(Row.Count,"A").End(xlUp).Row
If Cells(i,"B")<>"" then
Range("C1")=WorksheetFunction.Round(WorksheetFunction.Average(Range(Cells(1,"A"),Cells(i,"A"))),2)
Range("C2")=WorksheetFunction.Round(WorksheetFunction.StDev(Range(Cells(1,"A"),Cells(i,"A"))),2)
No.3ベストアンサー
- 回答日時:
> どこが違うのか
というご質問ですので、まず、文法エラーから。
1行目FroはForの打ち間違いですよね。
また、Row.Countではなく、正しくはRows.Countです。
このコードを実行すると「対応するEnd If」がありませんとか、
「Next」がありませんとか、Excelに怒られます。
それらを追加して、実行しても、i=1の時、4行目でエラーが出ます。
「WorksheetFunctionクラスのStDevプロパティを取得できません」
といって止まりました。この場合、データが1個しかないので、
標準偏差の計算は無理があるわけです。
さらに、論理的な間違いとして、
If Cells(i,"B")<>"" then の部分。
これは、B列のコメントが未入力「でないならば」
という意味になります。意味が逆です。
コメント入力されているデータも使用されてしまうとしたら
原因はこれでしょう。
というか、それ以前にまともに動かないはずなんですが。
そもそも、StDevで標準偏差を求めるなら、
for文でループさせる必要はありません。
ワークシート関数の機能を使って処理を完遂させるのか、
ループや条件分岐などの制御文を使って目的を果たすのか、
どちらかにしましょう。
Average や StDev を使うならば、めぐみんさんの回答が非常にスマートで
高速に処理できるかと思いますので、ありがたくパクりましょう(笑)。
ただ、「B列のコメントが未入力」の場合を処理したいので
xlCellTypeConstants ではなく、xlCellTypeBlanks を指定して
以下のように書かれるとご希望通りの動作になるかと。
Sub Test1()
Dim r As Range
Set r = Range("B1", Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeBlanks).Offset(, -1)
Range("C1") = WorksheetFunction.Round(WorksheetFunction.Average(r), 2)
Range("C2") = WorksheetFunction.Round(WorksheetFunction.StDev(r), 2)
Set r = Nothing
End Sub
for文 や IF文を使って制御するのが質問者様の意図ならば、
以下のような書き方も、わかりやすくて良いと思います。
Sub Test2()
Dim m As Long
Dim n As Long
Dim i As Long
Dim S As Double
Dim st As Double
Dim Heikin As Double
n = Cells(Rows.Count, "A").End(xlUp).Row '--- データ行のカウント
'--- 平均値を先に求める
For i = 1 To n
If Range("B" & i) = "" Then '--- コメントが未入力なら
m = m + 1 '--- その数をカウントして
S = S + Range("A" & i) '--- 合計して
End If
Next
Heikin = S / m
Range("C1") = WorksheetFunction.Round(Heikin, 2) '--- 平均値を出力。
'--- 標準偏差を算出
m = 0 '--- 変数を再使用するのでリセット
S = 0
For i = 1 To n
If Range("B" & i) = "" Then '--- コメントが未入力なら
m = m + 1 '--- カウントして
S = S + (Range("A" & i) - Heikin) ^ 2 '--- 偏差を二乗して合計
End If
Next
st = Sqr(S / (m - 1)) '--- (m-1)で割って平方根を取る←括弧を忘れると計算がおかしくなる
Range("C2") = WorksheetFunction.Round(st, 2) '--- 標準偏差を出力。
End Sub
回答文を考えていたら出遅れた上に、ループによる回答が
思いっきりカブってしまいました(涙)。
WindFallerさんの回答はさりげなく、最初からポカよけにTrim関数を
噛ませてあるところが丁寧ですよね。
B列に、半角または全角のスペースなど、見えない文字が入っていると、
「B列のコメントが未入力」という条件からはずれますので、その時には
こういう処理が必要になるわけですが、私は手抜きしました(汗)。
ちなみに標準偏差といえば、標本数をNとして偏差平方和を(N-1)で割って
平方根を取ったものと長年理解していました。
母平均は真の値が通常は不明なので、標準偏差の計算には
サンプリングによる標本の平均値を使わざるを得ず、その分、
統計上、自由度が1減る。なので分母をマイナス1して補正する。
...と教わりました。
標本数Nを充分大きくとれれば問題は少ないはずですが、通常は経済的、
時間的、物理的にサンプリングの規模はかなり制限されます。
なので私の場合、現場ではエイヤっと、N-1で統一して運用しましたが、
これによる問題は特に発生しませんでした。
前処理の精度とか、測定のたびに散る値、そう多くない標本数、
製法由来のノイズなど、その他の気になる要素もありまして(笑)
お礼が遅くなり申し訳ありません
また、色々とポカのご指摘ありがとうございます。
また、例をいろいろと教えていただきありがとうございます。
参考にさせていただき、やってみたいと思います
ありがとうございました
No.2
- 回答日時:
こんばんは。
ワークシート関数を使わないで、出してみました。
標準偏差と、不偏標準偏差とは、間違えないほうがよいです。
私は、一度、お客さんの手に渡ってから、検証したら間違いに気がついたことがあります。一般的には、StdDev.P 側のはずです。
平均値は、AverageIf がありますが、StdDev には、条件検索する関数はないようです。
参考にはならないとは思いますが、私は、時々、こういうことで、関数の成り立ちを調べています。
'//
Sub TestStatic1()
Dim i As Long, j As Long, k As Long, m As Long
Dim dblSum As Double
Dim dblDev As Double
Dim avr As Double
Dim dblStdDevP As Double
Dim dblStdDev As Double
Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To LastRow
If Trim(Cells(i, "B").Value) <> "" Then
dblSum = dblSum + Cells(i, "A").Value
j = j + 1
End If
Next i
avr = dblSum / j '平均値
For k = 1 To LastRow
If Trim(Cells(k, "B").Value) <> "" Then
dblDev = dblDev + (Cells(k, "A").Value - avr) ^ 2
m = m + 1
End If
Next k
dblStdDevP = Sqr(dblDev / m) '標準偏差
dblStdDev = Sqr(dblDev / (m - 1)) '不偏標準偏差
'出力
Range("C3").Value = Int(avr * 100 + 0.5) / 100 '平均値
Range("C4").Value = Int(dblStdDevP * 100 + 0.5) / 100 '標準偏差
Range("C5").Value = Int(dblStdDev * 100 + 0.5) / 100 '不偏標準偏差
End Sub
お礼が遅くなり申し訳ありません
また、関数の過ちなどご指摘ありがとうございます。
参考にさせていただきやってみたいと思います
ありがとうございました
No.1
- 回答日時:
ようするにB列のセルが空白でない所の同じ行のA列の値が欲しいってなら、
Sub megu()
Dim r As Range
Set r = Range("B1", Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeConstants).Offset(, -1)
Range("C1") = WorksheetFunction.Round(WorksheetFunction.Average(r), 2)
Range("C2") = WorksheetFunction.Round(WorksheetFunction.StDev(r), 2)
Set r = Nothing
End Sub
こんな感じでは如何?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて見た映画を教えてください!
初めて見た映画を覚えていますか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
コーピングについて教えてください
皆さんはストレスを感じたとき、どのような方法や手段、テクニックで対処していますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
条件付きの標準偏差をVBAを用いて計算したいです
Excel(エクセル)
-
VBA 配列に格納した値の平均のやり方についてお教え願います
Visual Basic(VBA)
-
エクセルでの複数条件下での標準偏差の求め方
Excel(エクセル)
-
-
4
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
5
VBAで配列の計算
Excel(エクセル)
-
6
平均値、標準偏差の有効数字について教えてください。
統計学
-
7
Excelにて条件(ワイルドカード)付きの標準偏差を求めたいです
Excel(エクセル)
-
8
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
9
Excel マクロ VBA プロシージャが大きすぎます のエラー対処方法
Visual Basic(VBA)
-
10
Excel関数:「0」を除いた標準偏差の計算方法2
Excel(エクセル)
-
11
■VBA■ SUMとAVERAGEの違い
Excel(エクセル)
-
12
特定のシートのみ再計算させない方法は?
Excel(エクセル)
-
13
☆Excel VBAでAVERAGE関数を使うとき・・・
その他(Microsoft Office)
-
14
配列の中の最大値とそのインデックス番号を取得する方法
Visual Basic(VBA)
-
15
メッセージボックスで1025文字以上を扱う
Visual Basic(VBA)
-
16
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
17
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
18
配列のペースト出力結果の書式について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
URLのリンク切れをマクロを使っ...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
Worksheets メソッドは失敗しま...
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
エクセル 2つの表の並べ替え
-
VBA 何かしら文字が入っていたら
-
VBAを使って検索したセルをコピ...
-
オートフィルタをマクロで作成...
-
Changeイベントでの複数セルの...
-
複数csvを横に追加していくマク...
-
VBAで、離れた複数の列に対して...
-
データグリッドビューの一番最...
-
エクセル アクティブセルから...
-
SUM関数の範囲を変数を代入して...
-
VBAで指定範囲内の空白セルを左...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
文字列の結合を空白行まで実行
-
Changeイベントでの複数セルの...
-
URLのリンク切れをマクロを使っ...
-
VBAで指定範囲内の空白セルを左...
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
VBAで、特定の文字より後を削除...
-
エクセル 2つの表の並べ替え
-
データグリッドビューの一番最...
-
rowsとcolsの意味
-
VBAでのリスト不一致抽出について
おすすめ情報