• 締切済み

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/17068)
回答No.5

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

SIKI0205
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2477)
回答No.4

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

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2477)
回答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
  • ベストアンサー率65% (1633/2477)
回答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
  • ベストアンサー率48% (720/1491)
回答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

  • vba doloopで=>が機能しません

    vbaでa1:a4にランダムで◯を入れて、a5で◯の数を数えます。 その時a5の数が3以上になるまでランダムで入れ、3以上ならb1:b4にランダムで◯を入れて、b5が3以上なら、c1:c4、、、をAd(30回)までしたいのですが、◯の数が3以上じゃなくても隣のセルに行って処理を初めてしまいます。 どうしたら3以上になるまでをすることができますか? 今は dim i as long for i=1 to 30 do until range("a5")=>3 ランダムに入れる処理 loop next i でやってます。 fornext 使わずに1つずつコードを作ればできるのですが、直す時大変だし、重くなるので、、

  • VBAの処理を軽くしたい

    各行ごとに5回セルを参照した結果を吐き出すプログラムを作成しています。 200行前後の処理が必要なのですが、現在のコードではあまりにも処理が重くなっています。 とにかく処理を軽くしたいのですが、どのような方法が考えられるでしょうか? 初心者なのでコードも含めてご教示頂けたら幸いです。 Sub test(b, c, d) Dim i1, i2 As Long Dim A1 As String  For i1=0 To Cells(Rows.Count, 1).End(xlUp).Row For i2 = 0 To 5 If Range(b).offset(i1, i2).Value = "x1" Or Range(c).offset(i1, i2).Value = "x1" Then A1 = "XXX" ElseIf Range(b).offset(i1, i2).Value = Range(c).offset(i1, i2).Value Then A1 = "YYY" Else A1 = "ZZZ" End If Range(d).offset(i1, i2).Value = A1 Next i2 Next i1 End Sub

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

  • エクセルVBA

    Sub PlusA001() Dim a As Range Dim b As Integer Range("e1").Value = "氏名" Range("e2").Value = "甲" Range("e2").AutoFill Destination:=Range("e2:e10"), Type:=xlFillDefault Range("f1:j1").Value = Array("国", "数", "理", "社", "英") Set a = Range("f2") For i = 1 To 5 Do Until b = 9 a.Value = Int(100 * Rnd) + 1 b = b + 1 Set a = a.Offset(1, 0) Loop b = 0 Set a = a.Offset(-9, 1) Next i End Sub サンプルコードの例ですが、どうも実行しても納得できない部分があります。それはSet a=a.offset(-9,1)の部分です。Set a = Range("f2")においてf2を始点としているのは判りますが、f2からであればa=a.offset(-9、5) とすればいいのかと思い実行したのですが、ぐちゃぐちゃになります。なぜ(-9、5)ではなく(-9、1)何ですか?いくら読み解いても判りません。教えてください。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • エクセルVBAの条件指定が上手くいきません

    「7を超えたら、For Eachステートメントを抜けなさい」という条件を入れたいのですが、 7を超えても処理が継続し困っています。 勉強不足で申し訳ないですが、ご教授願います。 【やりたいこと】 まず、セルB1~D3までのセルの値(9つ)が、7を超えない条件で1を加算していきます。 加算したときの値はE~Gの列に貼り付けていきます。 7を超えた時点でFor Eachステートメントを抜けます。 また、B1~D3までのセルには計算式が入っており、A1に数字を入れると、 それぞれ異なる増え方をします。(計算式自体は$A$1+1.1、$A$1+2.1などシンプルなもの) Sub test() Dim i As Range Dim n As Long Dim x As Long n = 1 x = 1 For Each i In Range("B1:D3") Range("A1").Value = x If i < 7 Then Range("B1:D3").Copy Cells(n, 5).Select Selection.PasteSpecial Paste:=xlPasteValues n = n + 3 x = x + 1 ElseIf i > 7 Then Exit For End If Next End Sub お手数ですが、宜しくお願いいたします。

  • エクセルVBA カウンタ2つを入れ子にしたくない時

    皆さんこんにちは。 エクセル2013を使用しております。 エクセルVBAの繰り返し処理について質問させていただきます。 下記のコードですと入れ子があるので A1にi、A3にi・・・・を一通り記載したあと またA1にi+2、A3にi+2・・・を繰り返し 最終的にA列には全て同じ値が入ってしまいます。 (Step 2にしたのはA1:A2のように2行毎の結合セルだからです) -----------------------------------------------------------------    Dim i As Long Dim j As long Dim n As long Dim k As long     i =Userform.textbox1.value     j =Userform.textbox2.value    For k =i To j Step 2 For n = 1 to j Step 2 Range("A" & n) = k    Range(”B”&n)=k+1        Next    Next ---------------------------------------------------------- もしiが1、jが10だとしたら A1に1、B1に2、A3に3、B3に4、・・・A9に9、B9に10 が入るようにするにはどうしたら良いでしょうか。 iが必ず1から始まるのであればまだ分かるのですが そうとも限らないので カウンタはやはり2つ必要だと思うのですが カウンタが2つあるのに入れ子にしないコードの書き方って あるのでしょうか。 いくら本やネットを見ても分かりません。 ご教授いただけると幸いです。

  • EXCEL2002 VBAのループ処理について

    セルB1~B24に入力した数字を i とすると、 コマンドボタンを押したときに、セルB1~B24にの全てに値が入力されていて、 セル( F & i )が空白であれば、そこにセルA1の値を入れるようなマクロを作成しています。 セル( F & i )への入力は、セルB1~B24の全部に数値が入力されており、セル( F & i )が空白があるときのみ処理が実行されるように。どちらかが満たされない場合には、メッセージボックスを表示し、処理しないようにしたいのですが、どうしても途中まで入力されてしまいます。 以下のようなコードですが、何か良い方法はないでしょうか? Private Sub CommandButton1_Click() 'ロール確認 Dim 入力 As String, パレット As String Dim i As Long, t As Long For i = 1 To 24 入力 = Range("B" & i) パレット = Range("F" & i) If 入力 = "" Then MsgBox "aaa" Exit For End If 'パレットNo.転記 If パレット <> "" Then MsgBox "bbb" Exit For ElseIf パレット = "" Then Range("F" & 入力).Value = Range("A1").Value End If Next i End Sub

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • VBAでセルのコピーをすると、エラーになる

    =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))というセルを コピーして、別のシートのセルに貼り付けたのですが、値が「0」の場合「””」が セルに張り付いてしまい、その後の計算ができません。 「””」を本当の空欄にするにはどうしたらいいのでしょうか? Sub 転記() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim SN As String SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") sh1.Range("A35").End(xlUp).Offset(0, 1) = sh2.Range("F13") sh1.Range("A35").End(xlUp).Offset(0, 2) = sh2.Range("F14") sh1.Range("A35").End(xlUp).Offset(0, 3) = sh2.Range("F15") sh1.Range("A35").End(xlUp).Offset(0, 4) = sh2.Range("F16") sh1.Range("A35").End(xlUp).Offset(0, 5) = sh2.Range("F17") sh1.Range("A35").End(xlUp).Offset(0, 6) = sh2.Range("F18") sh1.Range("A35").End(xlUp).Offset(0, 7) = sh2.Range("F19") End Sub

専門家に質問してみよう