添付画像(左)のようなデータがあり、例えば区分「A」でフィルタした際に
直近2シリーズの値の平均値をVBAで求めて表示したいです。
日付が同日もしくは連続した日は1シリーズと考えます。
日付が2日以上あいた場合は別シリーズと考えます。
添付画像の例(右)だと、
赤枠で1シリーズ、青枠で1シリーズ、黄色範囲(直近2シリーズ)を対象範囲に
平均値をVBAで表示したいです。
SUBTOTAL関数を使ったらなんとなくできそうなイメージはできるのですが、
対象範囲をどのようにしたらよいかがわからず、ご教授ください。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#3です
でたらめでした。
ご質問の画像内容の場合は処理できるかも知れませんが
cnt = Application.CountIf(Range("B2:B" & lastRow), ">=" & DateAdd("d", -2, key1)) + 1
key2 = Application.Large(Range("B2:B" & lastRow), cnt)
は、必ず DateAdd("d", -2, key1) になる訳でないので ダメダメです
関数を考えるよりVBAなので下記の様に訂正してください
cnt = Application.CountIf(Range("B2:B" & lastRow), ">=" & DateAdd("d", -2, key1)) + 1
key2 = Application.Large(Range("B2:B" & lastRow), cnt)
を
For Each c In Range("B2:B" & lastRow).SpecialCells(xlCellTypeVisible)
If DateAdd("d", -1, key1) > CDate(c) Then
If key2 < CDate(c) Then key2 = CDate(c)
End If
Next
で大丈夫かな?
ちなみに c は Dim c As Range で Dim cnt As Longは不要です
No.3
- 回答日時:
こんばんは、
#2様の回答を読んでなるほど、、と
AGGREGATE関数(14,6を上手く使えませんでした。。
やり方は色々あると思いますが、フィルタとシート関数の組み合わせで
ループでべた処理の方がすっきりするかも、、です
Sub test()
Dim key1 As Date, key2 As Date
Dim lastRow As Long
Dim cnt As Long
Dim Ans(1)
If ActiveSheet.AutoFilterMode = True Then ActiveSheet.Range("A1").AutoFilter
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
With ActiveSheet.Range("A1:C" & lastRow)
.AutoFilter Field:=1, Criteria1:="A"
key1 = CDate(Application.Large(Range("B2:B" & lastRow).SpecialCells(xlCellTypeVisible), 1))
cnt = Application.CountIf(Range("B2:B" & lastRow), ">=" & DateAdd("d", -2, key1)) + 1
key2 = Application.Large(Range("B2:B" & lastRow), cnt)
.AutoFilter Field:=2, Criteria1:="<=" & key1, _
Operator:=xlAnd, _
Criteria2:=">=" & DateAdd("d", -1, key1)
Ans(0) = (Application.Subtotal(1, Columns(3)))
.AutoFilter 2
.AutoFilter Field:=2, Criteria1:="<=" & key2, _
Operator:=xlAnd, _
Criteria2:=">=" & DateAdd("d", -1, key2)
Ans(1) = (Application.Subtotal(1, Columns(3)))
MsgBox ("シリーズ1 Average:" & Ans(0) & vbCrLf & "シリーズ2 Average:" & Ans(1))
.AutoFilter
End With
End Sub
第一条件の Aは一か所で設定しているので
変数や配列、範囲ループなどで代入してください。
取り敢えずメッセージボックスで
結果は配列に入れています
該当データが抽出できない場合 エラーが返りますので対策を加えてください。
No.2
- 回答日時:
こんばんは
>平均値をVBAで表示したいです。
関数でも良ければ・・・
起こり得る可能性がいろいろとありすぎるため、エラーチェックを省いていますので、最低一つ以上該当するデータがあることを条件にしています。
(エラーチェックを全部行うと、大変複雑な式になってしまうので…)
平均値を出したいセルに、
=SUMPRODUCT((A2:A15="A")*(B2:B15>IFERROR(AGGREGATE(14,6,B2:B15/(A2:A15="A")/(B2:B15<AGGREGATE(14,6,B2:B15/(A2:A15="A"),1)-2),1),0)-3)*C2:C15)/SUMPRODUCT((A2:A15="A")*(B2:B15>IFERROR(AGGREGATE(14,6,B2:B15/(A2:A15="A")/(B2:B15<AGGREGATE(14,6,B2:B15/(A2:A15="A"),1)-2),1),0)-3))
※ フィルター操作は不要です。
※ 上記は"A"の場合の例です。ご提示のデータの例では、結果は 163/6 = 27.16666 になります。
※ "A"以外の値で絞込みしたい場合は、式中の"A"部分を"B"などに置き換えればよいですが、どこかのセルに「A」、「B」などを入力することにして、式中の"A"をセル参照に置き換える方が、可用性は高くなるでしょう。
もちろん、VBAで算出することも可能ですが、そちらは他の方にお任せいたします。
VBAでなければダメという場合は、スルーしてください。
No.1
- 回答日時:
>日付が同日もしくは連続した日は1シリーズと考えます。
>日付が2日以上あいた場合は別シリーズと考えます。
4/2と4/3が該当しない理由は何でしょう?(4/1~4/3と考えても良いのか?)
と初級者レベルは感じました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel VBAについて 2 2022/08/02 06:19
- Excel(エクセル) エクセルで指定範囲にある名前と重複した場合に入力できないようにしたい 1 2023/07/13 09:58
- Excel(エクセル) Excelグラフについて 1 2022/06/16 16:06
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- Excel(エクセル) エクセルのvlookupについて質問です 3 2023/01/05 15:15
- Excel(エクセル) エクセルで書式設定とフィルタの組み合わせでうまく行かないのですが 4 2022/10/07 10:02
- 統計学 箱ひげ図の外れ値(四分位範囲の1.5倍)の定義 4 2022/06/01 15:22
- 数学 【 数I 分散 】 3 2023/02/26 21:55
- Visual Basic(VBA) 昨日、質問した件『VBA にて、条件付き書式で背景色を設定しているセルの範囲で、背景色付きのセルをカ 4 2022/04/07 14:39
- 統計学 統計検定2級の過去問について 1 2023/01/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
smartyのforeachの使い方
-
3つの連想配列を交互に代入し...
-
添え字が全て文字列のPHPの多次...
-
foreachのなかで次のキーを参照...
-
スカラーのベクトル微分
-
forとかで連番の変数を一気に格...
-
PHP 多次元配列変数のデータ受...
-
CSVデータのn番目だけの値を取...
-
$_SESSIONに二次元配列を使える...
-
While文を使って配列の中身を全...
-
多次元配列をソートする綺麗な...
-
CSVデータの行数カウントをした...
-
プルダウンメニューにDBの内容...
-
unset使用時の利点
-
配列の書き方
-
多次元配列の一次元目の最大値...
-
String だと「 ByRef引数の型が...
-
ログファイルが一定行数を超え...
-
multiple属性のPOSTを配列で受...
-
ヒアドキュメントの中のfor文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
foreachで上限回数指定方法また...
-
VB.NET で 二次元のハッシュは...
-
PHP、{}記号の意味
-
マッチング処理(1:N)
-
sqlのデーターを『あ行』『か行...
-
3つの連想配列を交互に代入し...
-
smartyのforeachの使い方
-
Smartyでインクリメント
-
Excel VBAでフィルター後の対象...
-
連想配列でキーを利用して一部...
-
ラジオボタンをランダムに表示...
-
ftokが動かない?
-
配列からプルダウン用のHTMLを生成
-
リストボックス複数選択抽出方法
-
関数の引数に配列を初期化なしで。
-
foreachの間にテーブルの<TR>を...
-
smartyでtplファイルでの2次元配列
-
PHPで変数名にハイフンを使うに...
-
PHPでJSONを扱うときに配列の参...
-
PHPで連想配列のプルダウンメニ...
おすすめ情報