Excel VBA扫雷艇:检查边界单元格中的地雷数量?

Excel VBA扫雷艇:检查边界单元格中的地雷数量?,excel,vba,minesweeper,Excel,Vba,Minesweeper,我在VBA中没有找到太多关于这个问题的答案,但我正在制作一个扫雷舰5x5板,并试图让一个地雷周围的单元格显示有多少地雷接触到它。我能使中间的9起作用(带“X”的空格): 但是我很难让边缘细胞也计数。这是我的密码: For i = 2 To 4 For j = 2 To 4 If BombArray(i, j) <> "X" Then BombArray(i, j) = 0 If BombArray(i +

我在VBA中没有找到太多关于这个问题的答案,但我正在制作一个扫雷舰5x5板,并试图让一个地雷周围的单元格显示有多少地雷接触到它。我能使中间的9起作用(带“X”的空格):

但是我很难让边缘细胞也计数。这是我的密码:

For i = 2 To 4
    For j = 2 To 4
        If BombArray(i, j) <> "X" Then
            BombArray(i, j) = 0
                If BombArray(i + 1, j - 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i + 1, j) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i + 1, j + 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i, j - 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i, j + 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i - 1, j - 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i - 1, j) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
                If BombArray(i - 1, j + 1) = "X" Then
                    BombArray(i, j) = BombArray(i, j) + 1
                End If
        End If
    Next j
Next i
i=2到4的

对于j=2到4
如果数组(i,j)“X”,那么
BombArray(i,j)=0
如果BombArray(i+1,j-1)=“X”,那么
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i+1,j)=“X”,则
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i+1,j+1)=“X”,则
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i,j-1)=“X”,那么
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i,j+1)=“X”,则
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i-1,j-1)=“X”,那么
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i-1,j)=“X”,那么
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果BombArray(i-1,j+1)=“X”,则
BombArray(i,j)=BombArray(i,j)+1
如果结束
如果结束
下一个j
接下来我
我将索引设置为2到4,因为否则Excel会抛出错误“9”:下标超出范围


任何帮助都将不胜感激。

在测试单元之前,测试以查看您是否在边界上:

For i = 1 To 5
    For j = 1 To 5
        If BombArray(i, j) <> "X" Then
            BombArray(i, j) = 0
                If j <> 1 And i <> 5 Then
                    If BombArray(i + 1, j - 1) = "X" Then BombArray(i, j) = BombArray(i, j) + 1
                End If
                If i <> 5 Then
                    If BombArray(i + 1, j) = "X" Then BombArray(i, j) = BombArray(i, j) + 1
                End If
                'Etc.
                '...
        End If
    Next j
Next i
i=1到5的

对于j=1到5
如果数组(i,j)“X”,那么
BombArray(i,j)=0
如果j1和i5那么
如果BombArray(i+1,j-1)=“X”,则BombArray(i,j)=BombArray(i,j)+1
如果结束
如果我5岁
如果BombArray(i+1,j)=“X”,则BombArray(i,j)=BombArray(i,j)+1
如果结束
等等。
'...
如果结束
下一个j
接下来我

不需要为当前单元格周围的每个单元格设置数组或偏移量。 只需为扫雷舰创建一个大范围,并创建一个小范围(3 x 3)来计算周围的炸弹。在循环中执行其余操作

请参阅下面的代码,注释中解释了所有内容。请随意更改中心单元格地址和扫雷舰范围,以获得更大的扫雷舰游戏

Sub myminesweeper()
Dim rng As Range, r2 As Range, c1 As Range, c2 As Range, center_cell As Range, irng As Range
Dim cnt As Integer
Set center_cell = Range("E7") 'set center cell of minesweeper range
Set rng = Range(center_cell.Offset(-3, -3), center_cell.Offset(3, 3)) 'set minesweeper range
                                                                      '(simply change the offset numbers)
                                                                      'currently it is 7 x 7
For Each c1 In rng 'loop through cells in minesweeper range
    cnt = 0 'reset the counter
    If c1.Value = "X" Then GoTo Skip 'skip calculation if there is mine
    Set r2 = Range(c1.Offset(-1, -1), c1.Offset(1, 1)) 'set 3 x 3 range to check mines
    For Each c2 In r2 'loop through cells in 3 x 3 range
        Set irng = Application.Intersect(c2, rng) 'check if the cell is within minesweeper range
        If Not irng Is Nothing Then 'if the cell is in range
            If c2.Value = "X" Then cnt = cnt + 1 'check if there is a mine. if so, add 1 to cnt.
        End If
    Next c2
    c1.Value = cnt 'set the cell's value to total count of mines around it (cnt)
Skip:
Next
End Sub
Sub myminesweeper()
Dim rng As Range, r2 As Range, c1 As Range, c2 As Range, center_cell As Range, irng As Range
Dim cnt As Integer
Set center_cell = Range("E7") 'set center cell of minesweeper range
Set rng = Range(center_cell.Offset(-3, -3), center_cell.Offset(3, 3)) 'set minesweeper range
                                                                      '(simply change the offset numbers)
                                                                      'currently it is 7 x 7
For Each c1 In rng 'loop through cells in minesweeper range
    cnt = 0 'reset the counter
    If c1.Value = "X" Then GoTo Skip 'skip calculation if there is mine
    Set r2 = Range(c1.Offset(-1, -1), c1.Offset(1, 1)) 'set 3 x 3 range to check mines
    For Each c2 In r2 'loop through cells in 3 x 3 range
        Set irng = Application.Intersect(c2, rng) 'check if the cell is within minesweeper range
        If Not irng Is Nothing Then 'if the cell is in range
            If c2.Value = "X" Then cnt = cnt + 1 'check if there is a mine. if so, add 1 to cnt.
        End If
    Next c2
    c1.Value = cnt 'set the cell's value to total count of mines around it (cnt)
Skip:
Next
End Sub