添付の画像のように1行10分として10分間の内訳がC~G列まであり、H列に行の合計があります。
本来なら手を加えなくても合計は600秒になるはずですが、
元データが「開始時間から何秒間」というデータの取り方をしている為
600秒以上が内訳に出てきてしまいます。(8:40のD列など)
これまでは、600以上の場合は600で区切りはみ出た分を1つ下の行に移すという作業を手作業でやっていましたが、数が増えてきたので自動化したいです。
VBA、関数何でも構いませんが自動で計算してくれる方法はないでしょうか?
VBAの場合は簡単に解説を付けていただけると大変助かります。
よろしくお願いします。
No.7
- 回答日時:
何度もすみません。
前回お書きしたように、最後の行の部分を削除してください。
If rng(1, 1).Value = 0 Then
MsgBox rng(1, 1).Address(0, 0) & " は処理できません。中止します。", vbCritical
rng(1, 1).Select
End
End If
最後の行から、5行を削除して、行かのようになれば良いです。
削除後の画面
Else
buf = rng(1, k).Value
rng(1, k).Value = 0 '先送り
rng(2, k).Value = rng(2, k).Value + buf
buf = 0
End If
End If
diff = 0
End Function
表を試してみると、辻褄が合うようになっているのでしょうか?
No.6
- 回答日時:
#4で書いたとおり、相手の考えを先回りしたマクロコードというものは、失敗していました。
画像のタイトルをみて、なんとなく意味は分かりました。
>項目を同じにしたいですが可能でしょうか?
もちろんですが、ただ、私は分かっていない点があります。
勝手な考えかと思いますが、
直感的ですが、繰り越し作業で、C列の値が0になる場合は、エラーということにしました。
最後の行は、600秒に足らない場合もあるというオプションを入れました。
これは、ある一定期間(約100件)の様子見が必要な気がします。
未だ、全体の理解しているわけではないことをおことわりしておきます。
なお、コード全体を全面的にやり直しました。
場合によっては、これは、無限ループに入る恐れがありますが、その場合は、ESCを何度か押していただければ、マクロは止まります。理由は、1箇所の修正だけで済まない可能性を考えたからです。
'//
Sub Target600sec()
''modified4
Dim x As Long, i As Long
Dim a As Long, b As Long
Dim Lastrow As Long
Lastrow = Cells(Rows.Count, 1).End(xlUp).Row
x = 2 '開始行スタート
a = 3 '開始列
b = 7 '終了列
Do
If Abs(Application.Sum(Range(Cells(x, a), Cells(x, b))) - 600) > 5 Then
get600 Range(Cells(x, a), Cells(x, b))
End If
If Abs(Application.Sum(Range(Cells(x, a), Cells(x, b))) - 600) <= 5 Then
x = x + 1
DoEvents
End If
Loop Until x = Lastrow Or Cells(x, b + 1).Value <= 0 '合計列
For i = a To b
If Cells(x, i).Value < 0 Then
Cells(x - 1, i).Value = Cells(x - 1, i).Value + Cells(x, i).Value
Cells(x, i).Value = 0
End If
Next
End Sub
Function get600(rng As Range)
Dim ttl As Double
Dim c As Variant, i As Long, k As Long
Dim diff As Double
Dim cmax As Double
Dim buf
ttl = Application.Sum(rng)
For i = 1 To rng.Columns.Count
If cmax < rng(1, i).Value Then
cmax = rng(1, i).Value '最大値を見つける
k = i
End If
Next
If Abs(ttl - 600) > 5 Then
diff = ttl - 600
If cmax - diff > 0 Then
rng(1, k).Value = rng(1, k).Value - diff
rng(2, k).Value = rng(2, k).Value + diff
Else
buf = rng(1, k).Value
rng(1, k).Value = 0 '先送り
rng(2, k).Value = rng(2, k).Value + buf
buf = 0
End If
End If
diff = 0
If rng(1, 1).Value = 0 Then
MsgBox rng(1, 1).Address(0, 0) & " は処理できません。中止します。", vbCritical
rng(1, 1).Select
End
End If
End Function
エラーがうっとうしければ、以下のように、コメントブロックでもつけてください。
削除も可能です。
'//
' If rng(1, 1).Value = 0 Then
' MsgBox rng(1, 1).Address(0, 0) & " は処理できません。中止します。", vbCritical
' rng(1, 1).Select
' End
' End If
No.5
- 回答日時:
>赤字セルが下に繰り越されることになりますがこちらも対応していますでしょうか?
それは範囲を広げればよいことですが、
10:40 603 0 0 0
↓
10:40 600 0 0 0
の部分は、こちらが意図したことではなかったのですが、数値が変更されてしまいました。
つまり、以下のマクロは、合計欄は別ですが、数値の多いところから引くという原則で成り立っています。
ある程度、想定の範囲もあるのですが、未だにしっくりしないところもあり、様々なデータを当たってみないと、まだ、見えていない部分があります。
'//標準モジュール
Sub Target600sec()
''modified1
Dim i As Long, j As Long, k As Long
Dim cmax As Long
Dim diff As Long
Const RATIO As Double = 1.005 '誤差±0.5%
For i = 2 To Cells(Rows.Count, 8).End(xlUp).Row
If Cells(i, 8).Value > Int(600 * RATIO) Or _
Cells(i, 8).Value < Int(600 / RATIO) Then
diff = Cells(i, 8).Value - 600
End If
'D列以外にも範囲を広げる
cmax = Application.Max(Cells(i, 3).Resize(, 5))
j = Application.Match(cmax, Cells(i, 3).Resize(, 5), 0) + 2
If k = 0 Then k = j
If diff > 0 Then
Cells(i, j).Value = Cells(i, j).Value - diff
Cells(i + 1, k).Value = Cells(i + 1, k).Value + diff
ElseIf diff < 0 Then
'補完(符合が逆になる)
If Cells(i - 1, 8).Value > 600 Then
Cells(i - 1, j).Value = Cells(i - 1, j).Value + diff
Cells(i, j).Value = Cells(i, j).Value - diff
End If
End If
k = j
diff = 0
Next
End Sub
No.4
- 回答日時:
こんにちは。
>600付近(感覚ですが±5)
というと、0.8% なりますが、今は、誤差の範囲は0.5%ぐらいにしてみました。
ただ、今までの私のジンクスですと、相手の考えを先回りしたマクロコードというものは、だいたい失敗していることが多いのです。それは、誤差の範囲をクリアしているのなら、それを戻る必要がないのに、次行で不足していて、両方とも誤差の範囲なら、前の行から少し秒をいただくという補完をしているのが想像出来てしまったからです。
例:
605
594
↓
600
599
となることです。懸念材料として、600平均で埋まらない所も出てくるような気がしました。
せっかく、#1,2 の方も回答しているので、どんな回答になるか、待ってみても損はないと思います。
'//標準モジュール
Sub Target600sec()
Dim i As Long
Dim diff As Long
Const RATIO As Double = 1.005 '誤差±0.5%
For i = 2 To Cells(Rows.Count, 8).End(xlUp).Row
If Cells(i, 8).Value > Int(600 * RATIO) Or _
Cells(i, 8).Value < Int(600 / RATIO) Then
diff = Cells(i, 8).Value - 600
End If
If diff > 0 Then
Cells(i, 4).Value = Cells(i, 4).Value - diff
Cells(i + 1, 4).Value = Cells(i + 1, 4).Value + diff
ElseIf diff < 0 Then
'補完(符合が逆になる)
If Cells(i - 1, 8).Value > 600 Then
Cells(i - 1, 4).Value = Cells(i - 1, 4).Value + diff
Cells(i, 4).Value = Cells(i, 4).Value - diff
End If
End If
diff = 0
Next
End Sub
'結果は以下のとおりです。
No.3
- 回答日時:
本来の表のあり方を書いてくれたらよく分かったけれども、言葉だけの説明ですと、よくわかりませんね。
D列(B)だけで処理するとは思えませんが、文章からですと、画像のようになることを想像してしまいました。実際、#2さんの表では、私のやり方ではうまくいかなくなります。8:40| 284, 799 ....1083 (483 余り)
8:50| 101, 21 .......122
↓
8:40| 284, 316 .....600
8:50| 101, 504 .......605 (5余り)
と順繰りにトータル600にしていくことかと思いました。
多い場合は、B列で調整し、足りない場合は、G列で調整しています。
したがって、画像では以下のようになると思いました。(マクロで作られた表です)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) エクセル・スプレッドシートで、一定数を超えたらゼロから再累計する方法 8 2022/05/28 03:52
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
- Visual Basic(VBA) 列の最終行までのセルと1つ隣のセルの合計を別の列に表示 2 2022/07/12 19:50
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Excel(エクセル) Excel 2019で質問があります。 計測器のデータをExcelで記録したんですが、1秒刻みで記録 4 2022/09/07 22:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
VBA 指定した列にある日時デー...
-
VLOOKUPの列番号の最大は?
-
LEFT関数とIF関数の組み合わせ...
-
エクセルでセル12個間隔で合...
-
エクセルマクロでオートフィル...
-
Alt+Shift+↑を一括で行うには、...
-
エクセル 1つのシートを日付で...
-
データシートビューのタイトル...
-
Excelの降順のについて
-
エクセルの列をたたむ操作
-
Excelの行数、列数を増やしたい...
-
Excel 区切り位置指定ウィザー...
-
エクセルで最初の行や列を開け...
-
Excelの計算式で質問です。
-
VBAで結合セルを転記する法を教...
-
2列同じ値がある場合その行を統...
-
こんな情報を主キーとして設定...
-
エクセル マクロ 範囲の値を上...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
「段」と「行」の違いがよくわ...
-
LEFT関数とIF関数の組み合わせ...
-
VBA 指定した列にある日時デー...
-
CSVファイルの「0落ち」にVBA
-
エクセルで住所を県と市・郡と...
-
Excelの行数、列数を増やしたい...
-
エクセルで複数列の検索をマク...
-
エクセルマクロの組み方
-
Alt+Shift+↑を一括で行うには、...
-
えABのある列って
-
エクセルのソートで、数字より...
-
エクセル マクロ 範囲指定で...
-
VBAで結合セルを転記する法を教...
-
VBAで別ブックの列を検索し、該...
-
エクセルマクロPrivate Subを複...
-
列方向、行方向の定義
-
リストからデータを紐付けしたい
-
Accessのレポートで繰り返し表...
おすすめ情報
No.1さんに返信した内容は間違いです、すみません。
WindFallerさんのおっしゃる通りです。実際に手作業では添付のようにしています。
作業前から600付近(感覚ですが±5)のものは手を加えていませんが、下に繰り越していただいても構いません。
ですが、足りない分を足すのはあまりよろしくないです。作業前と作業後の合計が同じになるといいです。
ありがとうございます。
誤差の話は「手作業では修正しない」というだけですので、
マクロ等で児童になった場合はなくても良いです。
また、添付のような場合もあります。赤字セルが下に繰り越されることになりますが
こちらも対応していますでしょうか?
ありがとうございます。
すいませんがもう一点だけ。
添付いただいた画像ですと10:20でF列(項目D)ではみ出した分が
10:30のD列(項目B)に移されていますが、繰り下げる際は
添付の画像のように項目を同じにしたいですが可能でしょうか?
何度もすみません、ありがとうございます。
Cが0のときはエラーになるとありますが、添付の場合
メッセージでC27がエラーと出ましたがなぜでしょうか?
また、Cは0の場合もありますので
申し訳ありませんがエラーとなる設定は外していただきたいです。
よろしくお願いいたします。
返信遅れてすみません、エラーの件は解決しました!ありがとうございます。
何度もすみません、添付の赤字部分ようになってしまうのはなぜでしょうか?
ご回答よろしくお願いします。