4

MS Access VBA を使用して、ファイルが Excel 形式かどうかを確認するにはどうすればよいですか?

4

3 に答える 3

2

Excel ファイルを拡張子で直接判断できないという問題は経験したことがありませんが、そうしなければならない場合、最初に頭に浮かぶのは UNIX ユーティリティですfile。これは、ファイルの内容を見てファイルの種類を識別します。 . 非常に多くのファイル タイプを認識します。

私は、基本的に Windows 上の UNIX 環境であるCygwin for Windows を使用しています。

file「.csv」という名前に変更した Excel 2010 (xlsx) ファイルに対して Cygwin でコマンドを使用すると、次のようになります。

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

これは少し厄介な解決策ですが、VBA でWindows Script HostC:\cygwin\bin\file.exeを使用してプロセスをフォークし、各ファイルの出力をキャプチャすることができます。

Excel ファイルへのパスを 1 つの目盛りで囲んでコーディングすると (つまり、「C:\path\to\file」)、Cygwin はそれを正しく解釈する必要があります (Cygwin ユーティリティは、UNIX のようなパス: /path/to/ を参照することを期待します)。ファイル)。これを通常の Windows コマンド プロンプトで確認したところ、次のように動作しました。

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

GnuWin32 SourceForge プロジェクトにはネイティブ Windows バイナリもありますが、少し古くなっているようです。試したことはありませんが、最新の Excel バージョンは認識される可能性があります。file

ネイティブの Excel ソリューションが必要な場合 -- 頭の中で完全に確信できるわけではありません。うまくいけば、他の誰かが以前にこれを行ったことがあります。

于 2012-11-19T03:44:06.577 に答える
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
于 2012-11-19T14:17:00.203 に答える