首先,CreateApp()调用NewAppSheet()。
其次,NewAppSheet()返回一个对象。
第三,CreateApp()测试对象创建是否成功。
我经常发现自己处于这种状况。这种情况的好习惯是什么?在这种情况下有什么细微差别(例如:如果对象从未成功创建或者它只是指向什么都没有问题吗?)?
以下代码是我对优雅的最佳尝试。不幸的是,CreateApp()中的'Else'永远不会发生,所以我的测试不起作用。
Sub CreateApp()
Dim wks As Excel.Worksheet = NewAppSheet()
If Not wks Is Nothing Then
WriteAppText(wks)
Else
MessageBox.Show("This never happens")
End If
End Sub
Function NewAppSheet() As Excel.Worksheet
Dim sMessage As String = "Message"
Dim sTitle As String = "Title"
Dim sDefaultValue As String = ""
Dim sValue As String
Dim wks As Excel.Worksheet
' Display message, title, and default value
sValue = InputBox(sMessage, sTitle, sDefaultValue)
wks = CType(AddinModule.CurrentInstance, TimeTracker.AddinModule).ExcelApp.ActiveWorkbook.Worksheets.Add()
Try
wks.Name = sValue
Catch
wks.Delete()
MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
End Try
NewAppSheet = wks
End Function
我知道我可以创建一个名为bSuccessful的额外变量,并在我的测试中使用它。但我认为必须有一个更好的程序员使用的更好的练习,所以我问你们好吗?
答案 0 :(得分:2)
您永远不会收到Else
声明,因为NewAppSheet
永远不会返回Nothing
:
Try
wks.Name = sValue
Catch
' This will delete the sheet.
' It will NOT set wks to Nothing.
wks.Delete()
MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
' Explicitly set wks object to nothing.
wks = Nothing
End Try
' Use Return instead of assigning to the function name.
Return wks
如上面的代码片段所示,通常最好在VB.NET函数中使用Return
,而不是将值赋给函数名称(例如NewAppSheet = wks
),这是怎么回事在VBA完成。
因为您也在征求反馈意见:程序方面,您的代码和方法对我来说很好。很清楚代码的意图是什么,我觉得很容易理解。
答案 1 :(得分:2)
让NewAppSheet从Catch块返回Nothing。
Try
wks.Name = sValue
Catch
wks.Delete()
MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
Return Nothing
End Try