Pregunta

Sólo sé poco de cómo hacer que las macros en Excel.

¿Fue útil?

Solución

Debería haber hecho esto hace mucho tiempo pero aquí está mi versión de la vida de Conway en Excel.

Aquí hay un truco del código. De ninguna manera es una solución perfecta (no pasamos una edad en esto) pero es posible que sea capaz de recoger algunos bits a cabo.

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

Para conseguir que esto funcionará igual que el fondo de la celda A1 negro, el fondo de la celda B1 blanca y luego añadir algunos fondos negros del rango C2:. AM20 y ejecutar el método de lógica de acción

Otros consejos

Usted puede encontrar muchos ejemplos a través de Google.

El primer resultado es un post del blog de David Gainer que utiliza Juego de la vida para enseñar acerca de las fórmulas de referencia circular y iteración (sin VBA involucrados):

http://blogs.office.com / 2007/11/02 / iteración-Conways-juego-de-vida

Se necesitan dos macros. El primero debe formatear la hoja de juego por lo que las células son cuadrados.

Haga que el usuario ejecute esta macro. Después de que ella debe entrar en un 1 por cada célula que está vivo. Utilizar el formato condicional para activar la célula completamente negro (fondo negro si el valor =! = 0)

tienen ahora una segunda macro que calcula el siguiente paso en una hoja de fondo (otra hoja). Utilice posicionamiento relativo de células (en relación con ActiveCell) y dos bucles anidados. Cuando se hace esto, copiar todos los valores de la hoja de fondo a la hoja de juego.

Buscar y ver su código. Un montón de gente ha hecho que sea un hobby para hacer juegos completos en Excel.

Ejemplo: http://www.geocities.jp/nchikada/pac/

¿Por qué dice Excel es la decisión equivocada?

Creo Excel es la mejor manera de resolver esto:

Excel resuelve esto con 1 línea: IF (OR (SUM (B2: D4) C3 = 3, Y (SUM (B2: D4) C3 = 2, C3 = 1)), 1,0)

* donde el anterior es una expresión que devuelve el valor siguiente generación para la celda C3.

Aquí está la demostración: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM

Si estás en una situación en la que hay que poner en práctica este tipo de cosas a partir de cero, entonces la programación funcional es el mejor camino a seguir. De lo contrario, Excel funciona muy bien. ¿Por qué? Debido a que Excel es un sistema que te obliga a entrar en funciones sólo puros. Usted ve, la clave para la simulación de este juego de la vida es darse cuenta de que cada estado de las células es una pura función del estado anterior. Excel, naturalmente obliga a pensar de esta manera.

otro tutorial sobre referencias circulares en Excel se puede encontrar aquí: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/

éste se explica cómo se puede insertar marcas de tiempo usando las referencias circulares.

Excel es definitivamente la elección equivocada para este tipo de problema. En cuanto a cómo sería posible: En primer lugar aprender sobre la de vida y luego < a href = "http://en.wikipedia.org/wiki/Visual_Basic" rel = "nofollow noreferrer"> visual básica para usar en Excel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top