🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1153閲覧

IDごとに行数が異なる生データから、平均値、最大値、最小値を出力したいのです

Masarukun

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/02/22 11:13

すいません、エクセル初心者です。マクロで解決したい事がございます。

IDごとに異なる数(行数が異なる)のデータがインプットされるのですが、各IDごとに、データの最大値、平均値、最小値を自動的に抽出するマクロを作りたいのです。IDはスペースで区切られています。
インプットされる行数が同じならば、パターン化すればいいと思ったのですが、IDによっては、3行、5行とランダムなのでパターン化できないのです。。。悲
最初の行と最後の行間でそれぞれ関数をつくればいいのかな、、、?と思ったのですが、コードが書けません。。
プログラマーの方、教えて頂けませんか?どんな関数を使ってVBAでコードを書けばよろしいでしょうか?

やりたい事は、添付の図で示しました。一個目の絵がインプットデータ、2個目の絵が出力したい結果です。全部手でやっているので、日が暮れています。。。(TT) 助けて頂けませんか?

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たとえばこんな感じでどうですか。

VBA

1Sub sample() 2 Dim ws As Worksheet, c As Range 3 Set ws = Sheets(1) 4 For Each c In ws.Cells.Resize(, 1).Cells.SpecialCells(xlCellTypeConstants) 5 With c.CurrentRegion 6 c.Offset(0, 5).Value = "Max." 7 c.Offset(1, 5).Value = "Ave." 8 c.Offset(2, 5).Value = "Min." 9 10 c.Offset(0, 6).Value = WorksheetFunction.Max(.Columns(2)) 11 c.Offset(1, 6).Value = WorksheetFunction.Average(.Columns(2)) 12 c.Offset(2, 6).Value = WorksheetFunction.Min(.Columns(2)) 13 14 c.Offset(0, 7).Value = WorksheetFunction.Max(.Columns(3)) 15 c.Offset(1, 7).Value = WorksheetFunction.Average(.Columns(3)) 16 c.Offset(2, 7).Value = WorksheetFunction.Min(.Columns(3)) 17 End With 18 Next 19End Sub

投稿2021/02/22 11:29

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masarukun

2021/02/22 11:54

早速のご回答ありがとうございます。コードを拝見させていただきました。columns(2),columns(3)ということは、列単位で計算されているということですね。  ID毎にMax,Ave.Minを出そうとすると、範囲指定をしないといけないのでしょうか?例えばID:1ならば、B4:C7、ID:2ならばB9:C14みたいな感じですかね?この場合はjinojiさんならばどのようなコードになりますか? 私の説明が下手ですいません。。。
jinoji

2021/02/22 12:03

まず、With c.CurrentRegion としたうえで、.Columns(2)としているので、 そこの部分は、 c.CurrentRegion.Columns(2) という意味になります。 c というのは、 ws.Cells.Resize(, 1).Cells.SpecialCells(xlCellTypeConstants) をForEach している、 つまり、ワークシートの1列目の中で値が入っているセルを順番に取り出してきてcにセットされます。 最初はID:1のセル、次にID:2のセル、という感じです。 で、CurrentRegionというのは、そのセルの付近の値が入った範囲を取ってきますので、 結果として、IDごとの範囲指定が実現しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問