Excelマクロで数値を累積し500を超えるとゼロから再開する方法について

このQ&Aのポイント
  • Excelのマクロを使用して、指定された範囲の数値を累積し、累積値が500を超えるとゼロから再開する方法について質問があります。
  • 現在のマクロでは、累積値が500を超えた場合には近似値を取得していますが、今回は厳密に500を超えたらゼロから再開するように修正したいです。
  • 修正されたマクロを教えていただけると助かります。また、マクロの修正にあたり注意すべきポイントなどがあれば教えていただけると嬉しいです。
回答を見る
  • ベストアンサー

Excel累積が規定数を超えたらまたゼロから累積

マクロに関してご相談です。 A列に数値が入っています。1000行ほどあります。 それらの数値を上から順にA1+A2+…と加算していき,500以上になったらその行のB列にその合計を記入し,一旦ゼロにリセットし次のA列の行(添付の図ではA6)からまた加算を始め,500になったらその行のB列に合計を記入し…ということを,A列の数値が終わるまで繰り返す,という作業を行いたいと思います。 以前他の方の質問で下記の回答が掲載されていました。 VBAでの一例です。 データは1行目からあるとします。 Sub Sample1() Dim i As Long, myVal1, myVal2 Range("B:B").ClearContents For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row myVal1 = myVal1 + Cells(i, "A") myVal2 = myVal1 + Cells(i + 1, "A") If myVal1 <= 500 And myVal2 > 500 Then If 500 - myVal1 <= myVal2 - 500 Then Cells(i, "B") = myVal1 Else Cells(i + 1, "B") = myVal2 i = i + 1 End If myVal1 = 0 End If Next i End Sub この方の質問の場合、合計数がちょうど500になることはまれなので,近似のセルをとるようにするという条件がありました。 今回はこの近似の条件は不要で500を超えたら、ゼロから累積するようにしたいですが、マクロをどのように修正したらよいでしょうか。 何かしらのヒントでもいただければと存じます。 よろしくお願いいたします。

noname#248669
noname#248669

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

myVal2がいりませんからそれに関するところを除いて 500以上の条件式は myVal1 >= 500 で修正してみてください。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

こんなのでよいのかな。B列結果をみて、打ち切るタイミングが、違っておれば言ってください。 標準モジュールに Sub test01() frm = 2 lr = Range("A100000").End(xlUp).Row For i = 2 To lr If WorksheetFunction.Sum(Range("A" & frm & ":a" & i)) < 500 Then Cells(i, "B") = WorksheetFunction.Sum(Range("A" & frm & ":a" & i)) Else frm = i Cells(i, "B") = WorksheetFunction.Sum(Range("A" & frm & ":a" & i)) End If Next i End Sub === データ例と結果 A2:B11 123 123 324 447 212 212 111 323 123 446 324 324 212 212 111 323 111 434 65 499

関連するQ&A

  • Excel累積が規定数を超えたらまたゼロから累積

    言葉でうまく説明できないゆえ検索もままならず,ここで質問させていただきます。お願いいたします。 Excel2007です。理想図を添付しましたので,それに従い説明いたします。 A列に数値が入っています。1000行ほどあります。 それらの数値を上から順にA1+A2+…と加算していき,500になったらその行のB列にその合計を記入し,一旦ゼロにリセットし次のA列の行(添付の図ではA6)からまた加算を始め,500になったらその行のB列に合計を記入し…ということを,A列の数値が終わるまで繰り返す,という作業を行いたいと思います。 また,合計数がちょうど500になることはまれなので,近似のセルをとるようにします。例えば添付画像において,A5の段階での合計は480で,A6になると635ですので,A5のほうが500に近いためそのセルで区切ります。 関数でもマクロでもかまいません。 何かしらのヒントでもいただければと存じます。 よろしくお願いいたします。

  • エクセルの行の削除を配列で高速化したい

    A列にID番号(012345等の文字列化した数字) B列に属性(A、B、C等の文字列) C列に数値  のようなデータがあります。 1行目はタイトル行です。 最優先されるキーをA列、2番目に優先されるキーをB列にして並べ替えてあります。 A列、B列のデータは重複するものがあります。 このデータを、 A列のID番号が同じだった場合、上の属性がA、次の行の属性がBの組み合わせだった場合のみ、下の行のC列の数値データを上の行のC列の数値に加算して、下の行を削除します。 以下のマクロを書き、うまくいきました。 Sub 集計() Dim i As Long, r As Long r = Cells(65536, 1).End(xlUp).Row Application.ScreenUpdating = False For i = r To 2 Step (-1) If Cells(i, 1) = Cells(i - 1, 1) Then If Cells(i, 2) = "B" And Cells(i - 1, 2) = "A" Then Cells(i - 1, 3) = Cells(i - 1, 3) + Cells(i, 3) Rows(i).Delete End If End If Next Application.ScreenUpdating = False End Sub しかし、データ数が多いので1分以上かかってしまいます。 多分、配列に取り込んで処理できれば飛躍的に高速化できるとは思うのですが、 V = Range(Cells(2, 1), Cells(r, 3)).Value と取り込んだあと、どう処理したらいいのかわかりません。 教えてください。

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • エクセルマクロ 【空白セルを無視する方法を教えてください】

    マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。 内容は、今、エクセルシートのA1~B5の範囲で A B 1 1 1 2 1 2 3 4 1 5 1 という形で入力されています(見難くてスミマセン)。 この状態から「A列とB列に同じ数字が入力されてれば、メッセージBOXを表示して、なおかつOKボタンを押したら該当セルを赤くする」というマクロを作りたいのですが、本来であれば1行目のみ赤くなるはずなのですが、空白セルが含まれている3行目も赤くなってしまうんです。つまり、空白セルも「同じ値」と認識されているみたいなのですが...。 この場合、空白セルを無視するにはどうしたらよいのですか?教えてください。なお、マクロは以下のように作っています。 Sub ナンバーチェック() Dim Btn As Integer For X = 5 To 10 If Cells(X, "A").Value = Cells(X, "B").Value Then  Btn = MsgBox("同じ数値です", vbOK, "警告")  If Btn = vbOK Then   Cells(X, "A").Interior.ColorIndex = 3 Cells(X, "B").Interior.ColorIndex = 3 End If End If Next End Sub

  • 行ごとに判定するマクロについて教えて下さい

    行ごとに判定するマクロについて教えて下さい。 下記のようなマクロで、添付ファイルのように、行ごとで E列からN列で違った数値がないか、入力されていないセルがないかを調べ 4つすべてのセルが同じ数値でない場合は塗りつぶしはされず O列にOKを表示しないようなマクロを組みたいのですが 現在のマクロだと、行ごとではなく、E3~N102セルまでの中で 同じ数値がないかを判断してしまっているため K11セルやK15セルのように数値が入力されていないにも関わらずO列の部分にOKが出てしまいます。 他の行に同じ数値が入っているのは関係なしにして 11行目なら11行目だけで 15行目なら15行目だけで、というように行ごに判定していくには どのようにすればいいでしょうか? Sub 判定マクロ回転() Dim i As Integer, j As Integer Range(Cells(3, 15), Cells(102, 15)).ClearContents For i = 3 To 102 For j = 5 To 14 Cells(i, j).Interior.ColorIndex = 0 If WorksheetFunction.CountIf(Range("E3:N102"), Cells(i, j)) > 3 Then If Cells(i, j).Row Mod 2 = 1 Then Cells(i, j).Interior.ColorIndex = 6 Cells(i, 15) = "OK" Else If Cells(i, j).Row Mod 2 = 0 Then Cells(i, j).Interior.ColorIndex = 40 Cells(i, 15) = "OK" End If End If End If Next j Next i If WorksheetFunction.CountIf(Range("O3:O102"), "OK") > 99 Then MsgBox "データチェックOK(^O^)b" End If End Sub

  • エクセル2000のマクロで、if文が想定通りに動かない

    90から93列目にかけて、データが 0又は3~4桁の数字が入っている状態です。 4810,0,0,2430 以下はマクロの抜粋です。 やりたいことは、0でなければ各変数に1を代入し、95列めに合計を入力します。 If Cells(i, 90) <> 0 Then w = 1 If Cells(i, 91) <> 0 Then x = 1 If Cells(i, 92) <> 0 Then y = 1 If Cells(i, 93) <> 0 Then z = 1 Cells(i, 95).Value = w + x + y + z このマクロを実行しますと、実際には0でない列が2列にもかかわらず、95列目に3と入力されてしまいます。1行ずつ実行してみたら、if文の3行目の92列目の判定が変です。 実行中に、カーソルをかざすとCells(1, 92)=0と表示されるのですが、合計を代入するところの y には1が代入されてしまっています。 何か間違っているんだと思いますが、分かりません。よろしくお願いします。

  • 公差を設定して判定するマクロ

    規格を設けて判定するマクロについて教えてください。 下記のようなマクロがあるとき、現在はE列、H列、K列が同じ数値の場合は 塗りつぶしが行われるようになっています。 これを少し改造して、B4セルに公差の数値を入力した時 E列の数値を基準とし、H列、K列がE列からB4セルに入力した公差内なら色を付けるような マクロを組みたいです。 例えばB4セルに2と入力してあるとします。 E列の数値が4.2だとした場合 H列は2.2、K列は6.2ならE列の数値の±2なので塗りつぶしされる。 E列の数値にB4セルの入力した数値の±をH列、K列を超える場合は 塗りつぶしは行わない、という感じです。 わかりずらい説明で申し訳ありませんが、宜しくお願いします。 Sub 判定仮() Dim i As Integer, j As Integer Range(Cells(3, "L"), Cells(32, "L")).ClearContents Range(Cells(3, "E"), Cells(32, "K")).Interior.ColorIndex = 0 For i = 3 To 32 If WorksheetFunction.CountIf(Rows(i), Cells(i, "E")) > 2 Then If Cells(i, "E").Row Mod 2 = 1 Then Union(Cells(i, "E"), Cells(i, "H"), Cells(i, "K")).Interior.ColorIndex = 6 Cells(i, "L") = "OK" Else If Cells(i, "E").Row Mod 2 = 0 Then Union(Cells(i, "E"), Cells(i, "H"), Cells(i, "K")).Interior.ColorIndex = 40 Cells(i, "L") = "OK" End If End If End If Next If WorksheetFunction.CountIf(Range("L3:L32"), "OK") > 29 Then MsgBox "データチェックOK(^O^)b" End If 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

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

専門家に質問してみよう