Excel2003についてです。
セルC1からC800に、1から4までのいずれかの数値を入れていこうとしています。1の場合は25個、2を150個、3を300個、残りを4とします。
各数値をばらばらに散らしたいのでセルC1からC800を乱数で指定して、もし指定したセルが空白なら数値を入れ、空白でなければセルをもう一度指定しなおす、というマクロを作成しました。
下記のように記述(『残りを4』については省略、行頭の空白は全角です)したのですが、これを実際に走らせて見ると、各数値の指定した(はずの)個数と実際に入った数値の個数が一致しません。
セルをクリアしてもう一度実行してみると前回と個数が違う場合もあります。
VBAについては仕事でたまに触る程度で、まだまだ青二才です。
どうぞアドバイスをよろしくお願いします。
Dim A, B, C, D, n
For A = 1 To 3
Select Case A
Case 1
B = 25
Case 2
B = 150
Case 3
B = 300
End Select
For n = 1 To B
Do
C = Int(Rnd() * 1000) + 1
Cells(1, 1) = C
If C <= 800 Then
D = Cells(C, 3)
If D = "" Then
Cells(C, 3) = A
End If
End If
Loop While C > 800
Next n
Next A
No.1ベストアンサー
- 回答日時:
こんにちは。
この手の問題で、よく使われる方法を2つ紹介しておきます。
# コードの修正はしませんでした。すみません。
Sub SampleProc()
' // データセット
Range("C1:C25").Value = 1
Range("C26:C175").Value = 2
Range("C176:C475").Value = 3
Range("C476:C800").Value = 4
' // チェック数式(参考用)
Range("E1:E4").Formula = "=ROW()"
Range("F1:F4").Formula = "=COUNTIF($C$1:$C$800,$E1)"
MsgBox "データセット終了"
' // 作業列(D列)にソート用乱数を設定し値化
With Range("D1:D800")
.Formula = "=Rand()"
.Value = .Value
End With
MsgBox "ソートキーセット終了"
' // 作業列をキーにしてソート
Range("C1:D800").Sort Key1:=Range("D1"), _
Order1:=xlAscending, _
Header:=xlGuess
MsgBox "ソート終了"
' // 作業列
Range("D1:D800").ClearContents
MsgBox "作業列消去"
End Sub
作業列を使わないのであれば、重複のない乱数を求める手法が
応用できます。考え方は難しいものではありませんが、中級者
向けの内容かな...? こんな感じ。
Sub SampleProc2()
Dim Src As Variant, i As Long
' // 配列に要素をセットします
ReDim Src(1 To 800)
For i = 1 To UBound(Src)
Select Case i
Case Is <= 25: Src(i) = 1
Case Is <= 175: Src(i) = 2
Case Is <= 475: Src(i) = 3
Case Else: Src(i) = 4
End Select
Next
' // 配列をシャッフルします(例)50000回
Call ShuffleArray(Src, 50000)
' // 結果をセルに書き出します
Range("C1:C800").Value = Application.Transpose(Src)
End Sub
Private Sub ShuffleArray(ByRef Src As Variant, ByVal Count As Long)
Dim tmp As Variant
Dim lLower As Long, lUpper As Long
Dim n1 As Long, n2 As Long
Dim i As Long
If Not IsArray(Src) Then Exit Sub
lLower = LBound(Src)
lUpper = UBound(Src)
Randomize Now()
For i = 1 To Count
' // 入れ替える配列の添え字 n1,n2 を乱数で求める
n1 = Int((lUpper - lLower + 1) * Rnd() + lLower)
n2 = Int((lUpper - lLower + 1) * Rnd() + lLower)
' // 値を入れ替える
tmp = Src(n1)
Src(n1) = Src(n2)
Src(n2) = tmp
Next
End Sub
まったく違ったアプローチを示していただき、ありがとうございました。目からうろこが落ちる、というのを実感できました。
特に、1つ目の例を見たときには、自分がえらく複雑な手順を考えていたのがわかりました。
2つ目については、配列、Private Subプロシージャの使用、引数の渡し方など、私にとってこれまでなじみの薄い(というより避けて通ってきたかも)もので、勉強になりました。なんとか、各部分でそれぞれ何をしているのか理解できました。
本当に助かりました。ありがとうございました。
No.2
- 回答日時:
セルに数値を代入できたかどうかがLoop Whileを抜ける条件になるので変数xを追加してみました。
Dim A, B, C, D, n, x
For A = 1 To 3
Select Case A
Case 1
B = 25
Case 2
B = 150
Case 3
B = 300
End Select
For n = 1 To B
x = 0 '初期化
C = Int(Rnd() * 800) + 1
Do
If Cells(C, 3) = "" Then
Cells(C, 3) = A
x = 1 '数値代入完了
Else
C = Int(Rnd() * 800) + 1 '代入できなかったのでランダム値取り直し
End If
Loop While x = 0
Next n
Next A
この回答への補足
解決策を示していただき、ありがとうございました。
2つ目のFor文で、変数Bまでまわすので、その中の結果がどうであれ
Aの値がB個代入されていくはず、と考えていたのですが、
その中のif文で条件に当てはまらない場合の処置をしていないために
代入せずにそのまま Next n へ進んで次の n+1 のループに入ってしまった、という理解でいいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelはなんで先頭の0を消すん...
-
Excel元に戻す方法を教えてくだ...
-
【Microsoft Office Excel Comp...
-
Excelが固まってしまった。
-
西暦や和暦の表示をyyyymmdd表...
-
Excel 2019 のピボットテーブル...
-
【関数】スペースがいくつ入っ...
-
【Excel】セル内の時間帯が特定...
-
excelの不要な行の削除ができな...
-
Excelのオートフィル
-
別シートからの文字を変更
-
Excelのセルを飛ばして入力する
-
Excel初心者です。 詳しい方、...
-
エクセルの行の抽出について質...
-
Excel初心者です。 詳しい方、...
-
【マクロ】エクセルにかいてあ...
-
EXACT関数とIF関数の組み合わせ...
-
スプレッドシート クエリ関数 1...
-
エクセルで指定した日付、店舗...
-
Excelのグラフ軸について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報