下図は中央のセル(赤枠)での次のステップを示しています。
左端では次のステップで中央に新しく誕生、右端は過密で死滅します。
セルの色
は条件付き書式で設定
「サンプル配置」のリストボックスから選択するだけで転記され、初期値として使用できます。
#If Win64 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If Dim 中止 As Boolean '「中止」フラグ Dim Cnt As Integer '世代数
Private Sub cmdClear_Click() ' ' クリア ' Range("CURRENT").ClearContents Range("世代") = "" Range("世代").Select Cnt = 0 End Sub
Private Sub cmdStep_Click() ' ' ステップ実行 ' Range("CURRENT").Value = Sheets("次世代").Range("NEXT").Value '次世代を現世代にコピー Cnt = Cnt + 1 '世代数カウントアップ Range("世代") = Cnt '表示 End Sub
Private Sub cmdGo_Click() ' ' ライフゲーム開始 ' cmdGo.Enabled = False '連続実行ボタン無効 cmdStop.Enabled = True '中止ボタン有効 Cnt = 0 中止 = False Do Range("CURRENT").Value = Sheets("次世代").Range("NEXT").Value '次世代を現世代にコピー Cnt = Cnt + 1 '世代数カウントアップ Range("世代") = Cnt '表示 MyWait Range("速度") '周期 Loop While (Not 中止) cmdGo.Enabled = True 'ボタン有効 cmdStop.Enabled = False End Sub Private Sub MyWait(ByVal t As Long) ' ' 指定ミリ秒待機 ' Const TT = 10 Do While (Not 中止) DoEvents t = t - TT If t <= 0 Then Exit Do Sleep TT Loop End Sub Private Sub cmdStop_Click() 中止 = True End Sub
Private Sub lstSample_Click() ' ' サンプル配置 ' If ActiveSheet.Name <> "現世代" Then Exit Sub Dim RangeName As String RangeName = "Sample_" & lstSample.Text If Not IsRangeName(RangeName) Then Exit Sub cmdClear_Click Application.ScreenUpdating = False Sheets("サンプル").Range(RangeName).Copy Range("RESULT").Range("O20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("世代").Select Application.ScreenUpdating = True End Sub Private Sub cmdRand_Click() ' ' ランダム配置 ' Dim tmp As Range Dim r As Single Application.Calculation = xlCalculationManual r = Val(Range("RATIO")) For Each tmp In Range("RESULT") If Rnd < r Then tmp.Value = 1 Else tmp.Value = 0 End If Next Application.Calculation = xlCalculationAutomatic cmdGo.Enabled = True cmdStop.Enabled = False End Sub '--------------------------------------------------------- ' 内部関数 '--------------------------------------------------------- Private Function IsRangeName(strName As String) As Boolean ' ' 有効な範囲名かをチェック ' Dim nm As Name IsRangeName = False For Each nm In Application.Names If strName = nm.Name Then IsRangeName = True Exit For End If Next End Function