• ベストアンサー

マクロで小計行を入力する方法

はじめまして。 過去問を検索したのですが、よく分からなかったので質問させていただきます。 数日前にマクロの練習をし始めたばかりで、分からないことが多々あるのですが、ある表を練習で作っていて詰まってしまいました。 番号  月日  会社名  金額 1   11/1   A社   100 2   11/5   A社   200 3   11/4   B社   150 4   11/9   C社   300 このような表があるとして 番号  月日  会社名  金額 1   11/1   A社   100 2   11/5   A社   200   <空白行3行> 3   11/4   B社   150   <空白行3行> 4   11/9   C社   300  ※空白行が3行なのは、印刷した時に会社ごとの境目を見やすくする為です。 この表をマクロを使って自動で会社ごとの境目に空白行を挿入するまではできました。 この後、金額の下に会社ごとの小計を出したいのです。 毎月各社の項目数が変化するので、小計欄を固定することが出来ません。 なので、引数の設定で詰まってしまっています。 色々なサイト様を回って myLAST_ROW = Cells(Rows.Count, 2).End(xlUp).Row myTOP_ROW = 2 myBOTTOM_ROW = i - 1 Set myRANGE = _ Range(Cells(myTOP_ROW, 4), Cells(myBOTTOM_ROW, 4)) Cells(i, 4).Formula = "=SUM(" & myRANGE.Address & ")" myTOP_ROW = i + 1 というのが自分の思う内容に一番近いところまでいったのですが、 番号  月日  会社名  金額 1   11/1   A社   100 2   11/5   A社   200              300   3   11/4   B社   150              450 4   11/9   C社   300              750 のようになってしまいます。 直前のVBAはこうなっています(実際はこの前にページ設定などが入っています)。 For i = Cells(Rows.Count, myCol).End(xlUp).Row To 3 Step -1 If Cells(i, myCol) <> Cells(i - 1, myCol) Then Rows(i).Insert Rows(i).Insert Rows(i).Insert 素人の文面で大変見づらく、そして分かりにくくて申し訳ないのですが、ご教授頂ければ幸いです。

  • hiaro
  • お礼率85% (6/7)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >実際は金額の後にも他の内容の列が続くため、教えていただいた内容では出来ませんでした… 私のコードはほんのちょっと、列を選択するだけでできるはずですが、大量のデータでなければ、私のは使わなくてもよいです。一つずつ、データを検索していませんから、その分だけ速いはずです。ただ、挿入と数式の挿入は分離されていますから、それだけ抜き出してもよいです。 >どこを変更したら「行」の設定にできるかが分かりません。 行という意味がよくわかりませんが、以下を見ていただければよいです。 1列目から使われているのが条件です。 Sub Test1a()   Dim myCol As Integer   Dim a As Range   Dim i As Long   Dim j As Long   Dim n As Long   myCol = 3   '行の挿入   For i = Cells(Rows.Count, myCol).End(xlUp).Row To 3 Step -1     If Cells(i, myCol) <> Cells(i - 1, myCol) Then       Rows(i).Resize(3).Insert     End If   Next   '数式の挿入   For Each a In ActiveSheet.UsedRange.Columns(4).SpecialCells(xlCellTypeConstants).Areas     i = a.Cells.Count     If a.Cells(1).Row = 1 Then '1行目がタイトル行の場合       j = a.Rows.Count - 1     Else       j = a.Rows.Count     End If      a.Cells(i).Offset(1).FormulaLocal = "=SUM(R[-" & j & "]C:R[-1]C)"      '行全体      a.Cells(i).Offset(1).EntireRow.Interior.ColorIndex = 6      ''使用されている列幅だけ-1列目からという条件      'n = ActiveSheet.UsedRange.Columns.Count      'a.Cells(i).Offset(1).EntireRow.Resize(, n).Interior.ColorIndex = 6   Next End Sub なお、#3のレスの部分は、 res = Application.Find("=SUM(", c.Formula) これは、マクロらしく書くなら、 if InStr(c.Formula,"=SUM")>0 Then 'または、' =1 ということだと思います。 また、 Set trg = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23) If Not trg Is Nothing Then このコードは、キメウチにしてしまってよいと思います。しかし  trg Is Nothing というのは、通常ではありえませんね。SpecialCells は、エラーを返しますから、trg Is Nothing は、On Error Resume Nextを使わないと、できません。

hiaro
質問者

お礼

Wendy02様、何度もありがとうございました。 出来ました!!思っていた通りの表が作れて感動です!! まだまだ勉強不足なので、これからも精進していこうと思います。 書いていただいたコードを見ながら、一つ一つ理解していこうと思います。 本当にありがとうございました!!

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 空行を挿入した場合は、以下のように、一気に数式を入れる方法があります。 また、マクロで行う場合は、R1C1方式を使うほうが楽です。 Sub Test1()   Dim myCol As Integer   Dim a As Range   Dim i As Long   Dim j As Long   myCol = 3   '行の挿入   For i = Cells(Rows.Count, myCol).End(xlUp).Row To 3 Step -1     If Cells(i, myCol) <> Cells(i - 1, myCol) Then       Rows(i).Resize(3, 4).Insert     End If   Next   数式の挿入   For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas     i = a.Cells.Count     If a.Cells(1).Row = 1 Then '1行目がタイトル行の場合       j = a.Rows.Count - 1     Else       j = a.Rows.Count     End If      a.Cells(i).Offset(1).FormulaLocal = "=SUM(R[-" & j & "]C:R[-1]C)"   Next End Sub

hiaro
質問者

お礼

Wendy02様、お返事ありがとうございます。 申し訳ございません…当方の説明不足です… 実際は金額の後にも他の内容の列が続くため、教えていただいた内容では出来ませんでした… せっかく書いていただいたのに、申し訳ございません。 R1C1方式ですね。何度か名前だけは見たことがあるのですが、しっかり勉強してみようと思います。 ありがとうございました。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

確認用のMsgBoxを消し忘れてました。 (消したものがこちら) Sub test() Dim sh As Worksheet Dim r As Long, rRec As Long, rEnd As Long Set sh = ActiveSheet rEnd = sh.Cells(Rows.Count, 2).End(xlUp).Row rRec = rEnd For r = rEnd To 2 Step -1 If sh.Cells(r, 3) <> sh.Cells(r - 1, 3) Then  If rRec <> rEnd Then Rows(rRec + 1 & ":" & rRec + 3).Insert  sh.Cells(rRec + 1, 4).Formula = "=SUM(D" & r & ":D" & rRec & ")"  rRec = r - 1 End If Next r End Sub

hiaro
質問者

お礼

fujillin様、お返事頂きありがとうございます。こちらでまとめてお返事させて頂きます。 出来ました!!本当にありがとうございます。 質問だらけで恐縮なのですが、もう一点質問させていただいてもよろしいでしょうか? SUMの入っている「行」に分かりやすいように色をつけたいのです。 自分なりに調べて Sub Macro1() Dim c, trg As Range, res Set trg = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23) If Not trg Is Nothing Then For Each c In Cells.SpecialCells(xlCellTypeFormulas, 23) res = Application.Find("=SUM(", c.Formula) If IsNumeric(res) Then c.Interior.ColorIndex = 6 End If Next c End If End Sub でSUMの「セル」に色をつけることはできたのですが、どこを変更したら「行」の設定にできるかが分かりません。 お忙しい所誠に申し訳ないのですが、こちらもご教授いただけたらと思います。 勉強不足で申し訳ございません。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

よくわかりませんが、3行挿入するときに式も一緒にセットしてしまえばいいのでは? Sub test() Dim sh As Worksheet Dim r As Long, rRec As Long, rEnd As Long Set sh = ActiveSheet rEnd = sh.Cells(Rows.Count, 2).End(xlUp).Row rRec = rEnd For r = rEnd To 2 Step -1 If sh.Cells(r, 3) <> sh.Cells(r - 1, 3) Then MsgBox (r)  If rRec <> rEnd Then Rows(rRec + 1 & ":" & rRec + 3).Insert  sh.Cells(rRec + 1, 4).Formula = "=SUM(D" & r & ":D" & rRec & ")"  rRec = r - 1 End If Next r End Sub

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

以下のマクロを参考にしてください。 ※各社の間に空欄の行が3行追加された状態でのマクロです。 Sub 小計数式設定()   Dim wR     As Long   Dim sR     As Long   Dim eR     As Long   Dim myLAST_ROW As Long   Dim myTOP_ROW  As Long   '   With ActiveSheet     myLAST_ROW = .Cells(Rows.Count, 2).End(xlUp).Row     myTOP_ROW = 2     sR = myTOP_ROW     wR = myTOP_ROW     Do While ExitFlg = False       '各社別最終行を求める       If .Cells(wR, 2).Offset(1, 0) <> "" Then         eR = .Cells(wR, 2).End(xlDown).Row       Else         eR = wR       End If       '小計の数式設定       .Cells(eR + 1, 4) = "=SUM(D" & sR & ":D" & eR & ")"       If eR >= myLAST_ROW Then         '終了         ExitFlg = True       Else         '次社の先頭行を設定         sR = eR + 1         wR = .Cells(eR, 2).End(xlDown).Row       End If     Loop   End With End Sub

hiaro
質問者

お礼

お返事ありがとうございます。 ただ、私の入力場所が悪かったのか、もしくは何か違うことをしてしまったのか、SUMは入ったのですが、引数が一つ前の会社名の合計SUMも含めてしまうようになってしまい、質問文の一番下の表のようになってしまいました。 もう少しマクロを勉強して、pkh4989様のおっしゃられた内容が分かるようになりたいと思います。 ありがとうございました。

関連するQ&A

  • Excelの集計表で固定していない小計があり、計算結果を上方の小計行に入れたい。

    エクセル2K使用で300行程度の表があり、2行目まではタイトル行です。 A列  B列 C列(金額)2行目 あ   小計  60 い  (空白)  10 う  (空白)  20 え  (空白)  30 お   小計  90 か  (空白)  40 き  (空白)  50 く   小計  400 ←計算が合いません け  (空白)  60 こ  (空白)  70 さ  (空白)  80 し  (空白)  90 す  (空白)  100 カテゴリOffice系で上記の質問をいたしましたが、 "VBAで無いと難しいと思う"とアドバイスいただきましたので、 こちらで質問させていただきます。 VBAは超初心者ですが、色々の例題を検索し試行錯誤して下記マクロを 作成しましたが、一番下の小計が合いません宜しくお願いします。 Sub SYOUKEI() Dim i As Long Dim myLAST_ROW As Long Dim myTOP_ROW As Long Dim myBOTTOM_ROW As Long Dim myRANGE As Range With ActiveSheet myLAST_ROW = .Cells(Rows.Count, 1).End(xlUp).Row myTOP_ROW = 3 For i = myLAST_ROW To 1 Step -1 If .Cells(i, 2).Value = "小計" Then myBOTTOM_ROW = i + 1 Set myRANGE = _ .Range(.Cells(myTOP_ROW, 3), .Cells(myBOTTOM_ROW, 3)) .Cells(i, 3).Value = WorksheetFunction.Sum(myRANGE) myTOP_ROW = i - 1 End If Next i End With Set myRANGE = Nothing End Sub

  • 選択した行のみマクロを使いたい

    以前、こちらのサイトで表を展開するマクロを教えていただきました。 そのマクロをシート全体ではなく、任意の行や任意のセルにだけに使えるようにしたいです。 Sub 展開() Dim nLast As Long Dim vAdata, i, j Dim vData nLast = Cells(Rows.Count, 1).End(xlUp).Row '行を追加削除する時は下から上が基本 For i = nLast To 1 Step -1 vAdata = Cells(i, 1) 'A列が空白ではなく、B列が空白の場合、B列以降を上と同じにする If (vAdata <> "") And (Cells(i, 2) = "") And (i > 1) Then Rows(i) = Rows(Cells(i, 2).End(xlUp).Row).Value Cells(i, 1) = vAdata End If If vAdata = "" Then 'A列の値が空白なら削除 Rows(i).Delete Shift:=xlUp Else 'A列の最後に「,」が有る場合は取り除く If Right(vAdata, 1) = "," Then vAdata = Left(vAdata, Len(vAdata) - 1) End If vData = Split(vAdata, ",") 'A列の値がカンマで区切られていた場合 If UBound(vData) > 0 Then '対象行をコピーして区切られていた数-1だけ下に挿入 Rows(i).Copy Rows(i & ":" & i + UBound(vData) - 1).Insert Shift:=xlDown 'A列の値を区切られていた値に書き換える For j = 0 To UBound(vData) Cells(i + j, 1) = vData(j) Next j End If End If Next i End Sub というマクロを教えて頂きました。 これをどのようにすればいいでしょうか? ご教授お願いします。

  • エクセルで行を挿入して小計合計を出したい

    質問ですが,以下の参考としたマクロについて,データが1支店1件しかない場合は行を挿入せずにこのままとしたい場合はどのように修正すれば良いか教えていただけませんでしょうか。 1支店2件以上のデータがある場合は,以下の参考としたマクロのとおり行を挿入して小計を計算表示する。  支店コード1001 20000円 200円  ← 行挿入不要 小計無し       1002 30000円 200円       1002 45000円 300円       小計 75000円 500円 参考にした質問・アドレス A列に支店コード(4桁の数値)、J列に金額、K列に手数料があります。 支店は5箇所でデータは1支店あたり100~500行ほどあります。全支店のデータが連続しています。 1.支店コードの最終行の下に1行挿入し、J列,K列の小計を計算する。 2.最後の支店の小計の下に一行あけてJ列,K列の合計をしたい。 Sub test01() d = Range("a2").CurrentRegion.Rows.Count ' MsgBox d Cells(d + 1, 1) = "END" Dim st1, gt1, st2, gt2 As Long st1 = 0: gt1 = 0: st2 = 0: gt2 = 0 mk = Cells(2, 1) '========== For i = 2 To 10000 If Cells(i, 1) = "END" Then Exit For '最終行判定 If Cells(i, 1) = mk Then '前行とコード同じか '------今回行分加算 st1 = st1 + Cells(i, 2) st2 = st2 + Cells(i, 3) Else mk = Cells(i, 1) '--------小計 Cells(i, 1).EntireRow.Insert Cells(i, 1) = "小計" Cells(i, 2) = st1 gt1 = gt1 + st1 st1 = 0 Cells(i, 3) = st2 gt2 = gt2 + st2 st2 = 0 '-----今回行分加算 i = i + 1 st1 = st1 + Cells(i, 2) st2 = st2 + Cells(i, 3) End If Next i '============終了 '-------小計 Cells(i, 1) = "小計" MsgBox st1 Cells(i, 2) = st1: gt1 = gt1 + st1: st1 = 0 Cells(i, 3) = st2: gt2 = gt2 + st2: st2 = 0 '-------合計 Cells(i + 1, 1) = "合計" Cells(i + 1, 2) = gt1 Cells(i + 1, 3) = gt2 End Sub   アドレス http://okwave.jp/qa/q414647.html

  • 【エクセルマクロ】小計下への空白行挿入

    マクロ初心者です。 日付ごとのデータがありまして、 webで検索した次のマクロを使って、 ' 1行目から処理開始(見出しなし) GYO = 1 Do While Cells(GYO, 1).Value <> "" ' 小計グループの先頭行→GYO1 GYO1 = GYO GYO = GYO + 1 ' 次の行から同じグループでない行を見つける Do While Cells(GYO, 1).Value = Cells(GYO1, 1).Value GYO = GYO + 1 Loop ' 同じグループの最終行→GYO2 GYO2 = GYO - 1 ' 小計行を挿入 Rows(GYO).Insert Cells(GYO, 2).Value = Cells(GYO1, 1).Value & "月の小計" Cells(GYO, 3).Value = " ********** " Cells(GYO, 6).FormulaR1C1 = "=SUBTOTAL(9,R" & GYO1 & "C:R" & GYO2 & "C)" Cells(GYO, 7).FormulaR1C1 = "=SUBTOTAL(9,R" & GYO1 & "C:R" & GYO2 & "C)" Cells(GYO, 8).FormulaR1C1 = "=SUBTOTAL(9,R" & GYO1 & "C:R" & GYO2 & "C)" GYO = GYO + 1 Loop ' 総合計 Cells(GYO, 2).Value = "年度合計" Cells(GYO, 3).Value = " ********** " Cells(GYO, 6).FormulaR1C1 = "=SUBTOTAL(9,R1C:R" & GYO2 & "C)" Cells(GYO, 7).FormulaR1C1 = "=SUBTOTAL(9,R1C:R" & GYO2 & "C)" Cells(GYO, 8).FormulaR1C1 = "=SUBTOTAL(9,R1C:R" & GYO2 & "C)" 次のように、小計と年度計を挿入できるのですが、 見にくいので、小計の下に1行挿入したいのです。 4/1    ○○○ ¥□□ | 4/30    ○○○ ¥□□ 4月の小計 **** ¥□□ 5/1    ○○○ ¥□□ | 5/31    ○○○ ¥□□ 5月の小計 **** ¥□□ 6/1 |  (途中省略) 4/30 4月の小計 **** ¥□□ 年度計  **** ¥□□ マクロに詳しい方、アドバイスよろしくお願いします!

  • マクロ 行を切り取ってペーストでエラーになる

    J列に「0」と「#N/A」の行を切り取って集計対象外シートに貼り付けるといったコードです。 何故か途中でエラーになります。 どこが間違っておりますか? 宜しくお願いします。 Dim LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 10) = "0" Or Cells(i, 10) = "#N/A" Then Rows(i).Cut Sheets("集計対象外").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i

  • エクセル マクロで行の合計を数値で入力したい

    マクロ初心者です。 F列からAJ列までの合計をAK列に数値で入力しようとしています。 ただし、FからAJ列の各セルに全てデータは入っていません。 したがってFからAJ列のいずれかにデータが入っている最終行を 見つけて合計を算入しようとしているのですが下記の通りやっても うまくいきません。教えてください。 エクセルのバージョンは2002です。 Sub () 'データが入っている最終行まで合計額を数字で入力 LastRow = Cells(65536, COL).End(xlUp).Row For i = LastRow To 6 Step -1 Set myRange = Range(Cells(i, 6), Cells(i, 36)) Cells(i, 37).Value = WorksheetFunction.Sum(myRange) Next i End Sub

  • マクロコードについて教えて下さい!

    下記のコードは教えていただいたコードなのですが、他のシートから計算表のシートにうつされると 時間計測をされるようになっています。 ですが、インターネットを開くには問題はないのですが、他のエクセルを開くと(1)の文のとこがエラーになってしまいます。エラーがでないようにすることはできないでしょうか??ぜひお力をかしてください。宜しくお願いします。 Sub timer_on() Dim i, myCol With Worksheets("計算表")     ←(1) For Each myCol In Array("f", "n") For i = 6 To .Cells(Rows.Count, myCol).End(xlUp).Row If .Cells(i, myCol).Value <> "" Then .Cells(i, myCol).Value = .Cells(i, myCol).Value + TimeValue("0:00:10") Next Next End With Application.OnTime Now + TimeValue("0:00:10"), "timer_on" End Sub

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • Excelの空白行を上に詰めるVBAについて

    Excelにて特定の列のみの空白を上に詰めるVBAを組んだのですが、 全ての列に適用してしまって困っております。 Sub 空白を上に詰める() Dim Lrow, i As Long Dim myRange As Range Lrow = Range("AH65536").End(xlUp).Row Set myRange = Rows(Lrow + 1) For i = 1 To Lrow If Cells(i, 34) = "" Then Set myRange = Union(myRange, Rows(i)) End If Next i myRange.Delete End Sub 上記のように「AH」列にのみ適用するように組みましたが、 うまくいきません。 VBAは初心者レベルです。 VBAにお詳しい方のご意見をお聞かせ願えますでしょうか。 宜しくお願い致しますm(_ _)m

  • VBAで行を挿入する

    VBAを始めた初心者です。 Exel2002使用です。 VBAでA列の4行目から10行目に行の挿入をできるようにしようと下記のように書きましたが、Rows("i:i").Selectの部分でデバックがかかってしまいます。間違っている理由がわからないのですがよろしくお願いします。 また、DO While Loopステートメントを使ってA列が空白になるまで(例えばA4セル以下の)行を挿入とする場合の方法も教えていただけましたら幸いです。 Sub 4行目から10行目まで() Dim i As Integer For i = 4 To 10 Cells(i, 1).Value = i Rows("i:i").Select Selection.Insert Shift:=xlDown Next i End Sub Sub 4行目から空白になるまで() Dim i As Integer Range("A4").serect Do While activecell.value = "" Cells(i, 1).Value = i Rows("i:i").Select Selection.Insert Shift:=xlDown activecell.offset(1,0).select Loop End Sub

専門家に質問してみよう