- ベストアンサー
エクセルVBAで表の数値の微調整
Wendy02の回答
- Wendy02
- ベストアンサー率57% (3570/6232)
merlionXX さん、こんにちは。 Wendy02です。 >高度な内容なので時間をかけて研究させていただきます。 いいえ、この内容は初歩的です。 #1 さんの案を考えたのですが、深夜で、とても気力がなかったからです。ただし、これだけの数になると、大変な時間が掛かります。Excelアドインのソルバー自体は、過去のものなので、VBAのほうがはやいです。でも、コードがとても面倒です。 >ところで、どうして±10%が限度なのでしょうか? その数字に根拠はありません。ただ、50% ならともかく、90% 増減だとしたら、何を案分しているのか意味がなくなるような気がしたからです。 これは、GTotal(手でいれた総計)と実際のSum(範囲)との差が、あまりに差がありすぎるときは、おそらくは、GTotalの入力を疑ったほうが良いということです。マクロで行うと、その結果は、不可逆ですから、一気に、マクロを走らせないほうがよい、と考えました。 私のコードの中の最大値からの修正 行で処理する場合 (後で考えてみましたが、Excelの特質で、行のほうが、縦よりも、若干、マクロが走りやすく書きやすいです。それは、マクロは、高スピードで、横に走って、次の行に行くようになっています。そういう造りになっています。それに合わせてあげたほうがよいです。) 以下を書き換えればよいと思います。 論理的には同じ考え方です。 Match関数で、最大セルを探すか、Find メソッドで最大セルを探すか、そのどちらかです。その後、最大セルの次の値に及ばせる場合は、Large関数を使えばよいわけです。 rng は、一行です。 Diff = WorksheetFunction.Sum(rng) - PostTotal i = WorksheetFunction.Match(WorksheetFunction.Max(rng), rng, 0) rng.Cells(1, i).Value = rng.Cells(1, i).Value - Diff 全体からする場合 Gtotal は、Grand Total これを、最大値から順に振り分けていきます。 =LARGE($A$1:$G$10,x) ここは、単に、Max だけでも良いと思います。Loop を使うのは、1回で終われるのか、確実性がなかったからです。 Do Until WorksheetFunction.Sum(myRng) - GTotal.Value = 0 x = x + 1 Set RMax = myRng.Find(WorksheetFunction.Large(myRng, x), LookIn:=xlValues) RMax.Value = RMax.Value - _ (WorksheetFunction.Sum(myRng.Value) - GTotal.Value) Loop とりあえず、こんな所といたします。
関連するQ&A
- EXCELでの足し算
A列に数字が入っていてB列に=A1/2という式を入れています。 それが20行まであり、B21のセルに=SUM(B1:B20)という式を入れています。 A列の数字が例えば105と言う数字がどこかにはいっているとするとB列は52.5ですが四捨五入されているのか53となっています。 B1からB20は四捨五入されていいのですが B21に足された数字もB1からB20の表示どおり四捨五入されたものを足してほしいのですが 52.5を足したようになってしまいます。 どうしたらよいでしょうか? どなたか教えてください。 Excelは2000です。
- ベストアンサー
- オフィス系ソフト
- ExcelのSUMを使用して足し算をすると違った答えになります
合計が違ってきます。 1)Excelの掛け算をした結果(四捨五入の値で表記)を表記されている数値で足し算 2)掛け算されているセルをSUMを使って足し算をする(四捨五入) 合計が違う結果となる場合があるので困っています。
- ベストアンサー
- オフィス系ソフト
- Excelで作った表で・・・
よくある「単価×数量」の表を作りました。 答えに小数点以下になるものが含まれるため、その列に セル書式で小数点以下を四捨五入して整数になるように 設定しました。それぞれの答えはそれで良かったのですが、今度はさらにそれらの合計を求めようと「SUM」を 入力したら表示された整数の合計ではなく、 それぞれのセルある小数点以下の数次を合計して四捨五入してしまいます。 (例)単価×数量=1.2 表示は1 単価×数量=1.3 表示は1 計 3 になってしまう←「2」にしたい どうしたらいいのでしょうか?教えてください。
- ベストアンサー
- Windows NT・2000
- Excel VBAでの値の比較
お世話になります。 Excel VBAでの値の比較方法についてご教授頂きたく存じます。 下記のような値がセルに入っていると仮定しまして、 セルA1とセルG1を比較する セルA2とセルG2を比較する セルB1とセルH1を比較する セルB2とセルH2を比較する 値が違う場合のみ、A列、又は、B列のセルの色を変更したいのですが・・・。 下記例の場合であれば、B1とA2がセルの色が変われば良いです。 A列 B列 G列 H列 1行 1 1 1 2 2行 2 2 3 2 VBAで実現したいと思います。 何卒、宜しくお願い申し上げます。
- ベストアンサー
- オフィス系ソフト
- どなたかエクセルにお詳しい方がいらっしゃいましたら、
どなたかエクセルにお詳しい方がいらっしゃいましたら、 教えて頂けるとうれしいです。 下記数値をそれぞれ小数点以下を四捨五入しています。(それぞれ別の数値をSUMで合計しています。) 四捨五入したものをSUMすると下記の数値になってしまい、1円ずれてしまいます。 どうしたら、四捨五入したそれぞれの数値をちゃんと計算できるように なりますでしょうか? 宜しくおねがいしますm(__)m 23,650.00 38,280.00 9,890.00 61,060.00 72,670.00 30,040.00 20,640.00 10,200.00 28,050.00 17,850.00 40,162.50 46,537.50 35,062.50 32,650.00 下記は、上記数値をSUMで合計を出した数値 466,743円 本来は、 466,743円にしたいですm(__)m
- 締切済み
- その他MS Office製品
- エクセルで最大値から調整したいが最大が複数あった場合?
すみません、助けてください。 エクセルの表計算で困っています。 A1~M1にそれぞれ数値(小数あり)がはいっており、N1に合計が入ります。 A2~M2には上の行の値を10円単位に四捨五入した値が入ります。これを合計してN2に持ってくると、四捨五入の関係でN1を10円単位に四捨五入した値にならないときがあります。 そこでN2はN1を四捨五入した値(これが最優先の値)にし、2行目(A2~M2)の合計と差が出た場合はA2~M2中の最大値から引いたり足したりして調整しています。そのため P2に=MAX(A2:M2)として最大値を求め、3行目A3~M3に最大値と同じならTrueがでるようにして、Trueのある列の2行目から差額を差し引きした額をA4~M4の4行目に表示しています。 ところが、これだと万一、最大値が2つあった場合、二重に差し引きされ、またおかしくなってしまいます。 なにかいい方法はないでしょうか?
- ベストアンサー
- オフィス系ソフト
- 範囲指定した箇所の数値を一括で四捨五入したい
EXCELのマクロで 範囲指定をしたセルの数値(数式ではなく、数字です)を一括で四捨五入(小数点第3位を四捨五入(小数点第2まで表示))した数値を置き換えるマクロを知りたいのですが、調べられずに困っています。 (roundで四捨五入して、それを値だけ貼り付ければ・・と言うことではなく、あくまでもマクロでの方法を教えてください) よろしくお願いいたします。 バージョンEXCEL2000
- ベストアンサー
- オフィス系ソフト
- エクセルで数値を四捨五入したいのですが・・・
初歩的ですいません。今E14のセルに666.66666・・・と計算の結果、数値がはいっております。この数値を自動で四捨五入させ、670と表示させたいのです。どのようにしたらいいでしょうか?教えて下さい。
- ベストアンサー
- オフィス系ソフト
お礼
ありがとうございます。 Wendy02さんには初歩的でもわたしには至って高度なのでとりあえず下記の方法で対応しました。 有難うございました。 Sub TEST01() Dim c As Range Dim base As Integer, goal As Integer Dim rtio As Double base = Range("base").Value goal = Range("base").Offset(, 1).Value rtio = goal / base For Each c In Range("DATA") c.Value = Application.WorksheetFunction.Round(c.Value * rtio, -1) Next df = goal - Range("base").Value If df <> 0 Then mx = Application.WorksheetFunction.Max(Range("DATA")) For Each c In Range("DATA") 'Range("DATA")の中で最大の値+df If c.Value = mx Then c.Value = c.Value + df Exit For End If Next End If End Sub