アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルでのくじ引きのやり方は理解しました!
やりたいことは、一人一人の抽選の口数が様々で、それを一つ一つ打ち込まなくても関数で縦に並べられないかということです。
例)田中 3口       田中
  鈴木 2口       田中
              田中
              鈴木
              鈴木←この状態にしたいです。
どなたか知恵を貸していただけないでしょうか。宜しくお願い致します。

A 回答 (3件)

こんにちは!



横からお邪魔します。

>関数で縦に・・・
とありますのでお望みの方法ではないと思いますが、
VBA向きの質問なので、VBAでの一例です。

操作したいシート見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() '//この行から//
 Dim i As Long, cnt As Long, lastRow As Long
  lastRow = Cells(Rows.Count, "D").End(xlUp).Row
   If lastRow > 1 Then
    Range(Cells(2, "D"), Cells(lastRow, "D")).ClearContents
   End If
   For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    If Cells(i, "B") > 0 Then
     Do Until cnt = Cells(i, "B")
      cnt = cnt + 1
       Cells(Rows.Count, "D").End(xlUp).Offset(1) = Cells(i, "A")
     Loop
    End If
     cnt = 0
   Next i
End Sub '//この行まで//

※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。

※ あくまで↓の画像のような配置でのコードなので
配置が異なればコードも変わってきます。m(_ _)m
「エクセル くじ引きの口数が別々の場合」の回答画像3
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
すみません…VBAという言葉を初めて聞いたほどのPC素人の為とても扱うことができませんでした…( ;∀;)
見出しで右クリックの時点でコードの表示という項目が見つけられず、VBA画面もマクロの実行もさっぱりわかっておりませんm(__)m
ただ、いろいろやっていく中で「これは関数でやる作業ではないな」と思いながら模索していて、VBAというものがあるということが知れてよかったです。
いまはさっぱりですが理解できるよう努力しますm(__)m

お礼日時:2019/07/12 17:56

こんにちは



考え方のヒントを・・・
と言っても、考え方は既にNo1様がご説明なさっているので、それを順次具体化してみました。

添付図のA、B列はご質問文の内容。(B列は数値にしてあります)
D→G列の順に、計算をしながら最終の答え至るプロセスとなっています。
いずれの列も、1行目に式を入れ、下方に(添付図では12行目まで)フィルコピーする形としています。

◇D列
C列の累計を計算しています。普通なら5行目以降が 9,9,9,9…となるところですが、データの終了がわかるように、敢えて0となるように計算しています。

◇E列
D列の値から、自分自身の行番号よりも大きな値のうち最小のものを探します。表示しているのはその行番号。
例えば、E6セルの値を例にすると、自分の行番号は6になります。D列を上から順に見てゆくと、3、5は6より小さいのでスルー。8が6より大きいのでこの行番号(=3)を計算しています。

少々複雑な計算なので、もう少し分解したいところですが、途中を求めても、結局どこかで同じくらいの計算になっていまうので、ここまでまとめてしまいました。

◇F列
A列から、E列で求めた行番号に相当するセル位置の値を求め、表示します。

◇G列
対象範囲外(10行目以降)がE列でエラーになるように計算しているので、エラーの場合は結果を表示しない(空白表示)するように処理を加えます。

多分、このG列がお求めになりたい結果ではないかと思います。


ここまでできれば、上記の計算を組み合わせることで、途中計算の表示を省略することが可能になります。
とはいえ、組み合わせた結果出来上がる関数式は、長く複雑なものになりがちで、メンテナンス性は悪くなります。
無理に全部をまとめなくとも、適当な分解の仕方をして、作業列などに収めておくほうが実際的ではないかと思います。
こうすることによって、メンテナンス性が良くなるだけでなく、計算速度の向上にもつながることがあります。
「エクセル くじ引きの口数が別々の場合」の回答画像2
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
すごく分かりやすく具体化していただいたおかげで理解することはできました!
ただ根本的に自分のエクセルの知識がなくE列の計算をセルに入力?するのかが分かっておらず(入力というところ自体違うかも?)色々模索しているところです・・・。
なんにせよやり方があるということだけでも前に進めたので引き続き検討してみます!

お礼日時:2019/07/12 17:45

できますよ。


でも、そのままじゃやり難い。
まずは応募数のセルは「数値」として、セルの書式設定で「口」を付けるようにしましょう。
でないと「文字列」で書かれた ”3口” から「3」という「数値」を抽出する手順が追加されてしまい煩雑になります。

そこまですれば、上から応募数を足して、表示させたい行数との関係を確認して応募者の名前を表示させるようにすれば良い。
 ・1行目は問答無用で一番上の人
 ・2行目は応募数を足して「2」以上で最も小さい数の口数合計の人の名前。
 ・3行目は応募数を足して「3」以上で最も小さい数の口数合計の人の名前。
 ・4行目は応募数を足して「4」以上で最も小さい数の口数合計の人の名前。
 ・・・
のように処理を行う。

さらに簡単にするならば、口数が書かれた横に作業列を設け、上から順番に口数を足した数を表示させておくと良いでしょう。
例えば、
 田中 3口 3
 鈴木 2口 5
 佐藤 4口 9
こんな感じ。

こうすれば、展開して表示したい4行目は「4」以上の数で最も小さい数である「5」がある「佐藤」が該当すると分かる。       

あとはこれを数式にするだけ。

・・・
と、まあ、ざっくり説明しましたが、このような考え方で実現することが可能です。
あとは、この説明の中で分からないところを「補足」していただければ詳しく説明します。

ただし数式を書いての説明になりますが、出来上がった数式は示しません。
自力で数式を作ることができるようにアドバイスをします。
「考え方」と「使用する関数に関する注意点」を示しますので、
実際に自身で数式を作ってみてください。

・・・
ちなみに、こういった考え方を「アルゴリズム」と言います。
難しいと感じるかもしれませんが、
紙に書かれた表から手作業で書き写すときの手順を一つずつ再現してるだけなんです。
手作業で出来るならExcelでも出来るということになります。


・・・余談・・・
「代わりに付くってください」という【作業依頼】は【Q&A】ではありません。
ここは疑問を解決する場所です。
実際の数式を示す回答が付くこともありますが、
それはその回答を参考にして質問者さん自身も考えてくださいという意味が込められています。

もしも「考えるの面倒だから質問してるんだ。理屈なんてどうでもいいからテンプレートとして使える数式を出せ」ということであれば、
ここは使わないようにすることを勧めます。
それは目の前にある「問題」の解決になるかもしれませんが、「疑問」の先送りにしかならず「根本的な解決」ではないからです。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
口数が書かれた横に作業列を設け、上から順番に口数を足した数を表示させておくところまでは理解できました。ものすごく作れそうな気がしてきたのですが、そこからその数字の数だけ列に表示する関数の見つけ方?考え方がいまいち分からず止まってしまっております・・・。
丸投げに感じさせていたらすみません。もしよろしければもう少し補足していただけると幸いです。

お礼日時:2019/07/11 07:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!