• ベストアンサー

EXCELマクロを使い、空白行ではさまれた複数列の範囲の数字を合計

NO.2280663で質問した者です。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2280663 2.のsassakunさんの回答で思っていた通りの結果が得られました。 この例では、データ列は、B列だけですが、 これを発展させ、複数列(M列まで)ある表にそれぞれの列で マクロで空白行にコード毎の計と最後に合計を入れる方法を教えてください。 配列変数の使い方がよくわかりません。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.7

#06です。大サービスでヒントをさし上げますからがんばって下さい。マクロの勉強をするつもりがないなら、この先も「既製服に体を合わせる」しかないでしょうw。 数値をカンマ編集するには   対象.NumberFormatLocal = "#,##0" を追加すればよいです。なお、それだけだと以前集計が入ったセルの書式が残りますから、それがいやなら  .ClearContents は  .Clear にしたほうがよいでしょう 集計セルの位置を変える方法は小計挿入、合計挿入でそれぞれ1回ずつ使用しているFOR分の意味を考えるとすぐに分かると思います。 このマクロはあるセルを基準として別のセルを指定するOffsetを多用していますが、その意味が分かれば難しいアルゴリズムではありませんよ。がんばって読んでくださいね。

kenchandesu
質問者

お礼

よく読んでみて、わかりました。 結果はうまくいきました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.6

#01です。補足ありがとうございました。たぶんこのマクロでいけるでしょう。 次回ご質問されるときは、曖昧さがないように最初から具体的な例を提示してくださいね。お互いに二度手間、三度手間になってしまいますから… Option Explicit Sub Macro2() Dim Target, Rng, OfRng, StRng As Range, Adr As String Dim LastC, LastR, idxC, idxR As Long On Error Resume Next Application.ScreenUpdating = False '初期化、最終セル位置確認 LastR = Range("a65536").End(xlUp).Row + 1 LastC = Range("IV1").End(xlToLeft).Column Set Target = Nothing Set Target = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23) If Target.Cells.Count > 0 Then Target.ClearContents End If For idxR = 2 To LastR If Cells(idxR, 1) = "計" Or Cells(idxR, 1) = "合計" Then Cells(idxR, 1).ClearContents End If Next idxR LastR = Range("a65536").End(xlUp).Row + 1 '小計挿入 For idxR = LastR To 2 Step -1 Set Rng = Cells(idxR, 1) With Rng .Value = "計" Set OfRng = .Offset(-1, 0) Set StRng = OfRng.End(xlUp) For idxC = 2 To LastC If OfRng.Offset(-1, 0) <> "" Then Adr = Range(StRng.Offset(0, idxC - 1), _ OfRng.Offset(0, idxC - 1)).Address Rng.Offset(0, idxC - 1).Formula = "=subtotal(9," & Adr & ")" Else Rng.Offset(0, idxC - 1).Formula = "=subtotal(9," & _ OfRng.Offset(0, idxC - 1).Address & ")" End If Next idxC idxR = .End(xlUp).Row End With Next idxR '合計挿入 LastR = Range("A65536").End(xlUp).Row + 1 Cells(LastR, 1) = "合計" For idxC = 2 To LastC Cells(LastR, idxC).Formula = "=subtotal(9," & Cells(2, idxC).Address & ":" _ & Cells(LastR - 1, idxC).Address & ")" Next idxC Application.ScreenUpdating = True End Sub

kenchandesu
質問者

お礼

返事がおそくなりました。丁寧なご回答ありがとうございました。うまくできました!! ここで要望が3点あります。 1.例では、2桁の数字を入れていました。これを千円単位の数字に置き換えて実行しますと、空白セルの下の計と合計欄がカンマ区切りになりません。計、合計すべてカンマ区切りにする。 2.例では、コード番号がA列でした。A,B列に他の項目が入り、コード番号がC列、データがD列からJ列までのデータにする。 3.注釈を「小計挿入」のように付けていただいていますが、他の行でも、もう少し詳しい注釈をつけて下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • NCU
  • ベストアンサー率10% (32/318)
回答No.5

質問です。 なぜ前回の質問は閉じてしまったのでしょうか? 提供されたコードに配列は使われていませんが、なぜ唐突に「配列変数の使い方がよくわかりません。」という発言が出てくるのでしょうか? 提供されたコードの使用に際しては、以下ご注意を。 ・変数は型を宣言してから使う事 ・Excel2007以降誰も使わなくなる事がわかっているようなコーディングをしない事 なお、「複数列(M列まで)ある表にそれぞれの列でマクロで空白行にコード毎の計と最後に合計を入れる」事がなぜ難しいのか?(大した違いはない筈なのに) もしかすると、提供されたコードを全く理解しないまま使おうとされているのではないか? という疑問にも、よろしければお答え下さい。

kenchandesu
質問者

お礼

ご回答ありがとうございます。 具体例は、NO.1の補足をご参照下さい。 前回の質問では、1列の計ができたので、解決したと思い、質問を閉じました。 その後、複数列の疑問が生じ新たに質問し直した訳です。 複数列の場合は、配列変数を使うのかなと思ったからです。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

前回書いた、Wendy02です。 前回の件で、そのまま締めてしまったようですが、前回のマクロで、SpecialCellsで、空白とデータを分けて、その空白セルに Subtotal関数を入れるように設計しました。しかし、実際には、SpecialCellsで、空白が取れないデータは、もともと、本来の空白がなかったとしか思えません。 私も他の方も書いたように、「集計」を使うほうが楽だと思います。それを記録マクロにしてもよいのではないでしょうか? なぜ、マクロでなければならないのか理由が分かりませんし、また、データの空白値やデータの並び自体に信頼がおけないデータの場合は、最初、空白セルを追い出して、ベタの生データから、データ分類をしたほうが安全のようです。 私は、変数に加算方式で足し算するような方法は、極力さけるのは、大量になると、それはものすごく遅いことになるからです。 >配列変数の使い方がよくわかりません。 なぜ、配列変数が出てくるのでしょうか?

kenchandesu
質問者

お礼

ご回答ありがとうございます。 具体例は、NO.1の補足をご参照下さい。 前回の質問では、1列のみだったので、 今回のように複数列の場合は、配列変数を使うのかなと 思ったからです。

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#01です。補足回答が待てなかったのでB列~任意の列全てに金額があると見なして小計と合計を入れるサンプルマクロを作ってみました。列毎に空白セルはバラバラの行にあっても構いません。また空白行が2行以上連続してもよいです。 なお上記仕様だと「小計」「合計」は入れるところがなくなりますので小計:青文字、合計:赤文字にしました。 もし「1行目に金額」とある行だけが集計対象」のような条件がある場合はif文を追加すればいけると思います。修正してみてください。 Option Explicit Sub Macro1() Dim Target, Rng, Ofrng As Range, Adr As String Dim LastC, LastR, idxC, idxR As Long  On Error Resume Next  Application.ScreenUpdating = False '初期化、最終セル位置確認  Set Target = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell)  Range(Cells(1, 1), Target).Font.ColorIndex = 0  LastR = Target.Row + 1  LastC = Target.Column  Set Target = Nothing  Set Target = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23)  If Target.Cells.Count > 0 Then   Target.ClearContents  End If '小計挿入  For idxC = 2 To LastC   For idxR = LastR To 2 Step -1    Set Rng = Cells(idxR, idxC)    With Rng     Set Ofrng = .Offset(-1, 0)     Adr = Ofrng.Address     If Ofrng <> "" Then      If IsNumeric(Ofrng) Then       If Ofrng.Offset(-1, 0) <> "" Then        Adr = Range(Ofrng, Ofrng.End(xlUp)).Address        idxR = Range(Ofrng, Ofrng.End(xlUp)).Row       Else        Adr = Range(Ofrng).Address       End If       Rng.Formula = "=subtotal(9," & Adr & ")"       Rng.Font.ColorIndex = 5      End If     End If    End With   Next idxR  Next idxC '合計挿入  For idxC = 2 To LastC   Set Target = Cells(65536, idxC).End(xlUp)   Adr = Target.Address   Set Target = Target.Offset(1, 0)   Target.Formula = "=subtotal(9," & Cells(1, idxC).Address & ":" & Adr & ")"   Target.Font.ColorIndex = 3  Next idxC  Application.ScreenUpdating = True End Sub

kenchandesu
質問者

お礼

ご回答ありがとうございます。 具体例は、NO.1の補足をご参照下さい。 データに空白があった場合、そこで集計されてしまいます。空白データを0に置き換えると、うまく、計欄に合計数字が出ます。 空白データを自動的に0に置き換える方法はありますか?

全文を見る
すると、全ての回答が全文表示されます。
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

No.1さんに加えて、 前の質問のコードで思ったとおりの結果が得られたということは、 ●一行目には「見出し行」はない ●一回実行後、データの削除修正追加があった場合は、いちいち、”計”、"合計"の欄をクリアーしてから再計算 これ、非常に使いにくいのでは?   普通は一行目ではなくても「見出し行」があり、データはその次の行から入力され、 また、一回実行後、データの削除修正追加があっても、いちいち、"計","合計"の欄をクリアーしないでそのまま再計算するのが普通だと思うがどうか。  

kenchandesu
質問者

お礼

ご回答ありがとうございます。 具体例は、NO.1の補足をご参照下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

補足要求です 前回の質問はA列がコード、B列が金額でB列の小計と合計を求めるものでした。 1)M列までデータがある場合、集計するべき列であることはどのようにすれば分かるのでしょうか。(B~Mは全て集計対象ですか?) 2)また各列のデータで空白行は全て一緒ですか? (例えばB列はB4が空白なら、C4~M4も同じですか? それとも列毎に空白の行は変化しますか?) 3)「計」という文字は今回も入れるのですか?  その場合どの位置に入れれば良いですか? 上記の条件を教えていただかないと、適当にしかマクロを組めません

kenchandesu
質問者

補足

返事が遅くなり、申し訳ありません。 1)B~Mは全て集計対象です。 2)列毎に空白の行は変化します。 3)「計」という文字は今回も入れます。  B列のcodeの変わり目です。 (下記で1行目は列、1列目は行数を表しています) 実行前 ------A------B------C-----D 1--code--data1--data2--data3 2-----1-----10-----40-----20 3-----1-----20------------30 4-----1-----50-----20-----50 5 6-----2-----40-----10 7-----2-----60-----20-----90 8-----2-----30------------80 9 10----3-----50-----40-----70 11----3-----10------------50 12----3-----30-----60 実行後 ------A------B------C-----D 1--code--data1--data2--data3 2-----1-----10-----40-----20 3-----1-----20------------30 4-----1-----50-----20-----50 5----計-----80-----60----100 6-----2-----40-----10 7-----2-----60-----20-----90 8-----2-----30------------80 9----計----130-----30----170 10----3-----50-----40-----70 11----3-----10------------50 12----3-----30-----60 13---計-----90----100----120 14-合計----300----190----390

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCELマクロを使い、空白行ではさまれた範囲の数字を合計

    下記のようなデータがあります。 条件 並び方:コード順 行数:変動する 見出し行の下とコードが変わる毎に空白行が1行あります。 マクロで空白行にコード毎の計と最後に合計を入れる方法を教えてください。 元データ コード 金額 1 10 1 20 1 50 2 40 2 20 2 30 3 50 3 10 マクロ実行結果 コード 金額 1 10 1 20 1 50 計 80 2 40 2 20 2 30 計 90 3 50 3 10 計 60 合計 230

  • [ No.964924 質問:EXCELで同じ内容の行を削除 ]について詳しく教えてください。

    エクセルで同じ内容のセルのある行を自動的に削除したく、No.964924の回答No.2を実行したいのですが、マクロがまったくわかりません。このマクロはどのように記録、実行するのでしょうか。 勉強不足で申し訳ありません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=964924

  • エクセルマクロ、集計行の上に空白行挿入

    エクセルデータがA、B、C、D、E列1000行まであります。 C列基準でE列を合計するマクロを作成しましたが(集計行はデータの下に挿入)、実行の結果、新たに挿入される集計行の上に空白行を1行挿入していくということを、作成したマクロに付加できるでしょうか? ご教授頂きたく、お願いします。

  • エクセルのマクロで、選択範囲の空白行を削除する方法

    タイトルの通りですが、エクセルのマクロを使って、選択範囲にデータの入っていない空白行を削除するマクロを作りたいのですが、うまく行きません。 (空白行の判定は、1つの列だけで、O.K.です。) どなたか、詳しい方、アドバイスお願いします。

  • マクロでエクセルの空白行をアクティブにしたい

    データーを入力しているシートがあり、マクロのボタンをクリックする データの空白行をアクティブになるようにしたいのです。 具体的に B列のデーターが入力されていない行をアクティブにして他のシートのデーターを張り付ける作業をしたいのですが・・よろしくお願いします。

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • エクセルマクロで

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2107311 で質問させていただきました range("c65536").end(xlup).offset(1,0).value = 100000 で、最終行から1つ下のセルに100000と出ましたが そのセルから右に8列 C-K列を塗りつぶししたいのです よろしくお願いいたします

  • Excel-VBAで、Loop処理させるセルの範囲を指定したい

    わたしが http://oshiete1.goo.ne.jp/kotaeru.php3?q=2222401 に示したマクロですと、 1行目から100列×100行の範囲を塗られてしまいますが、 【5行目から】、100列×100行を塗らせるように するには、どのように書き換えたらよいでしょうか。 よろしくお願い致します。

  • エクセルで1行ごとに空白行を挿入し、挿入した空白行に色をつけたいです

    タイトルの通りです。 エクセル(2000)で、データはシート毎に件数が違います。 各シート毎にそれぞれ1行毎、空白行を挿入し、挿入した空白行のA列~G列までに薄いグレーの色をつけるマクロを入れたいのですが、うまくいきません。 詳しい方、教えて下さい。

  • エクセルマクロで表の途中の集計行と合計行追加

    こんなことできますか? エクセルの表が各シートに一つずつあります。 B列からR列まで使用しています。 始まりは3行目で見出し行です。 データは4行目以降ですが、これは各シートごとに最終行は異なります。だいたい120行から200行程度です。 途中に空白はありません。 この表はS列の数値(12種類)により分類され並べ替えてあります。 やりたいのは、S列の数値を見て、分類(同じ数字)ごとに集計する行を追加したいのです。 集計する列は、D~K列だけです。 そして、最終行に全部の合計も出したいのです。 ただ、量が多いのと、頻繁に行なう作業なのでマクロでささっと出来ないかと思います。 どなたかどうすればよいか教えてください。 なにとぞお願いします。

専門家に質問してみよう