『乱数で一致した数がないか調べたい』(のんきち)Excel2002、WindowsXP こんにちは。 乱数表でパスワードを作っているのですが、一致したりしないものでしょうか? 70項目のファイルを管理しています。 それぞれには乱数表で選られた4桁の数字を元にパスワードを設定しています。 パスワードは半年に一回更新します。 同一シート上に同じパスワードがないかを調べているのですが、 一括で調べられるような関数がないでしょうか?   A    B ファイル名 ****   :   ↑=INT(RAND()*(9999-1000)+1000) : : : : ---- 作業列を作ってCOUNTIF関数で調べてはいかがでしょうか。(ROUGE) ---- ROUGEさん、早速ありがとうございます。 C2セルに COUNTIF(B2:B72,B2:72) と入れてみたのですが、どうやら違うようです。。。 すみませんが、もう少し教えていただけませんか? (のんきち) ---- =COUNTIF($B$2:$B$72,B2) をコピーして。 ---- B1を空白にして B2= =Small(If(CountIf($b$1:b1,Row($1:$100))<>1,Row($1:$100)),1+Int(Rand()*(100-Row()+Row($b$2))) Ctrl + Shift + Enter で確定後、フィルダウン で1 - 100 の乱数を生成できると思います、が 乱数を生成するのはVBAのRnd function with Randomize statementをお勧めします。 (seiya) ---- 皆様ありがとうございます。 C2に =COUNTIF($B$2:$B$72,B2) を入れて、フィルダウン。 値が1で一致なし。   2以上で一致ありで確認できました。 seiyaさんの数式は#NUM!が出てうまくいきません。 >Ctrl + Shift + Enter で確定 しても何もかわらないのですが。。。? 今後項目が増えそうなので、乱数は4桁で作成したいと思っています。 VBAでの乱数生成は、関数のとどう違うのですか?? (のんきち) ---- エクセル関数のRand関数では、常に同じセットの乱数が同じ順番で生成されます。 最初に発生した乱数のセットは、次回立ち上げたとき、同じセットで生成されます。 2回目のセットは、次回の2回目のセットと一致します。 Randmize + Rnd関数の使用で、回避されます。 (seiya) ---- >同一シート上に同じパスワードがないかを調べているのですが、 >一括で調べられるような関数がないでしょうか? ということですので、参考までに。。 =MODE(B2:B72)としますと、重複する場合は、その数字が戻ります。重複無しは、#N/Aです。 (LOOKUP) ---- C列なら、 C1を空白にして、上記数式の b を c に変更  (seiya) ---- seiyaさん、ありがとうございます。 ということは、EXCELのRAND関数を使用している以上、 パスワードを半年単位で変えていても、 同じ項目に同じパスワードが設定されてくるということでしょうか。 >VBAのRnd function with Randomize statement というのはどうやって設定すればいいのでしょうか??? 関数の式、実はD列だったので、変えてみたんですけど駄目でした。 貼り付けるときにCtrl + Shift + Enter ですか? LOOKUPさん、MODE関数試してみました。 今は見つけるのも楽ですが、数が多くなるとセル番地がわかればいいのにって思うのは贅沢ですよね^^; ところでレスするときに">"って付けたいんですけど、無理みたいですね。 (のんきち) ---- 「>」と全角でやるか、半角スペースを行頭につけてみて。(みやほりん)(-_∂)b ---- >ところでレスするときに">"って付けたいんですけど、無理みたいですね。 できるかな?できた!! みやほりんさんありがとうございます♪♪ (のんきち) ---- 何回か再計算させて、はじめの重複がなくなった時点の乱数は 同じになると思いますよ (seiya) ---- 数式をコピーして、数式バーに貼り付けてそのまま Ctrl + Shift + Enter で確定してみてください (seiya) ---- C列にファイルのリストがあり、D列に結果を表示 Sub test() Dim a(), i As Long, LastR As Long LastR = Range("c" & Rows.Count).End(xlUp).Row ReDim a(1 To 9000, 1 To 2) Randomize For i = 1 To 9000 a(i,1) = i + 999 a(i,2) = Rnd Next Me.VSortMA a, 1, UBound(a,1), 2 Range("d1").Resize(LastR).Value = a End Sub Sub VSortMA(ary, LB, UB, ref) Dim M As Variant, i As Long, ii As Long, iii As Integer, temp i = UB : ii = LB M = ary(Int((LB + UB) / 2),ref) Do While ii <= i Do While ary(ii,ref) < M ii = ii + 1 Loop Do While ary(i,ref) > M i = i -1 Loop If ii <= i Then For iii = 1 To UBound(ary,2) temp=ary(ii,iii) : ary(ii,iii)=ary(i,iii) : ary(i,iii)=temp Next ii = ii + 1 : i = i - 1 End If Loop If LB < i Then VSortMA ary, LB, i, ref If ii < UB Then VSortMA ary, ii, UB, ref End Sub (seiya) 最終修正 : 12:37 11/02 ---- せっかく、コードを提示するならもう少し見直してあげたらどうでしょう。 (matta) ---- seiyaさん、できました〜!! と言っても最初に提示していただいた関数の方なんですけど^^; 数式バーに{}という括弧でくくられて出てきました♪ ただ、4桁でだしたかったので100を10000に全部変えてみたんですけど、無理でした。 考え方が違うのかな?後学のためにもう少し教えてください。 ROW($1:$100)って1〜100の値ってことですよね? SMALL(IF(COUNTIF($D$1:D1,ROW($1:$100))<>1,ROW($1:$100)), ^^^^これは何を意味してるのですか?? 1+INT(RAND()*(100-ROW()+ROW($D$2))))          ^^^^^これは任意の値ってことですか? VBAのコードに関しては、設定がややこしそうですね。。。 ファイルのリストは空白を含みますがC列にあり、乱数はD列に出したく思っています。 でもちょっと今の私には難しそうです。 (のんきち) ---- 1:100 を 1000:10000に変更 1+Int(Rand()*(10000-Row()+Row($d$1000)))) に変更 でOKだと思うのですが? でもこれだと動きが相当重たくなると思います (seiya) ---- seiyaさん、おはようございます!! 最後のRow($d$1000))))を間違えてました。 確かにちょっと重たかったですね^^; 実際の操作には影響ないスピードですので、問題ないと判断したのですが、 ときどき(3〜4回に1回)『#NUM!』というエラー値が出ます。 上記数式をフィルダウンしており、絶対参照も外しているわけではないのですが、 エラー値が出るのに規則性がありません。 二度目のセットアップ時に違うセルが 『#NUM!』と出たり、 『#NUM!』と出ていたセルがちゃんと4桁の数字で出てきたりするのです。 不安定なものなんでしょうか?? (のんきち) ---- 安定性は期待できないかもしれませんね... 一度、VBAの方も試してみますか? 1) シート見出しを右クリックして [コードを表示] 2) コードを貼り付けて、x をクリックしてエクセル画面に戻る 3) [ツール] - [マクロ] - [マクロ] で シート名.test を選択して「実行」 "シート名"はコードを貼り付けたシートの名前です。 エラーがでたら、なるべく詳しくお知らせください (seiya) ---- seiyaさん、あきれずにお付き合いありがとうございます(*^▽^*) Sub VSortMA(ary, LB, UB, ref) のところで黄色くなり、「シート名が違います」と出たので、 Subの後につなげてシート名を記入しようとしたのですが、 『このアクションを実行するとプロジェクトがリセットされます。』 とエラーが出ました。 コード内のa(i,1)はc(i,1)に変えました。 C列のファイル名でD列にパスワードとなる数列を羅列したい為です。 本当にに初心者すぎてつたない質問で申し訳ありません。 (のんきち) ---- コードを変更しましたので、張り替えてください。(ご自分で変更しないでそのまま) (seiya) ---- はい!勝手に変えて申し訳ありません・・・。 やはり >Sub VSortMA(ary, LB, UB, ref) >のところで黄色くなり、「シート名が違います」と出 ますね。。。 エラー表示は 『コンパイルエラー:subまたはfunctionが定義されていません』となります。 コードの temp = ary(ii, iii): a(ii, iii) = a(i, iii): a(i, iii) = temp                  ^^^この部分が青くなってます。 (のんきち) ---- 失礼しました! もう一度張り替えてください (seiya) ---- おぉ〜〜〜!!すごいです☆ そんなに重たくなく、2秒ほどで処理が完了しました。 欲を言えば、乱数が10**なので、****となって欲しいところですが、 70項目のうち、一致がひとつもありませんでした。 ありがとうございます。 VBAってすごいですね。 (のんきち) ---- あれ? 最終変更したコードを使用されていますか? (seiya) ---- はい。今ももう一度コピペしてマクロ実行をしてみましたが、 やはり10**です。。。 (のんきち) ---- Me.VSortMA a, 1, LastR, 2 を Me.VSortMA a, 1, UBound(a,1), 2 に変更してください。(seiya) ---- seiyaさん何度もありがとうございます。 ご指摘の通り変更しましたら、****になりました!! でも、10***というのも出ます。なぜなんでしょう(><) 何一つ私は分かっておらずにすみません。。。 乱数を表示させるってものすごく大変なんですね。 (のんきち) ---- 計算違いをしています。 2箇所ある 9998 を 9000 にしてください(コード変更済み) (seiya) ---- できました!!ありがとうございます♪♪ 本当にお手数をおかけいたしました(シ_ _)シ 逐一勉強いたします。。。 (のんきち)