基本的Excel VB脚本

我是新来的Visual Basic,有一些麻烦。 我收到错误,

对象variables或未设置块variables

For Each r In Sheet1.Cells.CurrentRegion.Find(s)它看起来像我没有正确设置指针,但我不知道如何做到这一点。 我相信还有一些其他的错误,所以任何想法或评论最受欢迎。

代码是在工作表的某个地方find一个特定的string,并计算该行的总开票金额的百分比。 有一个检查,以确保该行不是同一发票的一部分,在这种情况下使用相同的总额。

 Public charges(2) As String Public r As Range Public s As Variant Public difference As Integer Sub Script() Range("M1").Value = "Apportioned Rate" charges(0) = "Standard Rebuild Valuation" charges(1) = "billable charge" For Each s In charges For Each r In Sheet1.Cells.CurrentRegion.Find(s) //where exception occurs Select Case r.Offset(0, -4).Value Case Is <> r.Offset(-1, -4).Value Calculate difference = 0, r Case Is = r.Offset(-10, -4).Value Calculate difference = -10, r Case Is = r.Offset(-9, -4).Value Calculate difference = -9, r Case Is = r.Offset(-8, -4).Value Calculate difference = -8, r Case Is = r.Offset(-7, -4).Value Calculate difference = -7, r Case Is = r.Offset(-6, -4).Value Calculate difference = -6, r Case Is = r.Offset(-5, -4).Value Calculate difference = -5, r Case Is = r.Offset(-4, -4).Value Calculate difference = -4, r Case Is = r.Offset(-3, -4).Value Calculate difference = -3, r Case Is = r.Offset(-2, -4).Value Calculate difference = -2, r Case Is = r.Offset(-1, -4).Value Calculate difference = -1, r End Select Next r Next s End Sub Public Function Calculate(ByVal difference As Integer, r As Range) As Variant Select Case r.Value Case Is = charges(0) r.Offset(difference, 6).Value = r.Offset(difference, 5).Value * 0.5 Case Is = charges(1) r.Offset(difference, 6).Value = r.Offset(difference, 5).Value * 0.25 End Select End Function 

我可以看到有两个可能的错误原因。

  1. Sheet1.Cells.CurrentRegion实际上并不select您想要search的区域
  2. 你不能遍历Nothing ,这是.Find()函数返回,如果没有find任何东西。

检查这个顺序,看看问题在哪里。

编辑:你应该先testing一下,如果它发现任何东西,像这样:

 Dim rng as Range set rng = Sheet1.Cells.CurrentRegion.Find(s) If rng is nothing then ' "nothing" handling Else ' your main search code End if 

另外,Ron Rosenfeld和其他人在评论中说,.Find()只返回第一个结果,而你需要通过.FindNext()来遍历另一个结果。

Sheet1.Cells.CurrentRegion不select您期望的区域的原因是CurrentRegionselect由空白行和空白列任意组合的范围。

所以基本上,Sheet1.Cellsselect表单中所有单元格的范围,活动单元格为A1。 现在,如果列B是空白,行2也是空白,那么你最终select范围(“A1”)。

您可以使用快捷键Ctrl + *来testingExcel中CurrentRegion的行为。

你的代码工作,如果你跳过CurrentRegion,即:

 For Each r In Sheet1.Cells.Find(s)