• ベストアンサー

ドント方式をExcel関数にすると・・・

各店舗の人員構成比が下記のようになっているとします(%)↓ A店:56.9 B店:12.5 C店:30.6 これを人数として出したいので、下記のように小数点以下を調整する作業をExcelの関数でできないでしょうか? A店:57 B店:12 C店:31 四捨五入をすると、全体が100を超えてしまいます。 比例代表制の選挙配分として使われている「ドント方式」になると思うのですが、 これをExcelの関数で出すことができればご教授ください。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

'愚直にドント方式百分率配分をどーんとプログラムしてみました Public Sub どーんと実行() 'dont(入力データ範囲,出力データ範囲) Call donto(Range("A1:C1"), Range("A2:C2")) End Sub '入力データは100分率 'dont(入力データ範囲,出力データ範囲) Public Sub donto(s As Range, d As Range) Dim data() As Double, count() As Integer, dataKind As Integer Dim i As Integer, j As Integer, x As Range, maxV As Double, maxI As Integer, sum As Integer dataKind = s.count 'データの分類数 ReDim data(100, dataKind) ReDim count(dataKind) i = 0 For Each x In s i = i + 1 count(i) = 0 data(0, i) = x.Value Next For i = 1 To 100 For j = 1 To dataKind data(i, j) = data(0, j) / i 'ドント表の作成 Next Next Do While True maxV = 0# For j = 1 To dataKind '最大値を求める If data(count(j) + 1, j) > maxV Then '0%のデータは無い maxV = data(count(j) + 1, j) maxI = j End If Next count(maxI) = count(maxI) + 1 '最大値の件数を1増やす sum = 0 For j = 1 To dataKind '合計を求める sum = sum + count(j) Next If sum = 100 Then Exit Do Loop '出力に設定 i = 0 For Each x In d i = i + 1 x.Value = count(i) Next End Sub

dra96
質問者

お礼

ありがとうございます! 試す時間を少しください。

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

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 試しにちょっと考えてみました。 これは、最大値から割り振る方式にしています。一般的なものならうまくいくはずです。(注意すべき点:コードの下のサンプルをご覧ください。) '<シートモジュール> 'コントロールツールバーから、コマンドボタンをクリックして、ワークシートに書いたら、右クリックで、[コードの表示]をクリックして、以下を貼り付けます。 '--------------------------------------- Option Explicit Private Sub CommandButton1_Click()   '上位から差分を加算または、減算する方式   Dim rng As Range   Dim Destine As Range '出力先   Dim Ar() As Double   Dim RangeTotal As Double   Dim PercentTotal As Double   Dim LargeCount As Integer   Dim ret As Integer   Dim buf As Double   Dim c As Range   Dim i As Long   Dim j As Long   '以下の精度(ACCURACY)は、1 か、0.1 を入れます。   Const ACCURACY As Double = 1   If Not (ACCURACY = 1 Or ACCURACY = 0.1) Then MsgBox "このプログラムでは、精度(ACCURACY)は、1 か、0.1 のみです。": Exit Sub   'マウスで範囲を選択します。   On Error Resume Next   Set rng = Application.InputBox("範囲を選択してください。", Type:=8)   If rng Is Nothing Then Exit Sub   Set Destine = Application.InputBox("出力先を指定してください。" & vbCrLf & _   "先頭の一番上にセルだけでよいです。", Type:=8)   On Error GoTo 0   If Err() > 0 Then Exit Sub   '   RangeTotal = WorksheetFunction.Sum(rng)   ReDim Ar(0 To rng.Count - 1)   For Each c In rng    If VarType(c) = vbDouble Then      Ar(i) = Int((c.Value / RangeTotal) * 100 * (1 / ACCURACY) + 0.5) / (1 / ACCURACY)      i = i + 1    End If   Next c   PercentTotal = WorksheetFunction.Sum(Ar())   If 100 - PercentTotal <> 0 Then    LargeCount = (100 - PercentTotal) / ACCURACY    If Int(LargeCount) > rng.Count Then MsgBox "このプログラムでは修正不可能です。", 16: Exit Sub    For j = 1 To Abs(Int(LargeCount))      buf = WorksheetFunction.Large(Ar, j)      ret = WorksheetFunction.Match(buf, Ar(), 0)      Ar(ret - 1) = buf + Sgn(LargeCount) * ACCURACY    Next j   End If   PercentTotal = WorksheetFunction.Sum(Ar())   If CInt(PercentTotal * (1 / ACCURACY)) <> 100 * (1 / ACCURACY) Then MsgBox "修正に失敗しました。", 16: Exit Sub   '合計式の代入   With rng    If .Rows.Count > .Columns.Count Then      Destine.Cells(1, 1).Resize(.Rows.Count, .Columns.Count).Value = _      WorksheetFunction.Transpose(Ar())      Destine.Offset(.Rows.Count).FormulaLocal = "=SUM(" & Destine.Cells(1, 1).Resize(.Rows.Count, .Columns.Count).Address & ")"      Else      Destine.Cells(1, 1).Resize(.Rows.Count, .Columns.Count).Value = Ar()      Destine.Offset(, .Columns.Count).FormulaLocal = "=SUM(" & Destine.Cells(1, 1).Resize(.Rows.Count, .Columns.Count).Address & ")"    End If   End With   If WorksheetFunction.Max(Ar()) < 10 And ACCURACY = 1 Then    MsgBox "この出力は精度(ACCURACY)がふさわしくないかもしれません。" & vbCrLf & _    "VBEを開けて、ACCURACY を0.1 にすると良いかもしれません。", 32   End If End Sub '===================================== 精度が0.1が必要な場合。    精度1     精度0.1 265   6 '←矛盾 7.9 220   7      6.5 174   5      5.1 31    1      0.9 202   6      6 252   7      7.4 184   5      5.4 167   5      4.9 187   6      5.5 23    1      0.7 207   6      6.1 39    1      1.2 130   4      3.8 175   5      5.2 285   8      8.5 63    2      1.9 229   7      6.8 64    2      1.9 123   4      3.6 226   7      6.7 24    1      0.7 17    1      0.5 96    3      2.8 ------- ----    ----- 3338  100     100 また、このようなデータ数ですと、精度を0.1にしないと矛盾が起きてしまいます。 なお、表示は、1桁と0.1 の小数点第一位までです。必要な場合は、コードの中のACCURACY(精度)の数字を0.1に変更してください。また、エラー値を含むと、現在のコードでは正しく修正されません。

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

No2です。 > 各店の人員数は分かります。 ええっ!? > これを人数として出したいので とお書きになっていましたよね? では、何を求めればいいのでしょう? ひょっとして構成比を整数で出したいということですか? それなら =ROUND(各店の人数/全体の人数*100,0)です。 合計が100にならない場合は最大の構成比の店で調整します。

dra96
質問者

お礼

>合計が100にならない場合は最大の構成比の店で調整します。 この調整部分をドント方式に法り算出できないかと思い、質問しました。 “ドント方式”ってところに意味があり、四捨五入では意味がないのです。 説明不足で済みません。

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

こんにちは。 私は、社内の統計資料なら問題ないので、手を加えていましたね。「偽造」ではありませんが、+1/-1 とかしていましたね。自動化するというのは、できる出来ないは別として、私の仕事感覚で出来ませんでした。それは、万が一に、その計算を追及されたときに、実は、こういうようなことをしたのだと、1年後にみても、自分で説明つくようにしていました。

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

関数では、他の関数の結果による配分というのができないように思います。 やるとしたらマクロになると思います。

dra96
質問者

お礼

ご回答ありがとうございます。 マクロの方法をご教授いただけますでしょうか。

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

各店の人員数がわかって初めて構成比が出せるのだと思いますが・・・・。 まあ、何らかの事情で%から人数の近似値を求めなくてはならないわけですね? こうしたらいかがでしょう? =ROUND(人員総数×構成比/100,0) で、四捨五入のため各店を合計したら、人員総数と一致しない場合がありますので、その場合は一番大きい店で調整します。

dra96
質問者

お礼

>まあ、何らかの事情で%から人数の近似値を求めなくてはならないわけですね? 構成比で説明した方が、分かり易いかと思っただけで、各店の人員数は分かります。 説明が至らず済みません。

全文を見る
すると、全ての回答が全文表示されます。
noname#123709
noname#123709
回答No.1

書かれている内容はドント方式の話ではないような気がしますが・・・。 ドント方式は公平に・・・ですよね。 質問者様が書かれている例で言えば、割合を出す時に各店の人数が先に分か っているはずなんですけど。 ドント方式をExcel関数に・・の回答でなくて申し訳ないですが・・・。

dra96
質問者

お礼

>質問者様が書かれている例で言えば、割合を出す時に各店の人数が先に分か >っているはずなんですけど。 説明不足で済みません! 人数は分かってます!!人数からの計算になるのでしょうか?

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

関連するQ&A

  • エクセル関数

    エクセル関数を教えて下さい。 A×B=Cの計算でCが小数点以下の端数が出る場合、 答えのCを小数点以下を四捨五入して整数にする関数を教えて下さい。 CをROUND関数でDという整数に置き換えるのは分かりますが、乗算の答えCを同じセルで整数にしたいです。よろしくお願いします。

  • エクセルの関数

    以下のようなことをエクセルでやりたいのですが 何か関数はありませんか? 例:A×B=答え 上記の答えの 正数が二桁のとき、小数点第二位を四捨五入 正数が三桁のとき、少数点第一位を四捨五入 どなたか教えてください。お願いします。

  • round関数について

    試しにエクセルで次の計算をしてみてください。 -16.76 7.9 -11.45 -8.88 -1 4.26 33.78 以上を全部足します。つまり「=sum(a1:a7)」です。当然「7.85」になります。 次に四捨五入します。round関数で小数点第2位を四捨五入して、第1位まで表示させます。つまり、「=round(sum(a1:a7),1)」ということです。すると「7.8」を返しました。 ん?「7.9」なのでは?と思い、次にこんな計算をしてみました。 A・・・=round(sum(a1:a7),2) B・・・=round(A,1) つまり、Aでいったん小数点第3位を四捨五入させた上で、その値を今度はBで小数点第2位を四捨五入させ、最終的に小数点第1位まで表示させたわけです。すると、ちゃんと「7.9」を返しました。 なんでこんな風になるのでしょうか?どうして一発で「7.9」にならないのでしょうか?

  • 関数教えてください

    エクセルの関数教えてください。 割り算をして出た答えの小数点第3位を四捨五入 例:セルAとセルBでお願いします。

  • 比例区のドント方式の利点について

    衆議院選挙の比例区はドント方式が採られていますが、 なぜ、この方法が選ばれているのでしょうか。 仮に、7議席を争う選挙区で、以下のような結果となった場合、       政党 A   政党 B  政党 C  政党 D  政党 E 得票数  340,000  280,000  160,000  60,000  15,000 得票率  39.7%    32.7%    18.7%    7.0%   1.7% ドント方式では、A*3議席、B*3議席、C*1議席となるようですが(wikipedia「ドント方式」より)、 7(議席数)に得票率を掛けた値(Aから順に2.78、2.30、1.31、0.49、0.12)を利用し、 整数部を議席数に、残りの議席は小数部の大きい政党から順に分配という方法 (A*3議席、B*2議席、C*1議席、D*1議席となる) でもいいような気がします。 ドント方式はどういった点が優れているのでしょうか? 私が例示した方法はどの点が劣っているのでしょうか? また、もっと良いと思う配分方法があれば教えて下さい。 (私の例はあくまでも一例なので、私の例の欠陥を指摘いただくよりも、 他の方法ではなく、なぜドント式がさいようされているのかをメインに、解説頂けるとありがたいです) .

  • エクセルの関数。お願いします!

    任意の桁数で四捨五入するROUND関数についてお願いします。 A1「5678.492」の数値。 (ア)小数点以下を四捨五入しなさい。 (イ)1の位を四捨五入しなさい。 =ROUND(A1,○)の○には何が入るんでしょうか?

  • Excelの関数、四捨五入について

    ご質問があります。 現在Excelで表を作っているのですが、どうしても四捨五入で躓きます。 例) A 1234.56 →四捨五入(ROUND.1) →B 1235 上記のようになるのですが 例) B 1235×0.9 → 1111.1(小数点第一表示) 上記のようになってしまいます。 四捨五入したBのセルに対し0.9をかけているはずなのに 四捨五入を行う前のAに0.9をかけた答えが出てしまうのです。 これの謎が解けず困っています。 どなたかお分かりの方がいましたら宜しくお願い致します。

  • エクセルの関数を複数使いたい

    こんにちは、教えてください エクセルの関数を同時に複数使いたいときはどうしたらよいのでしょうか? 具体的には A1とA2を掛けて1000で割りたものをC1に表示させたいのです。 ただし、 (1)計算をしていないときにはC1に何も表示させたくない。 (2)小数点以下2桁で四捨五入したいのです。 (3)計算式をいったん別のところに表示させず、直接C1にだしたい。 以上の条件をかなえたいのですが、掛け算・割り算の式や、表示の条件を変えるのにIFを使用したり、四捨五入をするのはROUNDを使うのは発想できたのですが、組み合わせ方が分かりません。(表示形式で設定してしまうと、0.20などの際に0.2とはならないので・・・関数を使いたいのです) よろしくお願いします

  • エクセル 関数を教えてください。

    エクセル 関数を教えてください。 数点第一位の値が5のときだけ小数点第二位の値で切り上げか切り捨てかを判断します。 小数点第二位が0のときは切り捨て、1以上のときは切り上げ計算になります。 (例)4.50点→4点 、 4.51点→5点 小数点第一位が5以外の場合は四捨五入と同じ要領です。 ●A1に数字入力、B1に計算式をお願いします。

  • エクセル関数?教えてください。これはどうすればできますか?未熟者です

    A列÷B列の答えの数値を削除と四捨五入し、プラス表示とマイナス表示をしたい。 答えは2パターンになります。 (1)A列÷B列の答え1.091763・・・などとなります。それを小数点一位以上(1.9)を削除し小数点五位(6)を四捨五入して数値で表したいのです。 そして出た答え、小数点以上が(1.)の場合プラス表示とし918で完成させたい。 (2)A列÷B列の答え0.991763・・・などとなります。それを小数点一位以上(0.9)を削除し小数点五位(6)を四捨五入して数値で表したいのです。 そして出た答え、小数点以下(0.)の場合はマイナス表示としと-918で完成です。 うまく説明できませんが、よろしくお願いします。

このQ&Aのポイント
  • 論文の書き方について困っている方へのアドバイス
  • 後輩の仕事レベルを引き上げるために工夫していることとは?
  • 論文の書き方に関する構成の例とは?
回答を見る

専門家に質問してみよう