Domanda

Io so solo poco come fare macro in Excel.

È stato utile?

Soluzione

dovuto farlo molto tempo fa, ma ecco la mia versione della vita di Conway in Excel.

Ecco un hack del codice. In nessun caso una soluzione perfetta (non spendere un epoca su questo), ma si potrebbe essere in grado di raccogliere alcuni pezzi fuori.

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

Per ottenere questo a lavorare solo fare lo sfondo della cella A1 nero, lo sfondo della cella B1 bianco e quindi aggiungere alcuni sfondi neri nella gamma C2:. AM20 ed eseguire il metodo ActionLogic

Altri suggerimenti

Si possono trovare molti esempi tramite Google.

Il primo risultato è un post dal blog di David Gainer che utilizza Gioco della vita per insegnare formule di riferimento circolare e iterazione (senza VBA coinvolti):

http://blogs.office.com / 2007/11/02 / iterazione Conways-gioco-di-vita

Avrete bisogno di due macro. Il primo dovrebbe formattare la scheda di gioco in modo che le cellule sono quadrati.

Avere l'utente esegue questa macro. Dopo di che avrebbe dovuto entrare in un 1 per ogni cella che è vivo. Utilizzare la formattazione condizionale per trasformare la cellula completamente nero (sfondo nero = se il valore! = 0)

Ora hanno una seconda macro che calcola il passo successivo in un foglio di sfondo (un altro foglio). Utilizzare il posizionamento relativo delle cellule (rispetto al ActiveCell) e due cicli annidati. Quando questo è fatto, copiare tutti i valori dal foglio di fondo al foglio di gioco.

Cerca e guardare il loro codice. Un sacco di persone hanno reso un hobby per fare giochi completi in Excel.

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

Perché dici Excel è la scelta sbagliata?

Credo che Excel è il modo migliore per risolvere questo:

Excel risolve questo con 1 riga: IF (OR (SUM (B2: D4) C3 = 3, E (SUM (B2: D4) C3 = 2, C3 = 1)), 1,0)

* dove quanto sopra è un'espressione che restituisce il valore di nuova generazione per la cella C3.

Ecco la demo: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM

Se vi trovate in una situazione in cui è necessario implementare questo genere di cose da zero, quindi la programmazione funzionale è il modo migliore per andare. In caso contrario, Excel funziona davvero bene. Perché? Poiché Excel è un sistema che ti costringe a immettere funzioni solo puri. Vedete, la chiave per la simulazione di questo gioco della vita è quello di rendersi conto che ogni stato delle cellule è una pura funzione dello stato precedente. Excel costringe naturalmente a pensare in questo modo.

un altro tutorial su riferimenti circolari in Excel può essere trovato qui: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/

questo spiega come è possibile inserire timestamp usando i riferimenti circolari.

Excel è sicuramente la scelta sbagliata per questo tipo di problema. Quanto a come sarebbe possibile: in primo luogo conoscere la della vita e poi < a href = "http://en.wikipedia.org/wiki/Visual_Basic" rel = "nofollow noreferrer"> visual basic da utilizzare in Excel.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top