2

私は、AS/400 で動作する古いプログラムを翻訳する必要があります。このプログラムは、ランダムに学生を選んで自分の街で働いていました。機能する限り、どのプログラムでも使用できます。簡単かつ迅速にするために、私はExcelを選びました。

しかし、私は小さな問題に遭遇します。同じ学生が 1 つの夏に 2 つの仕事をすることはできないため、重複を避ける必要があります。また、毎年、新しい学生が追加され、一部が削除されるため、これを柔軟にする必要があります。

この関数は、私が望むのとほぼ同じように機能します: =INDEX($A:$A,RANDBETWEEN(1,COUNTA($A:$A)),1)

インデックス $A:$A は、列 A のすべての行を取得します。したがって、20 個の名前を追加しても、それらが考慮されます。次に、行 1 と列 $A の合計行数 (COUNTA) の間の値 (名前) をランダムに選択します。この方法の問題点は、重複が許されることです。

私が見つけた別の関数は、=ALEA() でいっぱいの列を作成し、これらを数値でランク付けすることでした。これはあまりきれいではありませんが、少なくとも重複はありません。問題は、静的であり、柔軟にすることができない私の式から来ています。

=INDEX($A$2:$A$74,RANK(B2,$B$2:$B$74))

私の名前は列 $A にあり、私のランダムな値は列 $B にあります。私が言っているのは、列BにあるB2(次にB3、次にB4など)の値をランク付けすることです.

私が望むのは、COUNTA を 2 番目の関数に統合し、(可能であれば) ランク関数の代わりに RANDBETWEEN を使用して、醜い数値を持たないようにすることです。

ある種の重複チェックで最初の関数を使用するために開かれています。秘書が多くの操作を行う必要がない限り、それで問題ありません。

ご協力ありがとうございます xox

4

2 に答える 2

1

私はあなたが望むと思うものをVBAで作成しました。私は VBA に非常に慣れていないので、おそらく最も美しいものではないことに注意してください。明確にするために、列 A に行 1 から 10 までの 10 個の名前があり、このサブルーチンを実行するだけで、列 F に一意の名前のリストが生成されました。これが私のコードです。

Sub getRandom()
    Do While Application.WorksheetFunction.CountA(Range("A:A")) > 0
        Dim count As Integer
        count = Application.WorksheetFunction.CountA(Range("A:A"))
        Dim name As String
        name = Application.WorksheetFunction.Index(Range("A:A"), Application.WorksheetFunction.RandBetween(1, count))
        Dim row As Integer
        row = Application.WorksheetFunction.Match(name, Range("A:A"), 0)
        Range("F11").Select
        Selection = name
        Rows(row).EntireRow.Delete
    Loop
End Sub

一度に 1 つずつ名前を取得したい場合は、ループを削除してください。INDEX および RANDBETWEEN 関数で行ったのとまったく同じように動作し、その生成された番号で列 A の名前を取得し、その行を完全に削除するため、一意の名前は生成されません。

行が削除されてもそのセルは影響を受けないため、列 F を任意に選択し、特にセル F11 を選択しました。

これがお役に立てば幸いです。探していたものではない場合は、少し強化できるかどうかを確認します.

于 2012-07-18T21:00:46.927 に答える
0

VBA (google Excel Random Unique) でこれを行うための多くの例があります。最高の例の 1 つはCPearson.Comのもので、次のものが含まれています。

ワークシート セルの範囲からの
ランダムな要素 ワークシート セルの範囲から重複せずに多数の要素をランダムな順序で返す関数を作成することもできます。以下の関数はまさにこれを行います。
=RandsFromRange(A1:A10,5)のような数式で配列数式として呼び出すことができます
。ここで、A1:A10 は値を取得する要素のリストであり、5 は返す値の数です。指定した数のセルを含む範囲に数式を入力し、Enter ではなく CTRL SHIFT ENTER を押します。

VBA を使用したくない場合は、いくつかの簡単な手順で実行できます。

  1. 数式を使用して、学生の名前の横に列を挿入します=RAND()
  2. 名前と乱数のリストを数字で並べ替える
  3. リストの一番上から好きなだけ生徒を選びます
  4. 並べ替えるたびに、新しいランダムな順序が得られます
于 2012-07-18T21:46:16.410 に答える