• 締切済み

このマクロの繰り返し?

もう、なにがなんやらで・・・ このマクロの繰り返しを入れ子で出来ないでしょうか? 加算しながら増やしていくので、わけわからなくなりそうです。 Option Explicit Sub hiat() Cells.Clear Dim s As Long, a As Long, b As Long, c As Long, d As Long, e As Long For a = 1 To 31 s = Rnd * 4 Cells(a, 1) = s If s >= 4 Then Exit For '4がでたら終わり。 Next For b = 2 To 31 s = Rnd * 4 Cells(a, b) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + 1, b).Select 'セルの移動 Cells(a + 1, b).Activate For c = 1 To 31 - a s = Rnd * 4 ActiveCell(c) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c, b + 1).Select 'セルの移動 Cells(a + c, b + 1).Activate For d = 1 To 31 - a - c s = Rnd * 4 ActiveCell(d) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + d - 1, b + 2).Select 'セルの移動 Cells(a + c + d - 1, b + 2).Activate For e = 1 To 31 - a - b - c - d s = Rnd * 4 ActiveCell(e) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + e - 1, b - 1 + d + 1).Select 'セルの移動 Cells(a + c + e - 1, b - 1 + d + 1).Activate End Sub

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。KenKen_SP です。 ▼乱数について   > Dim s As Long   > s = Rnd * 4   Rnd は単精度浮動小数点数型 (Single) の乱数を返します。それを Long   型の変数 s で受ける場合、小数が丸められた整数で代入されます。   したがって、0~4の範囲の整数で乱数を発生させる、、と解釈しました。 ▼移動について   移動量は1で固定だから、アクティブのセルを移動させてしまえば、座標   計算しなくて済みます(手抜き)。   まあ、OFFSETにつかう値を変数で保持しておくだけですが、、   進行方向は blnDEST フラグで決めるようにし、4がでたら     blnDEST = Not blnDEST   で値を逆転させてます。 ご提示頂いたコードの解釈が間違っていたら、スルーして下さい。 では。 Option Explicit Sub Sample()      '【仕様?】   '0~4の範囲で発生させた整数の乱数をセルに書き込み、行または列方向に移動   '4なら縦横の進行方向を逆転させる      Const cnsMAXMOVE As Long = 31 '最大移動量 31? いくつでもOKだけどエラー処理必須   Const cnsUPPER  As Long = 4 '乱数の最大値   Const cnsLOWER  As Long = 0 '乱数の最小値   Const cnsCHANGE As Long = 4 '進行方向逆転トリガー値      Dim i    As Long   Dim lngVAL As Long   Dim blnDEST As Boolean        '初期化   Cells.Clear    'セルクリア   Cells(1, 1).Select '基点      '最初の進行は行方向   blnDEST = True   'カウンタ i が最大移動量になるまでループ   For i = 1 To cnsMAXMOVE     '抽選     Randomize     lngVAL = CLng(Int((cnsUPPER - cnsLOWER + 1) * Rnd + cnsLOWER))     '抽選結果の乱数を書き込み     ActiveCell.Value = lngVAL     '抽選結果から進行方向を決める     If lngVAL = cnsCHANGE Then blnDEST = Not blnDEST     '進行方向別の移動処理     If blnDEST Then       ActiveCell.Offset(1, 0).Select '行方向へ移動     Else       ActiveCell.Offset(0, 1).Select '列方向へ移動     End If   Next i End Sub

関連するQ&A

  • VisualBasic compile error

    Sub Macro1r1() Dim r As Long, rr As Long Dim c As Long, cc As Long Dim w As Long, ww As Long Dim stopC As Long stopC = Range("IV1").End(xlToLeft).Column Range(Range("E1"), Cells(1, stopC)).DataSeries rowcol:=xlRows, Type:=xlDataSeriesLinear, Date:=xlDay, Trend:=True For r = 2 To Range("A65536").End(xlUp).Row Cells(r, "B").Resize(1, 3).ClearContents w = 0 For c = 5 To stopC If Cells(r, c).Interior.ColorIndex <> xlNone And Cells(r, c).Interior.ColorIndex <> xlAutomatic Then Cells(r, "B") = Cells(1, c).Value For cc = c To stopC If Cells(r, cc).Interior.ColorIndex = xlNone Or Cells(r, cc).Interior.ColorIndex = xlAutomatic Then Exit For End If w = w + 1 Next cc If cc = stopC Then Cells(r, "C") = Cells(1, cc - 1).Value + 5 Else For rr = cc To stopC If Cells(r, rr).Interior.ColorIndex <> xlNone And Cells(r, rr).Interior.ColorIndex <> xlAutomatic Then For ww = rr To stopC If Cells(r, ww).Interior.ColorIndex = xlNone Or Cells(r, ww).Interior.ColorIndex = xlAutomatic Then Exit For End If w = w + 1 Next ww Next rr <------------------------- 次のerrorメッセ-ジ next without for が表示される。 Cells(r, "C") = Cells(1, rr - 1).Value + 5 End If Cells(r, "D") = w * 7 Exit For End If Next c Next r End Sub

  • 検索 マクロ

    本を見ながら作ったのですが 検索してくれるのですが A列を検索してくれるのですが検索したいのは B列の4番目から下にあるだけ検索したいのですが どういじればいいのでしょうか? Option Explicit Private lastRow As Long Private Index As Integer Private Sub UserForm_Activate() Dim i As Long lastRow = Worksheets("顧客情報").Cells(Rows.Count, 1).End(xlUp).Row + 1 If lastRow <= 3 Then MsgBox "データがありません。" Exit Sub End If For i = 3 To lastRow 名前リストボックス.AddItem Cells(i, 1) Next End Sub Private Sub 検索ボタン_Click() Dim searchName As String searchName = 検索名前テキストボックス.Text If searchName = "" Then MsgBox "検索する名前を入力してください。" Else Dim i As Long Dim no As Long For i = 0 To 名前リストボックス.ListCount - 1 If 名前リストボックス.List(i) = searchName Then no = i 名前リストボックス.ListIndex = no Exit For ElseIf i >= 名前リストボックス.ListCount - 1 Then MsgBox "該当なし。" Exit For End If Next Index = no + 3 Rows(Index).Select End If End Sub

  • 繰り返しマクロについて

    先日、マクロについて質問をさせていただきました。 常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。 最初にデータを入れる列はD列7行目から30行目まで。次はE列に同じようににデータ入力した後ににマクロを実行します。これをM列7行目から30行目まで、列に新しいデータを入れるたびに毎回繰り返したいのです。 矢印マークは 常にN列に表示。  で、以下のようなマクロを教えていただきましたが、このマクロだと 比較がされる列が、絶えずD列と、新しく入力した列になってしまいます。 先ほども書きましたが、比較する列は、D列とE列 それが終わったらE列とF列 次はF列とG列 というように常に右側とその直ぐ左側の列の比較をしたいのです。 もう一度 お教えいただきたいのですが、よろしくお願いいたします。 回答いただいたマクロを下に入れておきます。 Sub test() Dim i, j, k As Long Dim vl1, vl2 As Variant For i = 4 To 30 If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, 13))) > 1 Then j = 4 Do Until Cells(i, j) <> "" j = j + 1 Loop vl1 = Cells(i, j) For k = 4 To 13 If Cells(i, k) <> "" Then vl2 = Cells(i, k) End If Next k If vl1 > vl2 Then Cells(i, 14) = "↓" ElseIf vl1 = vl2 Then Cells(i, 14) = "→" Else Cells(i, 14) = "↑" End If Else Cells(i, 14) = "" End If Next i End Sub

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • マクロで最終行を空欄にしたいのですが、出来なくて困ってます

    VBA初心者です。 仕事で、見積書を作成する際に多い時には2~3枚にわたる時で、マクロが既に組んであるのですが、最終行は空欄のはずが、2ページ目のデータが上がってきています。 どうすれば、最終行を空欄に出来るのでしょうか? このマクロが、延々と続いています。 Dim a As Integer Dim c As Integer Dim count As Integer b = 1 c = 1 count = 1 '明細1の処理 a = 1 If Sheet2.Cells(a + 3, 2) = "" Then GoTo 20 Sheet13.Cells(b + 22, 1) = count Sheet13.Cells(b + 22, 2) = Sheet2.Cells(a + 3, 3) Sheet13.Cells(b + 22, 12) = Sheet1.Cells(c + 14, 5) Sheet13.Cells(b + 22, 13) = Sheet1.Cells(c + 14, 6) Sheet13.Cells(b + 22, 17) = Sheet1.Cells(c + 14, 10) If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 c = c + 1 count = count + 1 For a = 2 To 8 If Sheet2.Cells(a + 3, 2) = "" Then GoTo 10 Sheet13.Cells(b + 22, 2) = Sheet2.Cells(a + 3, 3) If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 Next a 10 If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 初心者の為、宜しくお願い致します。

  • マクロ 修正 (初心者です)

    Option Explicit Private lastRow As Long Private Index As Integer Private Sub CommandButton1_Click() Unload Me End Sub Private Sub あいまいボタン_Click() Dim last As Long If 検索名前テキストボックス.Text = "" Then MsgBox "あいまい抽出する名前を入力してください。" Exit Sub End If last = Range("A500").End(xlUp).Row Range("A2:D" & last).AutoFilter Field:=2, Criteria1:="=*" & 検索名前テキストボックス.Text & "*" End Sub Private Sub UserForm_Activate() Dim i As Long lastRow = Worksheets("顧客情報").Cells(Rows.Count, 1).End(xlUp).Row + 1 If lastRow <= 3 Then Exit Sub End If For i = 4 To lastRow 名前リストボックス.AddItem Cells(i, 2) Next End Sub Private Sub 検索ボタン_Click() Dim searchName As String searchName = 検索名前テキストボックス.Text If searchName = "" Then MsgBox "検索する名前を入力してください。" Else Dim i As Long Dim no As Long For i = 0 To 名前リストボックス.ListCount - 1 If 名前リストボックス.List(i) = searchName Then no = i 名前リストボックス.ListIndex = no Exit For ElseIf i >= 名前リストボックス.ListCount - 1 Then MsgBox "該当なし。" Exit For End If Next Index = no + 3 Rows(Index).Select End If End Sub B列に名前を入力しています B3から検索してくれるマクロを作成しました(インターネット見ながら) 別の検索も作りたくてどこをいじればいいのかわからず書き込みました G3列(住所を検索)から下側を検索したいのですがどこをいじればいいでしょうか?

  • 割り算

    a(5)*x^5+a(4)*x^4+a(3)*x^3+a(2)*x^2+a(1)*x+a(0) =(x^2+b(1)*x+b(0))*(c(3)*x^3+c(2)*x^2+c(1)*x+c(0)) となるようにb(1),b(0)の値を変化させてc(k)の値を求めたいのですが、うまくいきません。どこかおかしい点がありましたら、ご指摘お願いします。 Sub gojisiki() Dim i, j, x, y As Long Dim a(10), b(10), c(10), d(10), e(10), f(10), g(10) As Long For j = 1 To 6 a(6 - j) = Cells(2, j) Next For x = -500 To 500 b(1) = x For y = -500 To 500 b(0) = y For j = 5 To 2 Step -1 c(j - 2) = a(j) For k = 1 To 0 Step -1 d(k) = c(j - 2) * b(k) a(j - 2 + k) = a(j - 2 + k) - d(k) Next Next If a(1) = 0 And a(0) = 0 Then GoTo tugi Next Next tugi: For j = 5 To 2 Step -1 Cells(3, 6 - j) = c(j - 2) Next Cells(4, 1) = b(1) Cells(4, 2) = b(0) End Sub

  • VBAで行列を作る方法

    次のようなプログラミングで1,0,-1の要素で作られる3×3行列を全通り調べています。 この場合3の9乗通り調べることができます。 これを4×4や5×5行列など数を大きくして調べたいのですが、このプログラムを配列を使うなどして 簡単にできる方法を教えてください。 よろしくおねがいします。 Sub test() Dim a As Integer '行 Dim b As Integer '列 Dim c As Integer, i As Integer, j As Integer, d As Integer, e As Integer Dim 内積 As Integer, step As Integer Dim f As Integer, g As Integer, h As Integer, l As Integer, m As Integer, n As Integer, k As Integer, x As Integer Dim sum As Integer, total As Integer Dim aa As Integer, aaa As Integer, aaaa As Integer, bb As Integer, bbb As Integer, bbbb As Integer a = 3 '行 b = 3 '列 c = 0 内積 = 0 con = 0 sum = 0 tatal = 0 aa = 0 aaa = 0 aaaa = 0 bb = 0 bbb = 0 bbbb = 0 x = 0 For n = 0 To 2 For m = 0 To 2 For l = 0 To 2 For k = 0 To 2 For h = 0 To 2 For g = 0 To 2 For f = 0 To 2 For e = 0 To 2 For d = 0 To 2 '要素がすべて1 For i = 1 To a For j = 1 To b Cells(i, j) = 1 Next j Next i If bbbb = 1 Then Cells(a - 2, b - 2) = 0 ElseIf bbbb = 2 Then Cells(a - 2, b - 2) = -1 End If If bbb = 1 Then Cells(a - 1, b - 2) = 0 ElseIf bbb = 2 Then Cells(a - 1, b - 2) = -1 End If If bb = 1 Then Cells(a, b - 2) = 0 ElseIf bb = 2 Then Cells(a, b - 2) = -1 End If If aaaa = 1 Then Cells(a - 2, b - 1) = 0 ElseIf aaaa = 2 Then Cells(a - 2, b - 1) = -1 End If If aaa = 1 Then Cells(a - 1, b - 1) = 0 ElseIf aaa = 2 Then Cells(a - 1, b - 1) = -1 End If If aa = 1 Then Cells(a, b - 1) = 0 ElseIf aa = 2 Then Cells(a, b - 1) = -1 End If If total = 1 Then Cells(a - 2, b) = 0 ElseIf total = 2 Then Cells(a - 2, b) = -1 End If If sum = 1 Then Cells(a - 1, b) = 0 ElseIf sum = 2 Then Cells(a - 1, b) = -1 End If If con = 1 Then Cells(a, b) = 0 ElseIf con = 2 Then Cells(a, b) = -1 End If con = con + 1 Next d con = 0 sum = sum + 1 Next e sum = 0 total = total + 1 Next f total = 0 aa = aa + 1 Next g aa= 0 aaa = aaa + 1 Next h aaa = 0 aaaa = aaaa + 1 Next k aaaa = 0 bb = bb + 1 Next l bb = 0 bbb = bbb + 1 Next m bbb = 0 bbbb = bbbb + 1 Next n End Sub

  • エクセルで表を展開するマクロを作りたい

    こんにちは。 エクセルで表を展開したいのですがマクロが作れません。 どなたか詳しい方教えて下さい。     A   B   C  D 1  1,2,3  abc  def  ghi を    A   B   C  D 1  1 abc  def  ghi 2   2  abc  def  ghi 3  3  abc  def  ghi というように展開したいです。 10列目くらいまで対応したマクロが作りたいです。 Sub test() 'この行から Dim i, j, k As Long Dim myArray As Variant For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If Not Cells(i, 1) Like "*" & "," & "*" Then i = i - 1 myArray = Split(Cells(i, 1), ",") k = UBound(myArray) Rows(i + 1 & ":" & i + k).Insert For j = 0 To k Cells(i + j, 1) = myArray(j) Next j Next i For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 2) = "" Then Cells(i, 2) = Cells(i - 1, 2) End If Next i Columns("A:B").AutoFit End Sub 'この行まで これにどう付け足せばいいでしょうか? どうかご教授お願い致します。

専門家に質問してみよう