访问VBA如何确定文件是否是Excel格式?

时间:2012-11-19 02:24:44

标签: excel vba access-vba

使用MS Access VBA如何检查文件是否为Excel格式?

3 个答案:

答案 0 :(得分:2)

我从来没有遇到无法直接通过扩展确定Excel文件的问题,但是如果我必须这样做,首先想到的是UNIX实用程序file,它标识了通过查看其内容来查找文件类型。它识别非常多的文件类型。

我对Windows使用Cygwin,这实际上是Windows上的UNIX环境。

当我在Excel 2010(xlsx)文件中使用Cygwin中的file命令时,我重命名为“.csv”,我得到:

$ file afile.csv
afile.csv: Microsoft Excel 2007+

这是一个稍微尴尬的解决方案,但在您的VBA中,您可以使用Windows Script Host分叉C:\cygwin\bin\file.exe进程,并捕获每个文件的输出。

如果你用Excel周围的单个刻度编写Excel文件的路径(即'C:\ path \ to \ file'),Cygwin应该正确解释它(Cygwin实用程序希望看到类似unix的路径:/ path /到/文件)。我刚刚在正常的Windows命令提示符下验证了这一点,并且它有效:

c:\>c:\cygwin\bin\file.exe 'C:\path\to\afile.csv'
C:\path\to\afile.csv: Microsoft Excel 2007+

native Windows binary中还有GnuWin32 SourceForge project file,但似乎有点过时了;我还没试过,但它仍然可以识别现代的Excel版本。

如果你需要一个原生的Excel解决方案 - 我不能完全确定我的头脑;希望其他人之前已经这样做了。

答案 1 :(得分:2)

这不是Access,但对于Excel,我使用它。这不是最好的,也不是任何人的首选解决方案,而是支撑自己。

Public Function IsExcelFormat(ByVal filePath As String) As Boolean

    On Error GoTo Nope
    Application.ScreenUpdating = False

    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath )
    IsExcelFormat = (wb.FileFormat > 50)

CleanExit:
    Application.ScreenUpdating = True
Exit Function

Nope: ' Clearly not Excel format
    Err.clear
    IsExcelFormat = False
    Resume CleanExit:

End Function

是的,它使用了Excel的自动化功能。我知道。这很可怕。 ScreenUpdating并不完全有效。当您打开关闭文件时,您的任务栏将更新。但它仍然有效。

您可能需要在Access VBA脚本中创建一个实例Excel,并可选择将其传递给类似这样的函数。 注意我还没有对此进行过测试。

Public Function IsExcelFormat(ByVal file_path As String, _
        Optional byRef excel_instance as Excel.Application = Nothing) As Boolean
    On Error GoTo Nope

    Dim local_excel as boolean
    If excel_instance Is Nothing Then 
       Set excel_instance = New Excel.Application
       local_excel = True
    End If

    Dim wb As Excel.Workbook

    excel_instance.ScreenUpdating = False

    Set wb = excel_instance.Workbooks.Open(file_path)
    IsExcelFormat = (wb.FileFormat > 50)
    wb.Close savechanges:=False

CleanExit:
    If local_excel Then 
        excel_instance.Quit
    Else
        excel_instance.ScreenUpdating = True    
    End If
Exit Function
Nope: ' Clearly not Excel format
    Err.clear
    IsExcelFormat = False
    Resume CleanExit:
End Function

答案 2 :(得分:1)

关于使用ADOX的可能方法的一些注释

Sub SortFiles()
''Library reference: Windows Script Host Object Model
Dim fs As New FileSystemObject
Dim ts As TextStream
Dim sType As String
Dim sFile As File

For Each sFile In fs.GetFolder("Z:\Docs\").Files
    sType = sFile.Type

    If InStr(sType, "Microsoft") = 0 Then
        sList = ListTables(sFile.Name)
        If sList = "Error: Not Excel" Then
            ''Move to suitable folder
        Else
            Debug.Print sList
            Stop
            ''This can be read as Excel, most likely
        End If

    ElseIf sType Like "*Excel*" Then
       ''Includes CSV
        sFile.Move "z:\docs\Excelfiles\"
    Else
        sFile.Move "z:\docs\OtherMS\"
    End If
Next

End Sub

Function ListTables(sFile As String) As String
''Library reference: Microsoft ADO Ext. x.x for DDL and Security
Dim cat As New ADOX.Catalog
Dim scn As String
Dim t As ADOX.Table
Dim cn As New ADODB.Connection
Dim sList As String

On Error GoTo Handle_Err:

    scn = "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";Extended Properties=""Excel 8.0;HDR=No"""

    cn.Open scn

    cat.ActiveConnection = cn

    For Each t In cat.Tables
        sList = sList & vbCrLf & t.Name
    Next t

    ListTables = sList

Exit_Proc:
Set cn = Nothing
Set cat = Nothing
Exit Function

Handle_Err:
    If Err.Number = -2147467259 Then
        ''External table is not in the expected format.
        ListTables = "Error: Not Excel"
        Err.Clear
        Resume Exit_Proc
    Else
        Debug.Print Err.Number, Err.Description
    End If

End Function