区分`on error goto`时发生的两个错误并单独处理它们

问题描述 投票:0回答:1

我正在与三个Word Documents合作。

  1. CEEMEA和LATAM
  2. Ticker Graveyard

在开始时,只打开Rough文档。我需要将数据从Rough转移到CEEMEA & LATAM并使用Ticker Graveyard来匹配一些查询,所以CEEMEA & LATAM Ticker Graveyard都应该已经打开了。

为此我检查其他文件是否已经打开。如果没有,那么我需要使用Documents.Open打开特定文档。因为我正在做更新代码:

sub ErrHandling()

On Error GoTo PROBLEM
Windows("CEEMEA & LATAM").Activate ''''' Here checking CEEMEA & LATAM status
'''' after checking STATUS do some work on CEEMEA & LATAM '''''

Set doc = Application.Windows("Ticker Graveyard").Document ''''' Here checking Ticker Graveyard status
'''' after checking do some work on Ticker Graveyard '''''

Exit Sub
PROBLEM:
If Err.Number = 5941 Then
    Documents.Open FileName:="C:\Users\dell\Desktop\EMEA CEEMEA\CEEMEA & LATAM.docx" --- handling only CEEMEA & LATAM document

'''''' These lines handle Date in document while opening document''''
Selection.MoveDown Unit:=wdLine, Count:=2
Selection.EndKey Unit:=wdLine
Selection.MoveUp Unit:=wdParagraph, Count:=1, Extend:=wdExtend
Selection.TypeText Format(Date, "MMMM dd, yyyy")
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Else
MsgBox "UNEXPECTED ERROR = " & Err.Number
Exit Sub
End If

Resume Next
End Sub

但问题是因为两个检查点触发相同的Error Number我无法使用简单的on error goto语句区分它们。

现在我的问题是如何区分这两个错误?我该如何单独处理它们?如果有另一种方式来处理这种情况,请分享。

error-handling ms-word runtime-error goto onerror
1个回答
1
投票

有许多策略用于处理代码需要引用可能存在或可能不存在的特定对象的情况。哪种方法“最好”在某种程度上是一种哲学思考。基本方法是:

  1. 触发错误,然后处理它。这就是问题中代码的设计方式。使用VBA时,它也是一种有效的方法,因为它可以相对较快。但是,对于任何.NET语言,它会明显减慢代码速度,如果有其他可能性,则不应使用它。
  2. 迭代集合以确定相关对象是否可用。如果集合中包含大量项目,则VBA中的速度可能比错误处理方法慢。另一方面,它倾向于使代码更容易理解(在我看来)。

根据问题中的代码,下面概述了两种方法的策略。

错误处理

可以在过程中使用多个“标签”(跳转到错误处理程序的目标),因此可以为每个单独的文档设置“标签”。因此,对于每个文档,可以使用不同的错误处理程序,它具有自己的代码“分支”。

On Error GoTo PROBLEM_CEEMA
Windows("CEEMEA & LATAM").Activate ''''' Here checking CEEMEA & LATAM status
On Error GoTo General
'''' after checking STATUS do some work on CEEMEA & LATAM '''''

On Error GoTo PROBLEM_TICKER
Set doc = Application.Windows("Ticker Graveyard").Document ''''' Here checking Ticker Graveyard status
On Error GoTo General
'''' after checking do some work on Ticker Graveyard '''''

Exit Sub

PROBLEM_CEEMA:
  If Err.Number = 5941 Then
    Documents.Open FileName:="C:\Users\dell\Desktop\EMEA CEEMEA\Ticker Graveyard.docx" --- handling only Ticker document    
  Else
    MsgBox "UNEXPECTED ERROR = " & Err.Number
    Exit Sub
  End If

Resume Next 

PROBLEM_TICKER:
  If Err.Number = 5941 Then
    Documents.Open FileName:="C:\Users\dell\Desktop\EMEA CEEMEA\CEEMEA & LATAM.docx" --- handling only CEEMEA & LATAM document    
  Else
    MsgBox "UNEXPECTED ERROR = " & Err.Number
    Exit Sub
  End If

Resume Next 

PROBLEM_General:
  'General, non-document-related error handling
End Sub

迭代Documents集合

Word应用程序在Documents集合中保存已打开文档的运行列表。可以使用For...Each(或For)循环来运行集合并比较文档名称。这可以在单独的函数中完成,因此代码不需要重复。

Sub Test
  Dim doc1 as Document, file1 as String
  Dim doc2 as Document, file2 as String

  file1 = "C:\Users\dell\Desktop\EMEA CEEMEA\CEEMEA & LATAM.docx"
  file2 = "C:\Users\dell\Desktop\EMEA CEEMEA\Ticker Graveyard.docx"

  If not IsDocumentOpen(file1) Then
    Set doc1 = Documents.Open(FileName:=file1)
  End If

  If not IsDocumentOpen(file2) Then
    Set doc2 = Documents.Open(FileName:=file2)
  End If
End Sub

Function IsDocumentOpen(fileName as String) as Boolean
  Dim doc as Word.Document
  Dim isOpen as Boolean

  isOpen = false
  For Each doc in Documents
     IF doc.Name = fileName Then
        isOpen = true
     End If
  Next
  IsDocumentOpen = isOpen
End Function
© www.soinside.com 2019 - 2024. All rights reserved.