vbaでの等間隔の列に対しての計算について教えてください
1日のデータが19列*約3000行で数か月分(19列*日数分の列)並んでおり
各行ごとに19列のデータの内1件のデータ20日分に対しStDevP(標準偏差)
を算出したいのですがうまくいきません
①下記にあるmidbandを算出しているAverageIfの様なコードが作れれば理想的なのですが
StDevPifとかは無く”エクセル 等間隔列 範囲指定”などで検索してみたのですが
他に良い方法が見つからず仕方なくfor next文でセルアドレスをつなげて
(hani=ws2.Cells(2,27),Cells(2,46),Cells(2,65),Cells(2,84),、、、、Cells(2,388),Cells(2,407)、、こんな感じで20日分)
②hani変数にしてsigmaを算出する式に代入して実行してみたのですが
WorksheetFunctionクラスのStDevPプロパティを取得できません のエラーになってしまいます
構文がどこかおかしのかとセルに書き出して確認し、問題無さそうなので試しにコピーして
変数haniと入れ替えて実行した所、うまくいきました(構文自体は問題なく出来ている?)
出来れば①の様なすっきりした構文で作る方法が有れば理想
無理で有れば現状の②の方法で何が問題なのか(修正方法)
につきましてアドバイスを頂きたくご教示の程よろしくお願いいたします
i=2 '//行番号
ma = 20 '//算出日数
retsusuu=19 '//1日分のデータ列数
hretsu '//算出範囲の先頭列
eretsu = hretsu + retsusuu * ma '//算出範囲の最終列
owaretsu = hretsu + 6 '////算出データの先頭列
ws2.Activate
’①
midband = WorksheetFunction.AverageIf(ws2.Range(Cells(1, hretsu), Cells(1, eretsu)), ws2.Cells(1, owaretsu), ws2.Range(Cells(i, hretsu), Cells(i, eretsu)))
For BB = 0 To ma
If BB = 0 Then
hani = "ws2.Cells(" & i & "," & owaretsu & ")" & ","
ElseIf BB > 0 And BB < 20 Then
owaretsu = owaretsu + (BB * retsusuu)
hani = hani & "Cells(" & i & "," & owaretsu & ")" & ","
Else
owaretsu = owaretsu + (BB * retsusuu)
hani = hani & "Cells(" & i & "," & owaretsu & ")"
End If
owaretsu = hretsu + 6 '////算出データ列 初期化
Next BB
MsgBox hani '//msgboxで確認
ws2.Cells(2, 10).Value = hani '//セルに書き出して確認
’②
sigma = WorksheetFunction.StDevP(hani) ⇒ プロパティを取得できませんエラーでダメ
No.2ベストアンサー
- 回答日時:
>(hani=ws2.Cells(2,27),Cells(2,46),Cells(2,65),Cells(2,84),、、、、Cells(2,388),Cells(2,407)、、こんな感じで20日分)
最初のセルだけ別シートなのかどうかは不明ですけど、UNIONメソッドとRangeのOffsetプロパティでいけるのではないかなと。
https://www.sejuku.net/blog/88187
https://excel-ubara.com/excelvba1/EXCELVBA383.html
早々にご回答ありがとうございます
unionは調べたのですがoffsetとの組み合わせをもう一度調べて
配列のご回答と併せてやってみます
又結果報告させていただきます
No.6
- 回答日時:
もし連結した文字列を使用したいのなら、まず区切り文字を , から _ 等に変えておき
sigma = WorksheetFunction.StDevP(Split(hani , "_"))
とSplit関数を使えば _ で区切られた配列にしてくれるかと。
, ですと Cells の中も区切ってしまうのでそれを避ける必要あり。
ご回答ありがとうございます
Split関数を使えば _ で区切られた配列にしてくれる
OFFSETで19列毎に範囲を移動させる。
必要な範囲をRange型変数にSetステートメントで代入する
この辺がなるほどなので時間が取れる時に試行してご報告させていただきます
No.5
- 回答日時:
No.3です。
>これはaverageifの算出例でしょうか?
はいそうです。
>hani変数には
>hani=ws2.Cells(2,27),Cells(2,46),Cells(2,65),、、、
コードを見るとExcelの横着も含めてですけど変数にはセルの値が連結されるだけであり、セルアドレスが入る訳ではないですね。
それに連結するくらいなら最初に
Set r = Range("A2:E2")
のように必要な範囲をRange型変数にSetステートメントで代入するのが宜しいかと。
あとはOFFSETで19列毎に範囲を移動させる。
もしかしたらUNIONは必要なかったかもです。(最初にセル範囲を固定できるなら)
No.3,4 のイミディエイトウィンドウでの結果(r.Address と rr.Address)を見て頂ければわかるかもですが、最初に設定したセル範囲が移動している又組み込まれている違いに気づいて頂ければ参考になるかなと。
めぐみん 様 tatsumaru77 様
色々、アドバイスありがとうございました
結果的に めぐみん 様 にアドバイス頂いたunionを使い
下記コードでシンプルにうまくいきました
そもそも、アドレスの文字列を繋げて使おうとした発想が間違っていて
オブジェクト変数として代入しなければいけなかったことが理解出来ました。
独学自己流なので基本的な理解、説明不足が有り、お手数おかけいたしました。
tatsumaru77 様 にご教示頂いた配列も試したのですがなぜかうまくいかず
今回は断念しましたが、いずれ他の場面で再挑戦したいと思います。
ありがとうございました
又何か機会が有りましたら宜しくお願いいたします。
Dim hani As Range
Set hani = ws2.Cells(i, owaretsu)
For BB = 1 To ma - 1
owaretsu = owaretsu + (BB * retsusuu)
Set hani = Union(hani, Cells(i, owaretsu))
owaretsu = foundcell.Offset(0, 6).Column '////当日終値の列 初期化
Next BB
sigma = WorksheetFunction.StDevP(hani)
No.4
- 回答日時:
No.3です。
ちょっとミスしました。
Debug.Print rr.Address, WorksheetFunction.AverageIf(rr, "<>", rr) '★ 修正
結果:
$A$2:$E$2 3
$A$2:$J$2 5.5
$A$2:$O$2 8
No.3
- 回答日時:
No.2です。
例えば、
Sub try()
Dim r As Range
Dim rr As Range
Set r = Range("A2:E2")
Do
If rr Is Nothing Then
Set rr = r
Else
Set rr = Union(rr, r)
End If
Debug.Print r.Address, WorksheetFunction.AverageIf(r, "<>", r)
Set r = r.Offset(, 5)
Loop Until WorksheetFunction.Count(r) = 0
End Sub
結果:
$A$2:$E$2 3
$F$2:$J$2 8
$K$2:$O$2 13
回答ありがとうございます
説明がうまくなかったと思うのですが、これはaverageifの算出例でしょうか?
補足させていただくと
sigma = WorksheetFunction.StDevP(hani)⇒ プロパティを取得できませんエラー
この部分(標準偏差算出)がうまく行かなくてはまっております、hani変数には
hani=ws2.Cells(2,27),Cells(2,46),Cells(2,65),、、、
の様に19列おきに20件のデータから算出させようとしております
何故か変数haniと入れ替えてhaniの全文で実行した所、うまくいきました(アドレスの結合文自体は問題なく出来ている?)
これも、何が間違っているのか(変数だとだめなのか?)が判明しません
もし、何かアドバイスが有りましたらお手すきの時にご教示頂ければありがたいです
unionに関しても配列のご回答内容と併せて時間があるときに試行してみようと思います
又報告させていただきます
No.1
- 回答日時:
直接の回答ではありませんが、配列の形式にしてStDevPを呼び出せば、
良いかと思います。
以下、サンプルプログラムです。
case3が今回の参考になるかと。
Option Explicit
Public Sub sample()
Dim sigma As Double
Dim arrV As Variant
Dim arrD() As Double
Dim i As Long
sigma = WorksheetFunction.StDev(100, 88, 90)
Debug.Print "case1", sigma
arrV = Array(100, 88, 90)
sigma = WorksheetFunction.StDev(arrV)
Debug.Print "case2", sigma
For i = 0 To 2
ReDim Preserve arrD(i)
If i = 0 Then
arrD(i) = 100
ElseIf i = 1 Then
arrD(i) = 88
Else
arrD(i) = 90
End If
Next
sigma = WorksheetFunction.StDev(arrD)
Debug.Print "case3", sigma
End Sub
実行結果
case1 6.42910050732864
case2 6.42910050732864
case3 6.42910050732864
早々にご回答ありがとうございます
なんとなく理解できそうです
配列を調べてからやってみようと思います
又結果を報告させていただきます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) R列の1111/11/11以外、且つQ列の×の条件で該当行のAからAE列までオレンジに塗りつぶす 2 2022/07/02 10:18
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Changeイベントでの複数セルの...
-
エクセル 2つの表の並べ替え
-
エクセルでフォームのチェック...
-
VBAを使って検索したセルをコピ...
-
【VBA】2つのシートの値を比較...
-
文字列の結合を空白行まで実行
-
VBAコンボボックスで選択した値...
-
マクロ 最終列をコピーして最終...
-
VBA 値と一致した行の一部の列...
-
URLのリンク切れをマクロを使っ...
-
Excelで、あるセルの値に応じて...
-
VBAでのリスト不一致抽出について
-
マクロについて。S列の途中から...
-
エクセルVBA intersect colu...
-
VBマクロ 色の付いたセルを...
-
VBAを用いて条件付きの平均値、...
-
データグリッドビューの一番最...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報