Question

Je sais que peu comment faire des macros dans Excel.

Était-ce utile?

La solution

aurait dû le faire depuis longtemps, mais voici ma version de la vie de Conway dans Excel.

Voici un hack du code. Pas une solution parfaite (n'a pas passé un âge à ce sujet), mais vous pourriez être en mesure de choisir quelques morceaux sur.

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

Pour que cela fonctionne juste faire l'arrière-plan noir cellule A1, l'arrière-plan blanc cellule B1, puis ajouter quelques arrière-plans noirs dans la gamme C2. AM20 et exécuter la méthode ActionLogic

Autres conseils

Vous pouvez trouver de nombreux exemples dans Google.

Le premier résultat est un post de blog de David Gainer qui utilise le jeu de la vie de Conway à enseigner sur les formules de référence circulaire et itération (pas VBA impliqué):

http://blogs.office.com / 2007/11/02 / itération-Conways-jeu-de-vie

Vous aurez besoin de deux macros. Le premier devrait formater la feuille de match pour que les cellules sont carrées.

Demandez à l'utilisateur d'exécuter cette macro. Après cela, elle doit entrer dans un 1 pour chaque cellule qui est vivant. Utilisez la mise en forme conditionnelle pour transformer la cellule complètement noir (fond noir = si la valeur! = 0)

maintenant avoir une deuxième macro qui calcule l'étape suivante dans une feuille de fond (une autre feuille). Utiliser le positionnement relatif de cellules (par rapport au ActiveCell) et deux boucles imbriquées. Lorsque cela est fait, copier toutes les valeurs de la feuille de fond à la feuille de jeu.

Rechercher et regarder leur code. Beaucoup de gens ont fait un passe-temps pour faire des jeux complets dans Excel.

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

Pourquoi dites-vous Excel est le mauvais choix?

Je pense que Excel est la meilleure façon de résoudre ceci:

Excel résout ce avec 1 ligne: IF (OR (SUM (B2: D4) C3 = 3, et (SUM (B2: D4) C3 = 2, C3 = 1)), 1,0)

* où ci-dessus est une expression qui renvoie la valeur de la prochaine génération de la cellule C3.

Voici la démo: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM

Si vous êtes dans une situation où vous devez mettre en œuvre ce genre de choses à partir de zéro, alors la programmation fonctionnelle est la meilleure façon d'aller. Sinon, Excel fonctionne très bien. Pourquoi? Parce que Excel est un système qui vous oblige à entrer uniquement des fonctions pures. Vous voyez, la clé pour simuler ce jeu de la vie est de se rendre compte que chaque état des cellules est une fonction PURE de l'état précédent. Excel oblige naturellement vous à penser de cette façon.

peut être trouvé un autre tutoriel sur les références circulaires dans Excel ici:

Excel est certainement le mauvais choix pour ce genre de problème. Quant à la façon dont il serait possible: d'abord apprendre davantage sur le de vie puis < a href = "http://en.wikipedia.org/wiki/Visual_Basic" rel = "nofollow noreferrer"> de base visuelle à utiliser dans Excel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top