我正在做的是在Excel中创建扫雷游戏。我的问题出现在试图计算给定小区的相邻小区中的地雷数量。我用“x”表示单元格中的一个矿井
这是我的代码:
Sub countMines(ByVal x As Integer, ByVal y As Integer)
Dim mineCount As Integer
mineCount = 0
If Cells(x, y) = "x" Then
'Do nothing if cell has mine
MsgBox "Cell contains x" & x & y
Else
If Cells(x -1, y) = "x" Then
MsgBox "Cell " & x & y & "has an x near it"
End If
End If
End Sub
如果一个单元格包含一个'x',那么第一个消息框就能正常工作,它可以正确地提醒我单元格的位置。
然而,第二个if If Cells(x -1, y) = "x" Then
会导致
运行时错误'1004': 应用程序定义或对象定义的错误
我可以在线找到关于此错误的负载,因为它是一个非常通用的消息,但似乎没有一个适用于我的情况。
这是我唯一一次使用VBA所以这很可能是一个非常简单的错误,可能是一个重复的问题,但我找不到答案。
答案 0 :(得分:1)
只是为了让这个问题可以标记为已回答,就像@Comintern说的那样,你必须检查以确保x
和y
不会降到零(或超出Excel的范围)最大范围)。
(我赞成他的评论,但因为他没有在这里张贴...... ::耸肩::)
如果您决定将其作为Minesweeper的 big 游戏,请检查以确保您不会超越单元格32,767
。
作为旁注,即使Run-time error '1004'
听起来很通用,但如果你指的是一个不存在(或无法识别)的对象,它通常只会弹出。
如果你正在“踩踏”代码,并注意到你在循环开始时遇到1004
错误,那么有95%你正在开始循环糟糕的指数点。您可以使用任何代码块获得相同类型的情况,例如您在此处使用if
语句。
答案 1 :(得分:1)
'Use following code to count all "x" in all neabouring cells
'except the host cell. But take care that minus operation does not cross excel boundaries
Function countMines(ByVal x As Integer, ByVal y As Integer)
Dim mineCount As Integer
mineCount = 0
For Each c In Range(Cells(x - 1, y - 1), Cells(x + 1, y + 1))
If c.Address <> Cells(x, y).Address Then
If c = "x" Then
mineCount = mineCount + 1
End If
End If
Next c
countMines = mineCount 'return value to calling function
MsgBox "Total mines in surrounding cells = " & mineCount
End Function
答案 2 :(得分:0)
你已经得到了关于你正在努力解决的错误的答案
这个回答只是为了投入你可能会考虑使用WorksheetFunction.CountIf()
方法计算所有&#34; x&#34;在围绕给定单元格的范围内出现,如下所示:
mineCount = WorksheetFunction.CountIf(Cells(x, y).Offset(-1, -1).Resize(3, 3), "x")
这也可以计算单元格本身,但是如果你把它放在If Cells(x, y) = "x" Then
False
分支中那么它就没有坏处
当然,偏移和调整大小必须定制不超过field
限制。所以上述陈述可能成为:
mineCount = WorksheetFunction.CountIf(Cells(x, y).Offset(-xOffset, -yOffset).Resize(xResize, yResize), "x")
您必须针对实际的小区位置(xOffset
,yOffset
)正确调整xResize
,yResize
,x
,y
和您的字段限制(nRows
,nColumns
),例如
xOffset = IIf(x = 1, 0, 1)
yOffset = IIf(y = 1, 0, 1)
xResize = IIf(x = nRows, 1, 2) + xOffset
yResize = IIf(y = nColumns, 1, 2) + yOffset