Excel VBA On Error错误

时间:2017-11-29 22:43:11

标签: excel-vba vba excel

我是编程新手,在学习Python的同时也开始尝试使用Excel VBA。我对最后一个有疑问。

我有一些大的Excel工作表,并试图验证特定列中的数据是否与某些列中另一个工作表上的数据匹配,因为它们应该通过这些值相互关联(并将通过第三个值连接)。为了使这更加困难,这两列都可能包含多个以“|”分隔的值。所以,我已经将这些值拆分成一个列表,我尝试迭代它们以确保所有这些值都设置正确,连接将正常工作。

只要一切都很好,一切都很好:)但是我有一个问题,其中一个列中有两个值而另一个中只有一个。我希望在工作表上注明这种差异,然后继续下一个项目。

似乎适用于我的方法是使用“On Error GoTo ErrHandler”,然后在另一个工作表上记下错误,然后用户继续继续。

以下是我提出的建议:

            For h = 0 To UBound(Split1())
                 For j = 1 To GetMaxRow("SpecificSheet", A)
                     On Error GoTo ErrHandler:
                        If Sheets("SpecificSheet").Cells(j, 1).Value = Split1(h) And Sheets("SpecificSheet").Cells(j, 2).Value = Split2(h) Then
                                DependencyOk = DependencyOk + 1
                        End If
                    Next j
            Next h
ErrProceed:

ErrHandler也是:

ErrHandler:
        Sheets("Issues").Cells(x, 1) = "IssueDescription"
    GoTo ErrProceed

它停在第2行,其中下标超出了Split2(h)的范围,而不是继续前进到ErrHandler,然后是ErrProceed。我觉得这一定是非常明显的事情,但我无法让这个工作,我无法在Excel VBA中找到其他方式(如try / except)。

更新:

试图澄清一些事情。问题的根源是,Split2列表比Split1短 - 这是输入数据的问题,我想捕获它。我从单元格中获取Split值,其中值以“|”分隔字符:

    CellValue = Sheets("SomeSheet").Cells(RowNumber, ColumNumber)
    CellValueSplit() = Split(CellValue, "|")

然后迭代为:

   For h = 0 To UBound(Split1())

因此当Split1移动到例如第3个值时,Split2会抛出错误并且脚本停止。我能做到的最好的是,我让它继续循环,但由于这是一个相当大的工作表,它将填写相同的错误报告ca.在这种情况下200k次,我想避免。因此,我希望它一旦达到超出范围误差就从此循环后继续,并继续检查下一个值。

感谢您提前和提前的帮助!

3 个答案:

答案 0 :(得分:1)

您的语法有问题。正确的Error语句语法为:

On Error GoTo <string>
On Error Resume Next
On Error GoTo 0

使用On Error GoTo <string>时,末尾没有“:”。在创建目标位置之前,“:”不起作用。示例:

On Error GoTo Here
'// ---- Do something ---- //
Here:
'// ---- Handle the error ---- //

如果您使用On Error Resume Next,那么您是在告诉机器忽略错误并继续执行下一行代码。

使用On Error Return To 0时,VBA会将其错误处理重置为默认值。当您不再需要使用On Error Resume Next插入On Error Return To 0时,这是一个好习惯。 On Error Resume Next很有可能破坏您的代码并使它的行为异常。更不用说调试可能是一个真正的噩梦。请查看VBA manual from Microsoft,以获得更详细的说明。

最后,如果您的问题得到回答,则应将其标记为已回答。

答案 1 :(得分:0)

简短版本是VBA错误处理例程只处理实际代码执行中的错误,当代码表示的条件不满足时,它们不会触发。

在您的情况下,您根本不需要任何错误处理。在大多数情况下,最好避免使用On Error GoTo ...。有些情况下这是不可避免的,但它们很少见。

试试这个IF THEN ELSE块:

If Sheets("SpecificSheet").Cells(j, 1).Value = Split1(h) And Sheets("SpecificSheet").Cells(j, 2).Value = Split2(h) Then
    DependencyOk = DependencyOk + 1
Else
    Sheets("Issues").Cells(x, 1) = "IssueDescription"
End If

答案 2 :(得分:0)

其实我刚刚发现了这个问题。它是由前面几行的If语句后留下的“:”引起的。我仍然不明白它做了什么,但我建议不要重现它:)