Excelでマクロを作成する方法はほとんどわかりません。
7 に答える
Google で多くの例を見つけることができます。
一番最初の結果は、David Gainer のブログからの投稿で、Conway の Game of Life を使用して循環参照式と反復について教えています (VBA は関係ありません)。
http://blogs.office.com/2007/11/02/iteration-conways-game-of-life
これはずっと前に行うべきだったのですが、これが私のバージョンのコンウェイの人生の 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 メソッドを実行します。
2つのマクロが必要になります。最初のものは、セルが正方形になるようにゲームシートをフォーマットする必要があります。
ユーザーにこのマクロを実行してもらいます。その後、彼女は生きているセルごとに1を入力する必要があります。条件付き書式を使用して、セルを完全に黒にします(値!= 0の場合は背景=黒)
次に、バックグラウンドシート(別のシート)の次のステップを計算する2番目のマクロがあります。相対セル配置(ActiveCellに対して相対)と2つのネストされたループを使用します。これが完了したら、すべての値をバックグラウンドシートからゲームシートにコピーします。
Excel が間違った選択であると言うのはなぜですか?
これを解決するには、Excel が最適な方法だと思います。
Excel はこれを 1 行で解決します: IF(OR(SUM(B2:D4)-C3=3,AND(SUM(B2:D4)-C3=2,C3=1)),1,0)
*上記は、セル C3 の次世代値を返す式です。
デモは次のとおりです: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM
この種のものをゼロから実装しなければならない状況にある場合は、関数型プログラミングが最善の方法です。それ以外の場合、Excel は非常にうまく機能します。なんで?Excelは、純粋な関数のみを入力することを強制するシステムだからです。おわかりのように、このライフ ゲームをシミュレートする鍵は、細胞の各状態が前の状態の純粋な機能であることを理解することです。Excel では、当然、このように考える必要があります。
それを検索して、コードを見てください。多くの人が Excel で完全なゲームを作成することを趣味にしています。
例: http: //www.geocities.jp/nichikada/pac/
Excel での循環参照に関する別のチュートリアルがここにあります: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/
これは、循環参照を使用してタイムスタンプを挿入する方法を説明しています。
この種の問題に対して Excel を選択するのは間違いなく間違っています。それがどのように可能になるかについては、まずライフ ゲームについて学び、次にExcel で使用するビジュアル ベーシックについて学びます。