何かが、おそらく最もエレガントではないが、中央のセルとして供給された範囲の引数を使用して、範囲を生成します。さらに先端を見てされるだろう-1 1つのループにコードを減らすために...
私は? CHECK_ADJACENTS(range("i5")).Address
を使用してチェックし、その結果$I$5,$J$4,$H$6
Function CHECK_ADJACENTS(rngInput As Excel.Range) As Excel.Range
Dim lngCurrent As Long
lngCurrent = rngInput.Interior.ColorIndex
Set CHECK_ADJACENTS = rngInput
On Error Resume Next
If rngInput.Offset(-1, -1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(-1, -1))
End If
If rngInput.Offset(-1, 0).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(-1, 0))
End If
If rngInput.Offset(-1, 1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(-1, 1))
End If
If rngInput.Offset(0, -1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(0, -1))
End If
If rngInput.Offset(0, 1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(0, 1))
End If
If rngInput.Offset(1, -1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(1, -1))
End If
If rngInput.Offset(1, 0).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(1, 0))
End If
If rngInput.Offset(1, 1).Interior.ColorIndex = lngCurrent Then
Set CHECK_ADJACENTS = Union(CHECK_ADJACENTS, rngInput.Offset(1, 1))
End If
CHECK_ADJACENTS.Select
End Function
を試してみましたオフセットを使う必要があると思ったので、もしr.color = trueならば、r.offset(-1,0).color、r.offset(1,0).color等で周囲を8どういうわけか9枚のセルブロックでシートを扱うのでしょうか? –
オフセットは機能しますが、それよりも複雑です。私はあなたが見ている細胞の領域に一致する2D配列を作成し、各配列 "セル"にフラグを立てるならば、デジタイザー/カウンターでフラグを立てます。そうすることで、「L」字型の領域や隣接する2つ以上のセルがある場合、隣接性をより簡単に識別できます。しかし、私はおそらく私の推測は誰かが既にこの問題をプログラム的に解決している(しかし、おそらくVBAではセルではない)ので、インターウェブ上でこのアルゴリズムを探すだろう。 – PeterT