『希望の数値に自動で振分したいです』(悩女)
10万 4万 6万
A B C
上記のような形で、A列に入っている合計数値をB列・C列の希望の合計に均等にうまく振分たい。
< 使用 Excel:unknown、使用 OS:surface >
(悩男) 2025/03/12(水) 17:07:10
(悩男) 2025/03/12(水) 17:13:54
問題点はこれくらい?
(くろまめ危機一髪) 2025/03/12(水) 17:47:48
< 使用 Excel:unknown、使用 OS:surface >を理解していないんじゃないの。
(?) 2025/03/12(水) 19:48:57
ソルバーを使うとできるかもしれません。条件によります。
(Q1)A列の数値の個数は最大で何個くらいですか? (Q2)分離したいグループの個数は2グループでいいんですか? (Q3)典型的なサンプルを省略なしで提示できますか? A列のすべてのデータと、B列、C列の合計数値です。
(xyz) 2025/03/13(木) 08:02:38
(Copilot) 2025/03/13(木) 10:04:20
具体的な目的としては、下記例として合計153,220枚の配布枚数を設定していて(これは上から効率のよい市区群順にしている)2日間に分けて配布したいのですがそれぞれの日に設定枚数があります。(B列・C列)
設定枚数に対して上から均等に振分をしたいです。
(B列を上から・C列を下からとかにするとC列だけ実績が悪くなってしまうため)
現状は下記の場合はB列が50,000枚、C列103,220枚でほぼ2倍の枚数になるので
A列を=B1、=C2・C3 のように=で引っ張って下までオートフィルして大体の枚数を入れてから手作業で希望枚数になるようB列・C列を調整しています。
均等に振分れたらいいので、絶対に上からBCC・BCC・BCCという順番ではなくていいです。
※だいたい200〜600行くらいあります。(全都道府県をシート別にしている)
A列 B列 C列
153,220 2025/4/1 2025/4/2
設定部数 50,000 103,220
1340 1340
900 900
880 880
480 480
460 460
410 410
340 340
200 200
200 200
150 150
130 130
1320 1320
1130 1130
820 820
710 710
590 590
550 550
300 300
230 230
200 200
100 100
100 100
80 80
60 60
50 50
2100 2100
1550 1550
1390 1390
手作業でとても時間がかかっているので何か解決策があればご教示いただきたいです。
(悩女) 2025/03/13(木) 10:44:29
(えいかん) 2025/03/13(木) 11:43:12
B列を上から、C列を下からのような振分方法になれなければ何でも大丈夫です。
(ある程度レスポンスの良い悪いが均等に入ればいいです)
(悩女) 2025/03/13(木) 12:05:48
B2=A2 B3=IF(SUM($B$2:B2)/$B$1<SUM($C$2:C2/$C$1),A3,"") 下にフィル C3=IF(B3="",A3,"") 下にフィル
設定枚数に対する合計の割合が小さい方に割り振るようにしてますが
機械的に振ってるだけなのでぴったり50000ぴったり103220にはなりません
そこは適当に調整してください
(傘) 2025/03/13(木) 13:58:37
割合に応じて機械的に割り振るというのをマクロ化したコード例
Sub Test() Dim ratio As Double ratio = Range("C2") / Range("B2")
Dim i As Long, Sum2 As Long, Sum3 As Long Cells(3, 2) = Cells(3, 1) Sum2 = Cells(3, 1) For i = 4 To Cells(Rows.Count, "A").End(xlUp).Row If (Sum3 / Sum2) > ratio Then Cells(i, 2) = Cells(i, 1) Sum2 = Sum2 + Cells(i, 1) Else Cells(i, 3) = Cells(i, 1) Sum3 = Sum3 + Cells(i, 1) End If Next End Sub
(hatena) 2025/03/13(木) 14:35:47
回答コメントを頂いておりながら返答が遅れてしまいました。失礼しました。 ソルバーで使用できる変数の数は200が上限ですので、Excelのソルバーでは対応できません。 既に適切な回答がされています。 (xyz) 2025/03/13(木) 18:58:00
> この作業を全シートで繰り返したいのですが、 > そのマクロコードも教えて頂けますでしょうか。
以下でどうでしょう。
Public Sub Sample() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Add3days ws Next End Sub
Sub Add3days(ws As Worksheet) Dim ratio As Double ratio = ws.Range("C2") / ws.Range("B2") Dim i As Long, Sum2 As Long, Sum3 As Long ws.Cells(3, 2) = ws.Cells(3, 1) Sum2 = ws.Cells(3, 1) For i = 4 To ws.Cells(Rows.Count, "A").End(xlUp).Row If (Sum3 / Sum2) > ratio Then ws.Cells(i, 2) = ws.Cells(i, 1) Sum2 = Sum2 + ws.Cells(i, 1) Else ws.Cells(i, 3) = ws.Cells(i, 1) Sum3 = Sum3 + ws.Cells(i, 1) End If Next End Sub
(hatena) 2025/03/14(金) 08:45:00
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.