MS Access VBA を使用して、ファイルが Excel 形式かどうかを確認するにはどうすればよいですか?
3 に答える
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 ソリューションが必要な場合 -- 頭の中で完全に確信できるわけではありません。うまくいけば、他の誰かが以前にこれを行ったことがあります。
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