5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
morimotoさんの投稿
(投稿ID: 4625) 添付ファイルのダウンロード権限がありません
現在発展編1学習中です。この講義で研究していることがありまして、
商品ごと→年ごとに並び替えをし、H列に商品ごと、年ごと、合計額、
件数を出力し、さらに商品ごとの合計額と件数をsum関数を使って出力しする。そして1行開けて次の商品についても同様に
商品ごとの合計額と件数をsum関数を使って出力したい。
非常に難しかったのが、sum関数の範囲を指定するところでした。
範囲の始点をsrow, 終点をerowとして
srow→商品の出力の初めだからsrow=tate
erow→商品が変わり出力される手前だからerow=tate-1
,,,だろうとF8の押下を何度もトライしました。
特にsrow=tateと書く位置、erow=tate-1と書く位置を決めるところが
なかなかすぐに定まらず、F8を頼りに何度も何度も書く位置を探し出し
ようやくできた感じです。
そこでお伺いしたいのが、このようなsum関数を使うため範囲を指定するときに、何かコツのようなものがないものか?
あるいは、まったく別の方法があるのか、アドレスいただきたく
よろしくお願いします。仕事でこのような資料を作成する場面があり
この機会に何か習得できたらいいなと思います。
morimotoさんのコメント
(コメントID: 6402)
Sub kenkyu()
'20200102研究
'keyを使っての方針
'課題→商品ごとにSUM関数で合計を出せるか '20200205
Worksheets("練習Sheet1").Activate
'(1)----商品→年ごとに並び替えする
Dim mgyo As Integer
mgyo = Range("a" & Rows.Count).End(xlUp).Row
'(1)----商品→年ごとに並び替えする
Range("a" & 2 & ":" & "f" & mgyo).Sort _
key1:=Range("e2"), order1:=xlAscending, _
key2:=Range("b2"), order2:=xlAscending, _
Header:=xlYes
'(2)-----商品リスト、年を出力
Dim gyo As Integer
Dim key As String '商品&年のkey
Dim key1 As String '商品key
Dim tate As Integer '出力最初のの最初位置
Dim cnt As Integer '件数
Dim shohin As String
Dim toshi As String
Dim goukei As Long
Dim srow As Integer 'sum関数の初値
Dim erow As Integer 'sum関数の終値
tate = 3
cnt = 0
key = ""
key1 = ""
srow = tate '-----ここの位置
For gyo = 2 To mgyo
shohin = Range("e" & gyo).Value
toshi = Range("b" & gyo).Value
goukei = Range("F" & gyo).Value
If key <> shohin & toshi Then
key = shohin & toshi
cnt = 1
If key1 <> shohin Then
key1 = shohin
If tate > 3 Then '1発目(tate=3)のときは転記位置がおかしいから *1 'へ飛んで転記
'#合計記載
erow = tate - 1 '-----ここの位置
Range("H" & tate).Value = Range("H" & erow).Value & "の合計"
Range("J" & tate).Value = "=sum(J" & srow & ": J" & erow & ")"
Range("K" & tate).Value = "=sum(K" & srow & ": K" & erow & ")"
Range("H" & erow & ":" & "k" & erow).Borders. _
(xlEdgeBottom).LineStyle = xlContinuous
tate = tate + 2
srow = tate '-----ここの位置
End If
End If
'↓*1
Range("H" & tate).Value = shohin
Range("I" & tate).Value = toshi
Range("K" & tate).Value = cnt
Range("J" & tate).Value = goukei
tate = tate + 1
Else
'keyに変更がない場合(shohin&toshiが不変のとき)
cnt = cnt + 1
Range("K" & tate - 1).Value = cnt
goukei = Range("J" & tate - 1).Value
goukei = goukei + Range("F" & gyo).Value
Range("J" & tate - 1).Value = goukei
End If
Next gyo
erow = tate - 1 '-----ここの位置
Range("H" & tate).Value = Range("H" & erow).Value & "の合計"
Range("J" & tate).Value = "=sum(J" & srow & ": J" & erow & ")"
Range("K" & tate).Value = "=sum(K" & srow & ": K" & erow & ")"
Range("H" & erow & ":" & "k" & erow).Borders. _
(xlEdgeBottom).LineStyle = xlContinuous
tate = tate + 2
srow = tate
End Sub
小川 慶一さんのコメント
(コメントID: 6403)
morimotoさん:
> そこでお伺いしたいのが、このようなsum関数を使うため範囲を指定するときに、何かコツのようなものがないものか?
> あるいは、まったく別の方法があるのか、アドレスいただきたく
「sum関数を使う」というより抽象的に言うと、「途中集計の範囲を決める」ですね。
その範囲が決まれば、基礎編レベルの合計の計算を実装するか?sum関数を使うか?は自由です。
「途中集計の範囲を決める」ことに困難を感じているならば、そこだけに集中していったんマクロを書き上げることです。
ということで、順を追って実装してみました。
こんな感じ↓ですかね。
ShohinYearStartEnd1 はご理解いただけるものと思います。理解できなければ or 理解できても自力で実装できなければ、基礎編演習不足ですので基礎編演習を徹底してやり直してください。
構造的には「伝票作成マクロ」のアレンジですが、morimotoさんの現在のスキルを考慮して、罫線を引く部分以外は基礎編でお渡しした道具だけで実装しています。
> 小川塾長:
> 現在発展編1学習中です。この講義で研究していることがありまして、
> 商品ごと→年ごとに並び替えをし、H列に商品ごと、年ごと、合計額、
> 件数を出力し、さらに商品ごとの合計額と件数をsum関数を使って出力しする。そして1行開けて次の商品についても同様に
> 商品ごとの合計額と件数をsum関数を使って出力したい。
>
> 非常に難しかったのが、sum関数の範囲を指定するところでした。
> 範囲の始点をsrow, 終点をerowとして
> srow→商品の出力の初めだからsrow=tate
> erow→商品が変わり出力される手前だからerow=tate-1
> ,,,だろうとF8の押下を何度もトライしました。
> 特にsrow=tateと書く位置、erow=tate-1と書く位置を決めるところが
> なかなかすぐに定まらず、F8を頼りに何度も何度も書く位置を探し出し
> ようやくできた感じです。
>
> そこでお伺いしたいのが、このようなsum関数を使うため範囲を指定するときに、何かコツのようなものがないものか?
> あるいは、まったく別の方法があるのか、アドレスいただきたく
> よろしくお願いします。仕事でこのような資料を作成する場面があり
> この機会に何か習得できたらいいなと思います。
>
小川 慶一さんのコメント
(コメントID: 6404)
当初いただいたマクロの添削も示します。
以下でコメントを参照してください。