如何修复 VBA Find 方法的“下标超出范围”错误?

Vic*_*ria 2 excel vba

我的代码的第一部分应该找到工作表中的最后一个活动行 - 我的数据集由可能返回空白的公式组成,所以我想使用“查找”方法。工作表“WS1 投标数据”存在,但是当我尝试运行代码时出现“下标超出范围”错误。

我知道有很多与此类似的问题,但我一直找不到可行的解决方案。有没有人有想法?

    start_row = Worksheets("Import").Range("B23").Value
    start_col = Worksheets("Import").Range("B24").Value
    start_ref = Worksheets("Import").Range("B19").Value
    With Worksheets("WS1 Bid Data")
        end_row = Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      LookAt:=x1Part, _
                      LookIn:=x1Formulas, _
                      SearchOrder:=x1ByRows, _
                      SearchDirection:=x1Previous, _
                      MatchCase:=False).Row
    End With
Run Code Online (Sandbox Code Playgroud)

Par*_*ait 5

正如评论所示,请考虑 Excel VBA 中的一些最佳实践:

  1. 使用Option Explicit在每片或模块运行VBA。对于未声明的变量,这将引发编译错误,因此应在 Excel 常量中捕获 1 的拼写错误(即x1Partvs. xlPart)。

    事实上,现在在 VBA IDE 中将此规则设置为全局选项:工具 > 选项 > 编辑器 > 选中“需要变量声明”。

  2. 始终明确地将对象限定为它们的父母。永远不要依赖光标或屏幕的激活位置来调整工作簿或工作表上下文并影响代码。并始终避免Select.Activate

    具体来说,在您的对象上使用ThisWorkbook.(或通过 分配工作簿Set wb = ...Worksheet

  3. With...End块内充分使用句点限定符。同样,这可以避免误解您的代码在其中运行的上下文,因为您的Cells无句点参考假定活动工作表。这可能不一定与With块的工作表相同。

执行上述操作,您的代码应该更加稳定和可维护:

Option Explicit

Public Sub myMacro()
    ...
    With ThisWorkbook.Worksheets("Import")                    ' USE ThisWorkbook.
       start_row = .Range("B23").Value
       start_col = .Range("B24").Value
       start_ref = .Range("B19").Value
    End With

    With ThisWorkbook.Worksheets("WS1 Bid Data")              ' USE ThisWorkbook.
        end_row = .Cells.Find(What:="*", _                    ' USE .Cells
                              After:=.Range("A1"), _
                              LookAt:=xlPart, _               ' VERIFY WITH Option Explicit
                              LookIn:=xlFormulas, _           ' SAME AS ABOVE
                              SearchOrder:=xlByRows, _        ' SAME AS ABOVE
                              SearchDirection:=xlPrevious, _  ' SAME AS ABOVE
                              MatchCase:=False).Row
    End With
    ...
End Sub
Run Code Online (Sandbox Code Playgroud)

  • `x1` 再次袭击......天啊。 (2认同)