お世話になります。
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も見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
エクセルでの複数条件下での標準偏差の求め方
Excel(エクセル)
-
条件付きの標準偏差をVBAを用いて計算したいです
Excel(エクセル)
-
VBA 配列に格納した値の平均のやり方についてお教え願います
Visual Basic(VBA)
-
-
4
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
5
■VBA■ SUMとAVERAGEの違い
Excel(エクセル)
-
6
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
7
☆Excel VBAでAVERAGE関数を使うとき・・・
その他(Microsoft Office)
-
8
マクロを実行すると画像がズレてしまいます
その他(Microsoft Office)
-
9
Excel関数:「0」を除いた標準偏差の計算方法2
Excel(エクセル)
-
10
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
11
VBAで配列の計算
Excel(エクセル)
-
12
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
13
Excelにて条件(ワイルドカード)付きの標準偏差を求めたいです
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
URLのリンク切れをマクロを使っ...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBA A列にありB列にないものま...
-
【VBA】2つのシートの値を比較...
-
Changeイベントでの複数セルの...
-
vba 数値がゼロになるまで引く
-
VBA 値と一致した行の一部の列...
-
C# 列の挿入
-
オートフィルタをマクロで作成...
-
VBAで条件から範囲を指定して色...
-
複数csvを横に追加していくマク...
-
VBA 何かしら文字が入っていたら
-
エクセルVBA シートモジュール...
-
VBAを使って検索したセルをコピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
セルに値が入っていた時の処理
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
おすすめ情報