- 締切済み
マクロについての質問です。
マクロについての質問です。 下記の表で栃木支店から東京支店の合計を東京支店の下に1行挿入して合計額を入力したいと考えております。合計する範囲は変動する可能性があります。 マクロ化することは可能でしょうか?? 一応下記のように[東京]を検索して行を挿入するというところまで作ってみました。 このあとどのようにすれば可能か教えて頂けないでしょうか?? また他に方法がありましたら教えてください。 よろしくお願い致します。 ------------------------------------------------------- Cells.Find(What:="東京", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate ActiveCell.Offset(1, 0).Select Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove ActiveCell.Offset(0, 1).Select -------------------------------------------------------- 商品(1) 商品(2) 商品(3) 宮城支店 100 200 100 福島支店 150 300 200 栃木支店 100 100 300 2 埼玉支店 100 500 400 0 茨城支店 200 100 500 1 群馬支店 300 200 300 0 千葉支店 400 300 300 埼玉支店 400 400 200 東京支店 200 500 100 長野支店 100 400 200 ――――――――――――――― 宮城支店 100 200 100 福島支店 150 300 200 栃木支店 100 100 300 埼玉支店 100 500 400 2 茨城支店 200 100 500 0 群馬支店 300 200 300 1 千葉支店 400 300 300 1 埼玉支店 400 400 200 東京支店 200 500 100 長野支店 100 400 200
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
こういうのはソート法というのが良いだろう。ただしバッチ的仕組みだが。 シートのコピーを、ある時点で作る(月末分とかの区切り時点データなどで。バッチ処理であるゆえん)。 支店列でソート 前の行の支店名を記録する変数を作る。 上からデータ最終行まで下記処理を繰返す。 各行では合計用の変数に各計数を足しこむ。 前の行の支店と今の行の支店が変化したら1行空白行を挿入し、その行に 支店名、合計などをセットする。セットしたら合計用の変数はご破算(=0) そして今の行のデータで各合計変数に足しこむ。前の支店変数には、今の行の支店をセット。 最終行の処理を終わったら、次の行に最終分の支店名、合計計数の行のデータを作る。 ーー 丸投げに近いのでコードは敢えて書かない。自分で勉強のこと。 ーー 1つ1つ出た都度に検索していたら収まりが付かない、複雑なロジックになる。 ーーー こういうロジックといっているもの(やり方)は、色々のやり方がありえる。経験を積んでそのバラエティと場合に応じた適否のセンスを磨くことがVBAやプログラム作成で一番難しい。周りにベテラン(指導者)が居ないと絶望的(に時間がかかるとおもう。 VBAの文法などは解説書などで、こつこつで学べるが、こちらはそうではないと思うので。
- mt2008
- ベストアンサー率52% (885/1701)
「東京支店」と「栃木支店」の位置(Row)を最初に確認する。 次に、東京支店の下に1行追加して、栃木支店から東京支店までの合計値を代入。 この1行挿入から合計値代入までの作業を、下から上へ行う。 「下から上へ行う」のがポイント(そうしないと1行挿入する事でせっかく確認した位置がずれてしまいます)。 支店名が入っているのがB列だった場合のサンプルです。 あくまでもサンプルですので、エラー処理や「栃木支店」の前に「東京支店」がある場合などは考慮していません。 Sub sample() Dim rSearch As Range Dim nRowTokyo(), nRowTochigi(), nCount, i, j nCount = Application.WorksheetFunction.CountIf(Range("B:B"), "東京*") If nCount <> Application.WorksheetFunction.CountIf(Range("B:B"), "栃木*") Then MsgBox ("東京と栃木の数が不一致") Exit Sub End If ReDim nRowTokyo(nCount) ReDim nRowTochigi(nCount) '**東京支店の位置探し Set rSearch = Cells(Rows.Count, 2) For i = 0 To (nCount - 1) nRowTokyo(i) = Cells.Find(What:="東京", after:=rSearch, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row Set rSearch = Cells(nRowTokyo(i), 2) Next '**栃木支店の位置探し Set rSearch = Cells(Rows.Count, 2) For i = 0 To (nCount - 1) nRowTochigi(i) = Cells.Find(What:="栃木", after:=rSearch, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row Set rSearch = Cells(nRowTochigi(i), 2) Next '** 行の挿入 For i = 0 To (nCount - 1) Rows(nRowTokyo(i) + 1).Insert Shift:=xlDown For j = 3 To 5 Cells(nRowTokyo(i) + 1, j) = Application.WorksheetFunction.Sum(Range(Cells(nRowTochigi(i), j), Cells(nRowTokyo(i), j))) Next j Next i End Sub
- MARU4812
- ベストアンサー率43% (196/452)
「どこから」というのを明確にしてください。 必ず「栃木支店」から始まっているなら、同じように「栃木支店」 を検索して、その位置から「東京支店」まで何行あるか数えれば いいのでは? 関東圏のどこかの支店がランダムに並んでいるなら、 関東圏の支店一覧でも作っておいて、そこに含まれる データかどうか判断するとか。 ところで「東京支店」は必ず最後に来てくれるの???