出産前後の痔にはご注意!

エクセルのVBAで以下のプログラムを作動させたいです。
AクラスシートのA1からA6まで名前が入っており、その名前を名簿シートのA1,A3,A5,B1,B3,B5にボタンを押すごとにランダムに表示したいです。
ボタンを押すとそれぞれのセルの名前がランダムに入れ替わるようなものとしたいです。

どのようなプログラムにしたらいいでしょうか。よろしくお願いします。

A 回答 (3件)

こんばんは!



https://oshiete.goo.ne.jp/qa/10059650.html

↑のサイトの関連質問になるのですね。

>ボタンを押すとそれぞれのセルの名前がランダムに・・・
応用だけです。

「Aクラス」シートにコマンドボタンを配置しているとします。
コマンドボタンのコードを↓にしてみてください。

Private Sub CommandButton1_Click()
Dim c As Range, myRng As Range
Dim myNum As Long, myFlg(1 To 6) As Boolean
Randomize
With Worksheets("名簿")
Set myRng = .Range("A1,A3,A5,B1,B3,B5")
For Each c In myRng
Do
myNum = Int(6 * Rnd + 1)
Loop Until myFlg(myNum) = False
c = Cells(myNum, "A")
myFlg(myNum) = True
Next c
End With
End Sub

こんな感じで大丈夫だと思います。m(_ _)m
「エクセルのVBAでランダムに表示する。」の回答画像1
    • good
    • 0
この回答へのお礼

早速ご回答頂きありがとうございました。

お礼日時:2017/11/27 10:48

たぶん、ここでは、私のは、理解されないかもしれません。

ランダムの基数が6だけでは、どれも差はでません。

Excelの擬似乱数ジェネレーターは、「一様乱数(ひとつのパレットでできる乱数)」に欠陥があるそうで、その一様乱数は 32768 種しかありません。だから、専門的な乱数には使えないとも言われています。
以下は、Flag を使わず、重複を出さないシステムです。乱数によって、一意の数字を見つける方法ですと、数によっては、アテのない時間を待つ可能性があります。本格的には、アルゴリズムを利用します。今回は、ワークシート関数で間に合わせました。

'//
Sub RandomGenerate1()
 Dim sh1 As Worksheet
 Dim sh2 As Worksheet
 Dim prsns As Range
 Dim nums(1 To 6)
 Dim Ar(1 To 6) As Variant
 Dim i As Long, j As Long, k As Long
 Dim c As Variant
 Dim v As Variant
 Set sh1 = Worksheets("Aクラス")
 Set sh2 = Worksheets("名簿")
 Set prsns = sh1.Range("A1:A6")
 Randomize '一様乱数は、一回の発生につき1回限り
 For i = 1 To 6
  nums(i) = Rnd
 Next
 With Application
  For i = 1 To 6
   v = .Small(nums, i)
   Ar(i) = .Match(v, nums, 0)
  Next
 End With
 k = 1
 For Each c In sh2.Range("A1,A3,A5,B1,B3,B5")
  c.Value = prsns(Ar(k)).Value
  k = k + 1
 Next c
End Sub
    • good
    • 0
この回答へのお礼

詳しい説明をしていただき勉強になりました。ありがとうございました。

お礼日時:2017/11/27 10:48

こんなのはいかがでしょうか?


--------------------------------------------------------------------------------
Sub test()
Dim 行 As Long
Dim 列 As Long
Dim 使用済(5) As Boolean
Dim 数 As Long
Randomize
Sheets("名簿").Select
For 行 = 1 To 5 Step 2
For 列 = 1 To 2
Do
数 = Int(6 * Rnd)
Loop Until 使用済(数) = False
Cells(行, 列).Value = Sheets("Aクラス").Cells(数 + 1, 1).Value
使用済(数) = True
Next
Next
End Sub
--------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

分かりやすいプログラムを教えていただきありがとうございました。

お礼日時:2017/11/27 10:49

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qエクセル指定した範囲からランダムで一つ抽出

エクセルの関数についての質問なのですが、

B1~B5に値がならんでいたとして、B1~B5の中からランダムに一つ抽出したものをA3に表示する関数はありますか?

Aベストアンサー

A3に次の式を入力すればよいでしょう。

=INDEX(B1:B5,RANDBETWEEN(1,5))

QExcelで事前にセルに入力した言葉をランダムに表示

例えばA1に「いぬ」 A2に「ねこ」 A3に「ぞう」 A4に「たぬき」 A5に「きつね」と入力します
次に
B1~B10に 「いぬ」「ねこ」「ぞう」「たぬき」「きつね」のいずれかを自動にランダムに表示する方法を教えてください
こんな便利な機能があれば良いと思うのですが・・・

Aベストアンサー

=INDIRECT("A"&INT(RAND()/0.2)+1)

INT(RAND()/0.2)+1 で1~5までの整数が得られます。
INT(RAND()/0.1)+1 で1~10までの整数が得られます。
INT(RAND()/0.02)+1 で1~50までの整数が得られます。
INT(RAND()/0.01)+1 で1~100までの整数が得られます。

それでA1からA5、A1からA10、A1~A50、A1~A100のセルの内容を取得しています。A2からなら+2にしてください。
F9キーを押すたびに再計算されて、表示も変わります。

QExcelVBAでランダムな数字を特定のセルに入力したいです

ExcelのVBAでA1~A5,C1~C10に1~10の値を重複無しで入力にはどうしたらいいですか。

Aベストアンサー

こんなのはいかがでしょうか?
--------------------------------------------------------------------------------
Sub 乱数()
Dim 行 As Long
Dim 乱数 As Long
Dim 数(9) As Boolean
Randomize
For 行 = 1 To 10
Do
乱数 = Int(10 * Rnd)
Loop While 数(乱数)
Cells(行, 3).Value = 乱数 + 1
数(乱数) = True
Next
For 行 = 1 To 5
Do
乱数 = Int(10 * Rnd)
Loop Until 数(乱数)
Cells(行, 1).Value = 乱数 + 1
数(乱数) = False
Next
End Sub
--------------------------------------------------------------------------------

こんなのはいかがでしょうか?
--------------------------------------------------------------------------------
Sub 乱数()
Dim 行 As Long
Dim 乱数 As Long
Dim 数(9) As Boolean
Randomize
For 行 = 1 To 10
Do
乱数 = Int(10 * Rnd)
Loop While 数(乱数)
Cells(行, 3).Value = 乱数 + 1
数(乱数) = True
Next
For 行 = 1 To 5
Do
乱数 = Int(10 * Rnd)
Loop Until 数(乱数)
Cells(行, 1).Value = 乱数 + 1
数(乱数) = False
Next
End Sub
-------...続きを読む

QVBでボタンを押すと画像をランダム表示させる

VisualBasic2005ExpressEditionで「ボタンを押すとピクチャーボックスに画像をランダムで表示」させたいんですが、どうやるかわかりません教えてください。何件か探しては見たんですが見つかりませんでした。もしかしてVBでは、そういったプログラムはできないんでしょうか?

Aベストアンサー

えっと、やり方は他にもあると思いますが、楽なやつで。

まず、それぞれの画像ファイルの名前を格納する配列を用意します。
Dim strPicture(10) As String
strPicture(0) = "pic1.jpg"
strPicture(1) = "pic2.jpg"
strPicture(2) = "pic3.jpg"



という風にやります。配列の数は表示させたい画像分だけ作ります。

次に、ランダムに表示させるということなので
乱数を発生させる必要がありますね。

' 0 以上 a 未満の乱数を取得する
Dim intResult As Integer = hRandom.Next(a)

とやります。 aはランダムに表示させたい画像の最大枚数-1ですね。
すると、intResultに、ランダムな数値が入ります。

そうしたら

PictureBox1.image = Image.FromFile(strPicture(intResult))

とします。

上記のコードを、ボタンをクリックしたときのイベントに追加すれば
OKです。

ただ、上記のように画像ファイル名のみだと
プログラムがあるフォルダ内に画像ファイルがないと読み込めないので
フルパスで書いた方がいいかもです。

strPicture(0) ="C:\~" という具合です。

えっと、やり方は他にもあると思いますが、楽なやつで。

まず、それぞれの画像ファイルの名前を格納する配列を用意します。
Dim strPicture(10) As String
strPicture(0) = "pic1.jpg"
strPicture(1) = "pic2.jpg"
strPicture(2) = "pic3.jpg"



という風にやります。配列の数は表示させたい画像分だけ作ります。

次に、ランダムに表示させるということなので
乱数を発生させる必要がありますね。

' 0 以上 a 未満の乱数を取得する
Dim intResult As Integer = hRandom.Next(a)

...続きを読む

Q表(リスト)からランダムに抽出するには?

Excelで次のような表を作りました。(例として書きます)

1. みかん
2. バナナ
3. もも
4. なし
5. 栗   ・・・(以下同様) と続いていきます。

今回、その表から、ランダムにデータを抽出し、別のセルに書き出したいのですがどうやっていいのかわかりません。(理想図を下に書きます。)


2. バナナ
5. 栗
1. みかん  ・・・・・(以下同様)

このようにして、今ある表から、ランダムに並び替えた、 『新たな表』 を作りたいのです。

どのように関数(RAND関数?)を設定したらいいのかよくわかりません。 教えてください。お願いします。

ちなみにOffice2000です。

Aベストアンサー

こんにちは。maruru01です。

作業列を1列だけ使用した、絶対に重複しない数式での方法です。
元データがA1:B5で、C列を作業列に使用して、D:E列に表示するとします。
まず、C1に、

=INT(RAND()*5+1)

と入力します。次に、C2に、

=LARGE(INDEX(NOT(COUNTIF($C$1:C1,ROW($A$1:$A$5)))*ROW($A$1:$A$5),),INT(RAND()*(5-ROW(C1))+1))

と入力して、C5までコピーします。
そうしたら、D1に、

=INDEX(A:A,$C1)

と入力して、E1にコピー。
さらに、D1:E1を5行目までコピー。

やはり、[F9]を押すたびごとに並べ替えられます。

QExcel VBA セルを指定個数ランダム選択

Excel VBA セルを指定個数ランダム選択
A1からA30までのセルをランダムで8コ選んで値として"○"を入れる
ということをやりたいのですがどのようにすればよいでしょうか?

よろしくお願いします。

Aベストアンサー

Sub try()
Dim i As Integer
Dim m As Integer

i = 1

Range("A1:A30").ClearContents

While i < 9
m = Int(Rnd() * 30) + 1

If Cells(m, 1).Value = "" Then
Cells(m, 1).Value = "○"
i = i + 1
End If

Wend

End Sub

一例まで。

Q▲特定のセルからランダムに抽出しテストを作成▲

いつもお世話になっております。
エクセルのVBAについて教えて頂きたく書き込みいたします。
日本語が意味不明であれば、より詳しく記載しますのでご教授願います。

1つのエクセルの中に4つのシートがあります。
【Top(sheet1)、問題(sheet2)、初級(sheet3)、中級(sheet4)、上級(sheet5)】

Topにはスタートボタンがあり、クリックすることにより問題シートへと移動し、別シートより問題を抽出したいです。

問題シート内のC3~C17に問題が、D3~D17に(問題に付随した)ヒントが
ランダムに抽出されるようにマクロを作成したいです。

また問題、ヒント、答えは初級、中級、上級、それぞれのシートに(20問ずつぐらい)記載をしています。
初級から10問、中級から3問、上級から2問と抽出をしたいです。
答えに回答を入力することにより正解であればセルが青く、間違えであればセルが赤くなるようにしたいです。

簡易ではありますが、エクセルの画像も添付させてもらいます。
恐れ入りますがご教授願います。

Aベストアンサー

こんばんは!
面白そうなのでトライしてみました。

Sheet6を作業用のSheetとして追加・使用するようにしていますので、
Book上にはお示しの5つのSheetが存在しているという前提です。
尚、各Sheetともお示しの配置通りとします。

ます「TOP」Sheetにコマンドボタンを挿入 → コマンドボタンのコードを↓にしてみてください。

Private Sub CommandButton1_Click()
Worksheets("問題").Select
Worksheets("問題").Range("E3:E17").Interior.ColorIndex = xlNone
Call Sample1
End Sub

次にAlt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に
↓のコードをコピー&ペーストしてください。

Sub Sample1() 'この行から
Dim i As Long, lastRow As Long, c As Range
Dim wS2 As Worksheet, wS3 As Worksheet, wS4 As Worksheet, wS5 As Worksheet, wS6 As Worksheet
Set wS2 = Worksheets("問題")
Set wS3 = Worksheets("初級")
Set wS4 = Worksheets("中級")
Set wS5 = Worksheets("上級")
Application.ScreenUpdating = False
If Worksheets.Count <> 6 Then
Worksheets.Add after:=Worksheets(Worksheets.Count)
End If
Set wS6 = Worksheets(Worksheets.Count)
wS6.Visible = xlSheetHidden
wS6.Range("A:C").Clear
wS2.Range("C3:E17").ClearContents
With wS3
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
.Range("E:F").Insert
Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()"
Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)"
For i = 1 To 10
Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole)
c.Offset(, -4).Resize(, 3).Copy
wS6.Activate
ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
Next i
.Range("E:F").Delete
End With
With wS4
.Range("E:F").Insert
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()"
Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)"
For i = 1 To 3
Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole)
c.Offset(, -4).Resize(, 3).Copy
wS6.Activate
ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
Next i
.Range("E:F").Delete
End With
With wS5
.Range("E:F").Insert
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()"
Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)"
For i = 1 To 2
Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole)
c.Offset(, -4).Resize(, 3).Copy
wS6.Activate
ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
Next i
.Range("E:F").Delete
End With
wS6.Range("A2:B16").Copy
wS2.Activate
ActiveSheet.Range("C3").Select
Selection.PasteSpecial Paste:=xlPasteValues
wS2.Columns.AutoFit
wS2.Range("E3").Select
Application.ScreenUpdating = True
End Sub 'この行まで

最後に「問題」SheetのSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペースト → Excel画面に戻り「TOP」Sheetのコマンドボタンをクリックし
「問題」SheetのE列に答えを入力してみてください。

Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
Dim c As Range
If Intersect(Target, Range("E3:E17")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Worksheets(6)
If Target <> "" Then
Set c = .Range("A:A").Find(what:=Target.Offset(, -2), LookIn:=xlValues, lookat:=xlWhole)
If Target = c.Offset(, 2) Then
Target.Interior.ColorIndex = 8 '←水色
Else
Target.Interior.ColorIndex = 3
End If
Else
Target.Interior.ColorIndex = xlNone
End If
End With
End Sub 'この行まで

※ 通常の青だと字が見えにくいので「水色」にしています。m(_ _)m

こんばんは!
面白そうなのでトライしてみました。

Sheet6を作業用のSheetとして追加・使用するようにしていますので、
Book上にはお示しの5つのSheetが存在しているという前提です。
尚、各Sheetともお示しの配置通りとします。

ます「TOP」Sheetにコマンドボタンを挿入 → コマンドボタンのコードを↓にしてみてください。

Private Sub CommandButton1_Click()
Worksheets("問題").Select
Worksheets("問題").Range("E3:E17").Interior.ColorIndex = xlNone
Call Sample1
End Sub

次にAlt+F11キ...続きを読む

QVBA-指定した範囲で重複しない乱数を生成したい

指定した範囲(例:100~200)から10個、重複しない乱数を生成したいのですが、どのようなマクロを書けばよいでしょうか。

ループを使い、重複があれば結果を一度消して再生成、と思ったのですが、時間がかかる上Excelが落ちることがあります。

できるだけ簡単なコードでこのプログラムを書きたいのですが、知恵をお貸しください。
コード自体の投稿、または関数名での説明、どちらでもOKです。

Aベストアンサー

お望みの特定範囲内の「重複しない」乱数を生成するコードを書きます。

Dim A,B,AA,BB

A:発生させた特定範囲内の乱数
B:目的成果品の数
AA:発生させた特定範囲内の乱数の全て
BB:発生させた特定範囲内の乱数の内、重複していないものの集合(成果品)

AA=""
BB=""
B=0
Do
A=Int(101*Rnd+100)
AA=AA & "\" & A & "/"
IF Instr(AA,"\" & A & "/")=0 Then
BB=BB & "\" & A & "/"
B=B+1
Endif
Loop Until B=10

BBから成果品を取り出す方法又は、成果品の表示方法等はご自身でお考え下さい。
"\""/"はどんな文字列でもOK

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Q文字列のランダム表示のVBA(エクセル)

A1をダブルクリックすると、A1に7つの文字列がランダムに表示される。
追加条件として、先頭の文字は"a""c""f""h""k""9"に限定される。
2文字目から最後の文字までは、"0""1""2""5""6""7""8""x"に限定される。

例として、
f010156
a666082
k702x15
9xx7587

上記のVBAを教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

一例です。
ANo1さんとの違いは、
ダブルクリックでセルが編集状態になるのをとめたことと、
毎回違った乱数系列を発生させるために、Rnd関数を呼ぶ前に Randomize ステートメントを使用したことです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim myAr1, myAr2 '変数宣言
Dim myRnd As String
If Target.Address <> "$A$1" Then Exit Sub 'A1以外停止
Randomize '乱数初期化
myAr1 = Split("a,c,f,h,k,9", ",") '先頭文字候補配列
myAr2 = Split("0,1,2,5,6,7,8,x", ",") '後続文字候補配列
myRnd = myAr1(Int(Rnd * 6)) '1文字目
For i = 1 To 6 '2文字目以降
myRnd = myRnd & myAr2(Int(Rnd * 8)) '2~7文字目
Next i '繰り返し
Target.Value = myRnd '値入力
Cancel = True '編集状態停止
End Sub

一例です。
ANo1さんとの違いは、
ダブルクリックでセルが編集状態になるのをとめたことと、
毎回違った乱数系列を発生させるために、Rnd関数を呼ぶ前に Randomize ステートメントを使用したことです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim myAr1, myAr2 '変数宣言
Dim myRnd As String
If Target.Address <> "$A$1" Then Exit Sub 'A1以外停止
Randomize '乱数初期化
myAr1 = Split("a,c,f,h,k,9", ",") '先頭文字候補配列
myAr2 =...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング