Dev*_*WAH 1 error-handling excel vba excel-vba
我希望有人可以看看并为我整理一下; 我不得不说错误处理不是我的强点.我有下面的代码块,我一直在玩一些错误句柄,但它不是我真的想要它.
我要做的是确保如果在任何时候出现错误,我打开的工作簿和excel实例将正常关闭.
我相信有更多更好,更简单的方法来实现这一点,而不是我想出的.
Sub QOScode()
On Error GoTo Fail
Dim app As New Excel.Application
app.Visible = False 'Visible is False by default, so this isn't necessary
Dim book As Excel.Workbook
Set book = app.Workbooks.Add(ActiveWorkbook.Path & "\QOS DGL stuff.xlsx")
'set up error handeling so if any thing happens the instance of excel with QOS sheets is closed gracefully
On Error GoTo Closebook
' MsgBox book.Sheets("ACLS").Cells(3, 3)
'Do what you have to do
'
Closebook:
On Error Resume Next
book.Close SaveChanges:=False
app.Quit
Set app = Nothing
On Error GoTo 0
Fail:
End Sub
Run Code Online (Sandbox Code Playgroud)
我想要的是单个On错误 - 关闭app并退出sub.
任何人都可以提供这样做的最佳实践样本吗?
干杯
亚伦
所以下面这段代码,当工作表不存在时会导致错误,为什么不跳过" book.close"语句,我知道这会引发错误,但我想让它忽略它?
Sub QOScode()
On Error GoTo Closebook
Dim app As New Excel.Application
app.Visible = False
Dim book As Excel.Workbook
Set book = app.Workbooks.Add(ActiveWorkbook.Path & "\QOaS DGL stuff.xlsx") 'this sheet does not exist
'
MsgBox book.Sheets("ACLS").Cells(3, 3)
'Do what you have to do
'
Closebook:
Err.Clear
On Error Resume Next
book.Close SaveChanges:=False 'Object variable or with block variable not set (error 91)
app.Quit
Set app = Nothing
On Error GoTo 0
End Sub
Run Code Online (Sandbox Code Playgroud)
错误处理我2美分.
你应该总是进行错误处理.
一些原因
1)你不希望你的应用程序崩溃并让你的用户挂起!想象一下它会导致它们的挫败感.
2)错误处理并不意味着您试图忽略错误.
3)错误处理既不是防御性编程也不是积极的编程.恕我直言,这是主动编程.
4)很少有人知道您可以找到导致错误的行.我所说的财产是ERL.考虑这个例子
Sub Sample()
Dim i As Long
Dim j As Long, k As Long
10 On Error GoTo Whoa
20 i = 5
30 j = "Sid"
40 k = i * j
50 MsgBox k
60 Exit Sub
Whoa:
70 MsgBox "Description : " & Err.Description & vbNewLine & _
"Error Number : " & Err.Number & vbNewLine & _
"Error at Line: " & Erl
End Sub
Run Code Online (Sandbox Code Playgroud)

5)在工作表更改事件等子类中,必须进行错误处理.想象一下,您已将Enable Event设置为False并且代码中断了!在您将事件设置为true之前,代码将不会再次运行
6)我可以继续:-)会推荐这个链接
主题:'Err'是人类
链接:http://www.siddharthrout.com/2011/08/01/to-err-is-human/
小费:
使用MZ工具.这是免费的!
以下是我编写代码的方法.
Sub QOScode()
Dim app As New Excel.Application
Dim book As Excel.Workbook
10 On Error GoTo Whoa
20 Set book = app.Workbooks.Open(ActiveWorkbook.Path & "\QOS DGL stuff.xlsx")
30 MsgBox book.Sheets("ACLS").Cells(3, 3)
'
'Do what you have to do
'
LetsContinue:
40 On Error Resume Next
50 book.Close SaveChanges:=False
60 Set book = Nothing
70 app.Quit
80 Set app = Nothing
90 On Error GoTo 0
100 Exit Sub
Whoa:
110 MsgBox "Description : " & Err.Description & vbNewLine & _
"Error Number : " & Err.Number & vbNewLine & _
"Error at Line: " & Erl
120 Resume LetsContinue
End Sub
Run Code Online (Sandbox Code Playgroud)
我不太清楚我理解你的目标.如果我这样做,我可能不同意.
你正在开发这个代码吗?我几乎从不在我正在开发的代码中使用错误处理.我希望解释器停止提供错误的语句.我想了解为什么发生错误.我可以做些什么来避免错误?我没有检查文件是否存在?我没有检查路径是否可访问?在我做任何其他事情之前,我会添加丢失的代码.
当您完成开发时,您应该计划没有错误条件,而您没有包含正确的代码.当然,这是不可能的; 你不能让你的代码万无一失,因为傻瓜太聪明了.您发布给用户的版本必须包含错误处理.
但您无法将此代码发布给用户,因为它会在没有警告的情况下停止.用户会猜到宏出现了什么问题,或者他们会认为这是应该发生的事情吗?如果他们认为宏观失败了他们会对你说什么?"它没有做我期待的事情,我不知道为什么." 你要说什么回来?"你在做什么?" 我不认为我曾经让用户对失败时他们正在做的事情做出可信的描述.至少你想要:
Call MsgBox("Sorry I have had an unrecoverable error within QOScode()." & _
" Please record: " & Err.Number & " " & Err.Description & _
" and report to extension 1234")
Run Code Online (Sandbox Code Playgroud)
有了这个,用户不会怀疑是否出了什么问题,你知道它出了什么问题,幸运的是,为什么.
为了整齐地处理预见的问题,您可以使用简短的错误处理来测试工作簿是否实际存在(即If Not Wb Is Nothing Then,如果这样工作,具有共同的结尾(即,销毁对象)
第二个示例显示了在打开工作簿后如何为无法预料的错误添加其他处理.我曾经Err.Raise创建了故意错误,让用户可以选择如何继续(在发生错误后立即关闭工作簿或使工作簿可见)
顺便说一句,不要使用Dim和New在一起.我已经重写
Dim app As New Excel.Application
了
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
1.处理无工作簿问题
Sub QOScode()
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
Dim Wb As Excel.Workbook
On Error Resume Next
Set Wb = xlApp.Workbooks.Add(ActiveWorkbook.Path & "\QOaS DGL stuff.xlsx") 'this sheet does not exist
On Error GoTo 0 '
If Not Wb Is Nothing Then
MsgBox Wb.Sheets("ACLS").Cells(3, 3)
'Do what you have to do
Wb.Close False
End If
xlApp.Quit
Set xlApp = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
2.不处理任何工作簿和其他不可预见的错误,否则可能会导致工作簿无法打开
Sub QOScode2()
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
Dim Wb As Excel.Workbook
Dim lngChk As Long
On Error Resume Next
Set Wb = xlApp.Workbooks.Add(ActiveWorkbook.Path & "\QOaS DGL stuff.xlsx") 'this sheet does not exist
On Error GoTo 0 '
If Not Wb Is Nothing Then
On Error GoTo ProblemHandler
MsgBox Wb.Sheets("ACLS").Cells(3, 3)
'Do what you have to do
'Deliberate error
Err.Raise 2000, "test code", "Sample Error"
Wb.Close False
Else
MsgBox "Workbook not found,code will now exit"
End If
xlApp.Quit
Set xlApp = Nothing
Exit Sub
ProblemHandler:
'Test to see if workbook was still open when error happened
If Not Wb Is Nothing Then
lngChk = MsgBox("The code encountered an error" & vbNewLine & Err.Number & vbNewLine & "Do you want to close the file?", vbYesNo, Err.Description)
If lngChk = vbYes Then
'close book. Code will proceed to destroy app
Wb.Close False
Else
'make workbook visible and leave code
Wb.Visible = True
Exit Sub
End If
Else
MsgBox "The code encountered an error - the file was already closed at this point" & vbNewLine & "Error number " & Err.Number & vbNewLine, Err.Description
End If
'destroy app (either if the workbook was closed, or user chose to close it)
xlApp.Quit
Set xlApp = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6451 次 |
| 最近记录: |