سؤال

وأنا أعرف فقط قليلا كيفية جعل وحدات الماكرو في 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

نصائح أخرى

ويمكنك العثور على العديد من الأمثلة من خلال جوجل.

وكانت النتيجة الأولى هي وظيفة من بلوق ديفيد الرابح أن يستخدم لعبة كونواي للحياة لتعليم حول الصيغ مرجع دائري والتكرار (لا VBA المشاركة):

http://blogs.office.com / 2007/11/02 / التكرار-كونواي لعبة-من-الحياة

وسوف تحتاج اثنين من وحدات الماكرو. أول واحد يجب تنسيق ورقة اللعبة حتى الخلايا هي مربع.

هل لديك للمستخدم تشغيل هذا الماكرو. بعد ذلك أنها ينبغي إدخال 1 لكل خلية التي هي على قيد الحياة. استخدام التنسيق الشرطي لتحويل الخلية سوداء تماما (الخلفية = أسود إذا كانت القيمة! = 0)

وديك الآن ماكرو الثاني الذي يحسب الخطوة التالية في ورقة الخلفية (ورقة أخرى). استخدام المواقع النسبي الخلية (نسبة إلى ActiveCell) واثنين من حلقات متداخلة. عندما يتم ذلك، نسخ كافة القيم من ورقة خلفية ورقة اللعبة.

والبحث عن ذلك والنظر في مدوناتها. الكثير من الناس جعلت من هواية لجعل الألعاب الكاملة في Excel.

مثال: http://www.geocities.jp/nchikada/pac/

وماذا تقول التفوق هو خيار خاطئ؟

وأعتقد أن التفوق هو أفضل طريقة لحل هذه:

واكسل يحل هذا مع 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 هو النظام الذي يجبرك على إدخال وظائف فقط نقية. ترى، والمفتاح لمحاكاة هذه لعبة الحياة هو أن ندرك أن كل دولة من الخلايا هي وظيفة بيور للدولة السابقة. تتفوق القوات بشكل طبيعي لك أن تفكر بهذه الطريقة.

وآخر تعليمي على المراجع الدائرية في التفوق ويمكن الاطلاع هنا: <لأ href = "http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/" يختلط = "نوفولو noreferrer "> http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/

وهذا واحد يشرح كيف يمكنك إدراج الطوابع الزمنية باستخدام مراجع دائرية.

والتفوق هو بالتأكيد خيار خاطئ لهذا النوع من مشكلة. أما كيف سيكون من الممكن: أولا التعرف على الحياة ثم < وأ href = "http://en.wikipedia.org/wiki/Visual_Basic" يختلط = "نوفولو noreferrer"> البصرية الأساسية للاستخدام في Excel.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top