Excel VBA扫雷艇:检查边界单元格中的地雷数量?
我在VBA中没有找到太多关于这个问题的答案,但我正在制作一个扫雷舰5x5板,并试图让一个地雷周围的单元格显示有多少地雷接触到它。我能使中间的9起作用(带“X”的空格): 但是我很难让边缘细胞也计数。这是我的密码: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 +
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