• 締切済み

vbaのDoloopの使い方がわかりません

vbaでA1:A6に◯が4つ以上になるまでランダムで◯か×を入れて、4つ以上ならA1の隣のセルに行き同じ処理を繰り返す、を30回繰り返したいのですがどうすればいいですか? 簡単にいうと、A1:A6に◯が4つなければランダムに◯か×を入れる処理を4つ以上になるまでまで繰り返す。 A1:A6に◯が4つ以上なら隣のセル(B1)に移動し、B1:B6まで◯が4つなければ、、を30回(a~AE)繰り返したいです。 ちなみに◯か×かは繰り返す前にInt で1なら◯2なら×の乱数でやってます。 ちなみに今は Dim i as long for i=0to 29 do until range("a7").offst(0,i).value=>4 ※a7はカウントイフでa1:a6の◯の数を数えてます dim a as long for a=1to 6 1なら◯2なら×を入れる処理 end if intで乱数を決める active cell.offset(1,0) next a range("a1").offset(0,1).select loop next i endif

みんなの回答

回答No.6

ご質問タイトルからは外れますが、 6個の中身を持った配列を用意して○と✕を決定しておき、A1〜A6にまとめて貼り付ける方法もあると思います。 下記のように乱数の偏りを防ぐ方法も解説があります。 これはデータが入ったセルでは並び替えに時間がかかりすぎるので配列で(メモリ上で)実行させるべきでしょう。 https://programming-place.net/ppp/contents/algorithm/other/002.html 参考まで。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

できれば数学のカテゴリに質問して、コード作成に取り掛かるべきでは? 一般に、普通に慣れている課題以外は、 慎重に周りの経験者などに教えてもらわないと、独りよがりのやり方になることが起りえる。 特に数学的・論理的なことや、特別なアルゴリズムを使いそうな場合はね。 ーー コンピュータの乱数は、例えば、4回試行して(乱数を続けて出して)、出てくる数字が小さい数(指定。1-4までなど)の場合は、4回とも同じ数であることもある程度良く起こるである。 だからこの方法は使わないほうが良いと思う。 ーーー 小生も詳しくないが、各1列ずつについて、1-4のラン数を範囲の乱数を出し、3なら3個・3セルをその列のAの数と決める。そしてAの3個をどのセル(の行のセル、行範囲は1-6かな?)に割り振るか決める、とか思い付いた、がどうかな。

SIKI0205
質問者

補足

そうなんだ!教えてくれてありがと!笑

  • kkkkkm
  • ベストアンサー率66% (1721/2591)
回答No.4

No2、No3の追加です。 イメージとして訂正モードでの作業に感じた(既存の○はそのまま残す)のですが、新規作成もありなら Randomizeの前に If MsgBox("新規作成ですか", vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then Range("A1:AE6").ClearContents End If (新規作成だけならRange("A1:AE6").ClearContentsだけ)

  • kkkkkm
  • ベストアンサー率66% (1721/2591)
回答No.3

No.2の追加し忘れです 未入力セルを×で埋めたい場合は Loop Next の間に Loop←もとのLoop For mRow = 1 To 6 If Cells(mRow, mCol).Value = "" Then Cells(mRow, mCol).Value = "×" End If Next Next←もとのNext

  • kkkkkm
  • ベストアンサー率66% (1721/2591)
回答No.2

'とりあえず質問の説明の通りにすると Sub Test() Dim mCol As Long, mRow As Long Randomize '(a~AE)繰り返したい For mCol = Columns("A").Column To Columns("AE").Column '◯が4つ以上なら隣のセルに移動(既に○が4つ以上あれば該当列は処理しない) Do While WorksheetFunction.CountIf(Range(Cells(1, mCol), Cells(6, mCol)), "○") < 4 '◯が4つなければランダムに◯か×を入れる処理を「○」が4つになるまでまで繰り返す。 '○が4つになれば未入力があってもそのセルは放置(未入力セルの処理の説明がない) mRow = WorksheetFunction.RandBetween(1, 6) '1なら◯2なら×の乱数 If WorksheetFunction.RandBetween(1, 2) = 1 Then Cells(mRow, mCol).Value = "○" ElseIf Cells(mRow, mCol).Value <> "○" And Cells(mRow, mCol).Value = "" Then '既に○があるセルには×を入れない Cells(mRow, mCol).Value = "×" End If Loop Next End Sub

  • SI299792
  • ベストアンサー率47% (774/1620)
回答No.1

30回なら A~ADですが。(とっちが正しいか解りませんが、31回への修正は簡単にできると思います) 1行に必ず○4つでいいですか❓ Option Explicit ' Sub Macro1()   Dim Colu As Integer   Dim Rout As Integer   Dim Count As Integer '   [A1:AD6] = "×" '   For Colu = 1 To 30     Count = 0 '     Do While Count < 4       Rout = Rnd * 6 + 0.5 '       If Cells(Rout, Colu) = "×" Then         Cells(Rout, Colu) = "○"         Count = Count + 1       End If     Loop   Next Colu End Sub

関連するQ&A