【问题标题】:Throwing and Catching Erros in VBA?VBA 中的抛出和捕获错误?
【发布时间】:2022-07-26 21:31:14
【问题描述】:

我熟悉 java 编程以及抛出和捕获错误,我不确定这是否是 excel VBA 中的一个功能。我想做以下捕获,但不确定它仍然无法正常工作

 If Workbooks("Name").Worksheets("Sheet1") Is Nothing Then
    Err.Raise vbObjectError + 9, , "Destination Spreadsheet not Open. Please Open"
    End If
    Set wsDest = Workbooks("Name").Worksheets("Sheet1")

但是,当我创建此代码时,我仍然遇到相同的“下标超出范围错误”。如果有人有任何建议或提示,请告诉我。

【问题讨论】:

  • 错误应该在行之前,而不是之后:在这种情况下,您需要类似On error resume next Set WS=Workbooks("Name").Worksheets("Sheet1") 然后If WS Is Nothing Then
  • PS:这里有an article,这可能会给你一个更广泛的概念

标签: excel vba


【解决方案1】:

您需要使用on error goto 语句来处理这种情况。工作簿和工作表都包含在集合中,因此任何访问不存在元素的尝试都会在您到达 err.raise 之前引发下标超出范围错误。

     Dim wsdest As Worksheet
    On Error GoTo desterr
    Set wsdest = Workbooks("Name").Worksheets("Sheet1")
    On Error GoTo 0
    Exit Sub
desterr:
    Err.Raise vbObjectError + 9, , "Destination Spreadsheet not Open. Please Open"
    
End Sub

如果您不喜欢它,您也可以尝试遍历每个工作簿和工作表以找到您要查找的内容,但认为这样效率会低一些。

【讨论】:

    【解决方案2】:

    如果您尝试访问不存在的工作簿,则会引发此错误。您可以使用此方法检查所有类型的集合。

    Public Function CollectionItemObjectAvalible(p_Collection As Object, p_key As String)
       Dim l_val
       On Error Resume Next
       Set l_val = p_Collection(p_key)
       CollectionItemObjectAvalible = Err.Number = 0   'nur wenn oben der Zugriff keine Fehler erzeugt hat, ist das Objekt vorhanden
    End Function
    
    If CollectionItemObjectAvalible(Workbooks, "Name") Then
       Err.Raise vbObjectError + 1, "My Project", "Cannot find 'Name' in workbooks."
    End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-25
      • 2023-03-28
      • 2011-01-25
      • 2018-01-21
      • 2011-09-07
      • 2015-10-05
      • 2014-06-30
      • 2015-12-29
      相关资源
      最近更新 更多