プロが教えるわが家の防犯対策術!

もう、なにがなんやらで・・・
このマクロの繰り返しを入れ子で出来ないでしょうか?

加算しながら増やしていくので、わけわからなくなりそうです。

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

A 回答 (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
    • good
    • 0

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