Excel VBA检查相邻单元格内容

时间:2016-12-18 01:52:26

标签: excel vba excel-vba

我正在做的是在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所以这很可能是一个非常简单的错误,可能是一个重复的问题,但我找不到答案。

3 个答案:

答案 0 :(得分:1)

只是为了让这个问题可以标记为已回答,就像@Comintern说的那样,你必须检查以确保xy不会降到零(或超出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")

您必须针对实际的小区位置(xOffsetyOffset)正确调整xResizeyResizexy和您的字段限制(nRowsnColumns),例如

    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