Вопрос

Я мало знаю, как создавать макросы в Excel.

Это было полезно?

Решение

Надо было сделать это давным-давно, но вот моя версия «Жизни Конвея» в Excel.

Вот хак кода.Ни в коем случае не идеальное решение (не тратил на это много времени), но вы, возможно, сможете выделить некоторые кусочки.

Private arrGrid(100, 100) As Boolean
Private arrGridNextGeneration(100, 100) As Boolean

Private Sub PopulateParentArrayData()

For k = 1 To Sheet1.Range("C2:AM20").Cells.Count

If Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color Then

    arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) = True
Else
    arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) = False
End If
DoEvents
Next
End Sub

Private Sub ApplyParentArrayData()

For k = 1 To Sheet1.Range("C2:AM20").Cells.Count

If arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) Then

    Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color
Else
    Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("B1").Interior.Color
End If
    DoEvents
Next

End Sub

Private Sub ApplyNextGenerationArrayData()

For k = 1 To Sheet1.Range("C2:AM20").Cells.Count

    If arrGridNextGeneration(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) Then

        Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color
    Else
        Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("B1").Interior.Color
    End If
    DoEvents
Next

End Sub

Private Function GetNeighbourCount(ByVal pintRow As Integer, ByVal pintColumn As Integer) As Integer

Dim intCount As Integer

intCount = 0

For r = pintRow - 1 To pintRow + 1

For c = pintColumn - 1 To pintColumn + 1

If r <> pintRow Or c <> pintColumn Then
If arrGrid(r, c) Then

    intCount = intCount + 1
End If
End If
Next c
Next r

GetNeighbourCount = intCount

End Function

Private Sub PopulateNextGenerationArray()

Dim intNeighbours As Integer

For r = 0 To 100
For c = 0 To 100

If r > Sheet1.Range("C2:AM20").Rows(0).Row Then
If r <= Sheet1.Range("C2:AM20").Rows(Sheet1.Range("C2:AM20").Rows.Count).Row Then
If c > Sheet1.Range("C2:AM20").Columns(0).Column Then
If c <= Sheet1.Range("C2:AM20").Columns(Sheet1.Range("C2:AM20").Columns.Count).Column Then



 intNeighbours = GetNeighbourCount(r, c)
If arrGrid(r, c) Then
    'A1 cell
    If intNeighbours < 2 Or intNeighbours > 3 Then
        arrGridNextGeneration(r, c) = False
    Else
        arrGridNextGeneration(r, c) = True
    End If

Else
    'B1 cell
    If intNeighbours = 3 Then
        arrGridNextGeneration(r, c) = True
    Else
        arrGridNextGeneration(r, c) = False
    End If
End If
End If
End If
End If
End If
DoEvents
Next c
Next r

End Sub

Private Sub ActionLogic()


'Application.ScreenUpdating = False

PopulateParentArrayData
PopulateNextGenerationArray
ApplyNextGenerationArrayData

'Application.ScreenUpdating = True
End Sub

Чтобы это заработало, просто сделайте фон ячейки A1 черным, фон ячейки B1 белым, а затем добавьте несколько черных фонов в диапазоне C2:AM20 и запустите метод ActionLogic.

Другие советы

Вы можете найти множество примеров через Google.

Самый первый результат — это сообщение из блога Дэвида Гейнера, в котором «Игра жизни» Конвея используется для обучения формулам циклических ссылок и итерациям (без использования VBA):

http://blogs.office.com/2007/11/02/iteration-conways-game-of-life

Вам понадобятся два макроса.Первый должен отформатировать игровой лист так, чтобы ячейки были квадратными.

Попросите пользователя запустить этот макрос.После этого она должна ввести 1 для каждой живой ячейки.Используйте условное форматирование, чтобы сделать ячейку полностью черной (фон = черный, если значение! = 0).

Теперь у вас есть второй макрос, который рассчитывает следующий шаг на фоновом листе (другом листе).Используйте относительное позиционирование ячеек (относительно ActiveCell) и два вложенных цикла.Когда это будет сделано, скопируйте все значения с фонового листа на игровой лист.

Найдите его и посмотрите их код.Многие люди сделали своим хобби создание полноценных игр в Excel.

Бывший: http://www.geocities.jp/nchikada/pac/

Почему вы говорите, что Excel — неправильный выбор?

Я думаю, что Excel - лучший способ решить эту проблему:

Excel решает эту проблему с помощью одной строки:ЕСЛИ(ИЛИ(СУММА(B2:D4)-C3=3,И(СУММА(B2:D4)-C3=2,C3=1)),1,0)

*где приведенное выше выражение возвращает значение следующего поколения для ячейки C3.

Вот демо:https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM

Если вы находитесь в ситуации, когда вам приходится реализовывать подобные вещи с нуля, то функциональное программирование — лучший способ.В остальном Excel работает очень хорошо.Почему?Потому что Excel — это система, которая заставляет вводить только чистые функции.Видите ли, ключом к моделированию этой Игры Жизни является осознание того, что каждое состояние клеток является ЧИСТОЙ ФУНКЦИЕЙ предыдущего состояния.Excel естественным образом заставляет вас так думать.

Еще одно руководство по циклическим ссылкам в Excel можно найти здесь: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/

здесь объясняется, как можно вставлять временные метки с помощью циклических ссылок.

Excel определенно неправильный выбор для такого рода проблем.О том, как это возможно:Сначала узнайте о игра жизни а потом Visual Basic использовать в Excel.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top