Submitted for your approval. Three functions. Functions to do a simple job. Do it well. Or not. You be the judge.
Yes, I’m trying something new and hoping to drag you along. Don’t worry, it’s just a poll.
A poll about what?
I haven’t automated Word for quite a bit and so, to ease into it, I noodled around with all-purpose functions to find or create a Word instance.
Function Specs
This function, as I imagine it, would have one option with three choices. Or is that one choice with three options?
1. Return only an existing instance of Word. If no instances are open, return nothing.
2. Return an existing instance of Word. If none exists, create a new one.
3. Create a new instance of Word whether or not one’s already open.
That’s not what I want you to vote on. I think we can all agree there’s a time and place for each of these options.
What I want to know is which of the following functions you like best. They all do the same thing, with slightly different approaches.
Function #1 – Enums: I love ’em, or at least the idea of them. In this case we can use their bitwise ANDing capability to shorten, and perhaps obfuscate.
ExistingInstance = 1
NewInstance = 2
End Enum
Function GetWordInstance(InstanceType As WordInstanceType) As Object
Dim wd As Object
If InstanceType And ExistingInstance Then
On Error Resume Next
Set wd = GetObject(, "Word.Application")
On Error GoTo 0
End If
'If wd is nothing now it's either because there were no existing instances
'and/or we asked for New
If (InstanceType And NewInstance) And wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
Set GetWordInstance = wd
End Function
Function #2 – FallThrough: It’s got an ugly pattern, but it matches the way I think about it. No enum, so you’d have to look at the function to figure out what strings it recognizes. That’s pretty ugly too, so maybe you’d want to change it to an enum.
Dim wd As Object
If InstanceType = "ExistingInstance" Or InstanceType = "ExistingThenNew" Then
On Error Resume Next
Set wd = GetObject(, "Word.Application")
On Error GoTo 0
'If we only want Existing, then we either got it or not
If InstanceType = "ExistingInstance" Then
Set GetWordInstance2 = wd
Exit Function
End If
End If
'If wd is nothing now it's either because
'we specified ExistingThenNew and there were no existing instances
'or we specified NewInstance
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
Set GetWordInstance2 = wd
End Function
Function #3 – Plodding Boy, I’m really selling these, huh? Like #2, no enum. It doesn’t worry about duplicated code, just lays out the steps for each option. A simple function for a simple man.
Dim wd As Object
If InstanceType = "ExistingInstance" Then
On Error Resume Next
Set wd = GetObject(, "Word.Application")
On Error GoTo 0
ElseIf InstanceType = "ExistingThenNew" Then
On Error Resume Next
Set wd = GetObject(, "Word.Application")
On Error GoTo 0
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
ElseIf InstanceType = "NewInstance" Then
Set wd = CreateObject("Word.Application")
End If
Set GetWordInstance3 = wd
End Function
[poll id=”2″]
I have a similar function:
Function GetWordInstance3(Optional InstanceType As String = “ExistingThenNew”) As Object
Felipe, what happens if the InstanceType is a null string?