- ベストアンサー
エクセル2010のvbaについて
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
おもしろそうなので作ってみました。昔あったサメガメ(Same Game風パズル?) 添付図(Sheet1)でいえば、セル範囲B2:H8に「TABLE」の範囲名を付けて、コマンドボタンを1つ配置しています。 コードを見れば分かると思いますが、このボタンで問題図を自動作成しています。 またセル範囲B2:H8には、条件付き書式で、セルの値が1、2、3のとき、1=黄、2=赤、3=青で塗っています。 >クリックしてからもう一回クリックするとそのブロックが消え この操作がよくわからないので、消したいブロック内のセルでダブルクリックすると消えるようにしてみました。 ボタンで問題図の作成→ダブルクリックで消す の順で遊びます。 >ブロックの判定が難しくてどうコードを書けばいいのか分かりません 判定というより、ダブルクリックしたセルと同じ値のセルを上下左右と調べ「9」を書き込んでいます。行き止まりがあると、再起の仕組みで枝分かれした個所から再度調べてくれます。逐次上下左右をコーディングするとそれは大変でしょう。何となく機械に任せてる感覚?でしょうか。 ’Sheet1のコードウィンドウ Option Explicit Dim TBL As Variant 'テーブル Dim r As Integer '行カウンタ Dim c As Integer '列カウンタ Const rMax = 7 '最大行数 Const cMax = 7 '最大列数 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Count = 1 Then If Application.Intersect(Range("TABLE"), Target) Is Nothing Then Exit Sub End If Else Exit Sub End If Dim r0 As Integer 'ダブルクリックした行 Dim c0 As Integer 'ダブルクリックした列 Dim num As Integer 'ダブルクリックしたセルの値 r0 = Target.Row - 1 c0 = Target.Column - 1 num = Target.Value Call paint(num, r0, c0) '// ブロックを「9」にする Call BlockClear '// ブロックを消す End Sub '// ブロックを「9」にする Sub paint(n As Integer, rr As Integer, cc As Integer) If TBL(rr, cc) = n Then TBL(rr, cc) = 9 '同じ値なら「9」=ブロック Else Exit Sub End If '// 再帰 If cc < cMax Then Call paint(n, rr, cc + 1) '右 If rr < rMax Then Call paint(n, rr + 1, cc) '下 If 1 < cc Then Call paint(n, rr, cc - 1) '左 If 1 < rr Then Call paint(n, rr - 1, cc) '上 End Sub '// ブロックを消す Sub BlockClear() Dim rg As Range 'セル Dim d As Integer '消去行カウンタ For c = 1 To cMax For r = 1 To rMax If TBL(r, c) = 9 Then For d = r To 2 Step -1 TBL(d, c) = TBL(d - 1, c) Next TBL(1, c) = "" End If Next Next End Sub '// テーブルを作る Private Sub CommandButton1_Click() Dim rg As Range 'セル Set TBL = Range("TABLE") For Each rg In TBL rg = Int(Rnd() * 3 + 1) Next End Sub
その他の回答 (1)
- nishi6
- ベストアンサー率67% (869/1280)
読み直してみると、一番大事な個所に誤字がありました。 >ブロックの判定が難しくてどうコードを書けばいいのか分かりません 判定というより、・・。行き止まりがあると、再起の仕組み・・・ ↓ 判定というより、・・。行き止まりがあると、再帰の仕組み・・・ 再起→再帰です。失礼しました。
お礼
ありがとうございました 解決しました まだまだ勉強不足なのでもっと頑張ります