To determine the documents that Microsoft Word can open and update natively, I am using the Filters collection from the Application.FileDialog object which is available in Word version 2002 onwards. This is the list of extensions that can be selected in the File Open dialog to filter the files that can be opened in Word. Seems to work like a charm. For earlier versions, you'll need to hardcode the extensions.
Public Function IsWordDocument(ByVal strExtension As String) As Boolean
' Developed by Warren Bain on 01/04/2010
' Copyright (c) Thought Croft Pty Ltd
' All rights reserved.
' Verifies if the supplied file extension e.g. "doc"
' is recognised as one of the documents that this version
' of Word can natively handle. List is constructed from the
' types of documents that can be filtered in the Open File dialog
' therefore this only works from Microsoft Word 2002 onwards.
Const strcNoiseChars As String = "*?."
Const strcSeparators As String = ";,"
Const strcDelimiter As String = "|"
Static colExtensions As Collection
Dim fdf As FileDialogFilter
Dim astrExts As Variant
Dim strExts As String
Dim i As Integer
' Check if we have loaded the collection yet - only done once
If colExtensions Is Nothing Then
Set colExtensions = New Collection
For Each fdf In Application.FileDialog(msoFileDialogOpen).Filters
strExts = fdf.Extensions
' Remove any 'noise' characters from the string
For i = 1 To Len(strcNoiseChars)
strExts = Replace(strExts, Mid$(strcNoiseChars, i, 1), vbNullString)
Next i
' Ensure we standardise on separators used
For i = 1 To Len(strcSeparators)
strExts = Replace(strExts, Mid$(strcSeparators, i, 1), strcDelimiter)
Next i
' Turn the current set of extensions into an array
astrExts = Split(strExts, strcDelimiter)
' Add all the ones we haven't already got
For i = LBound(astrExts) To UBound(astrExts)
' If already there, this will fail so ignore
On Error Resume Next
colExtensions.Add Trim(astrExts(i)), Trim(astrExts(i))
On Error GoTo 0
Next i
Next fdf
End If
' We just try and look up the file type and if it fails
' then it is not an intrinsically supported document
On Error Resume Next
strExts = colExtensions.Item(strExtension)
IsWordDocument = (Err = 0)
End Function
3 comments:
Observant readers will note that this will work in ANY Office product from version 2002 onwards. There is no intrinsic "Word" feature used...
Thanks for sharing...
Keep in mind that the FileDialog will show other results depending on the Office product you're working with, e.g. I'm working with Access, but the FileDialog doesn't show the Word extensions, so IsWordFile("doc") results in FALSE.
Post a Comment