玄関へお回り下さい。
ADO.NETを使ってExcelのシート名を高速に取得する及びExcelのバージョンを取得 (SNo.066)
使用コントロール Button1  ListBox1
その他条件 WindowsVista VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86  Excel 2007/Excel 2010 
[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定
参照する Excel ファイルは、各自準備して下さい。
★ ADO.NETを使ってExcelのシート名を高速に取得する
 
Public Class Form1

#Region "本文関係の処理"

Private Sub Button1_Click(ByVal sender As System.Object, _
                          
ByVal e As System.EventArgsHandles Button1.Click
   
'一旦表示を消去
   ListBox1.Items.Clear()
   ListBox1.Refresh()
   
'ADO.NET の機能を使ってシート名を取得
   
'ADO でシート名を取得した場合は、Excelで表示している順番ではなくソート順になる。
   
Dim xlsFileName As String = System.IO.Path.GetFullPath("..\..\..\data\test.xls")
   
Dim con As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection( _
         
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsFileName & _
               
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""")
   
If excelVersion >= 12 Then
      xlsFileName = System.IO.
Path.GetFullPath("..\..\..\data\test.xlsx")
      con = 
New System.Data.OleDb.OleDbConnection( _
               
"provider=Microsoft.ACE.OLEDB.12.0;Data source=" & xlsFileName & _
                  
";Extended properties=""Excel 12.0;HDR=YES;IMEX=1""")
   
End If
   con.Open()
   
Dim sgt As DataTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, _
                
New Object() {NothingNothingNothing"TABLE"})

   
For i As Integer = 0 To sgt.Rows.Count - 1
      
Dim sheetName As String = sgt.Rows(i)!TABLE_NAME.ToString
      
If sheetName.EndsWith("$"Or sheetName.EndsWith("'"Then
         ListBox1.Items.Add(sheetName)
      
End If
   
Next i
   con.Close()
End Sub

#End Region

#Region "Excel.exeのバージョンを取得"

<System.Runtime.InteropServices.
DllImport("shell32.dll", _
      CharSet:=System.Runtime.InteropServices.
CharSet.Auto)> _
Private Shared Function FindExecutable( _
   
ByVal lpFile As String, _
   
ByVal lpDirectory As String, _
   
ByVal lpResult As System.Text.StringBuilderAs Integer
End Function

Private Shared Function GetExcelVersion(ByVal xlsPath As StringAs String
   
'パスを受け取る為のバッファーを用意
   
Dim appPath As New System.Text.StringBuilder(255)
   
'関数を実行してファイルパスを取得
   
If FindExecutable(xlsPath, Nothing, appPath) > 32 Then
      GetExcelVersion = appPath.ToString()
      
Dim fvi As FileVersionInfo = FileVersionInfo.GetVersionInfo(appPath.ToString())

      GetExcelVersion = fvi.FileVersion.ToString()
      
If GetExcelVersion.IndexOf(".") > 1 Then
         GetExcelVersion = GetExcelVersion.Substring(0, GetExcelVersion.IndexOf(
"."))
      
Else
         GetExcelVersion = 
"0"
      
End If
   
Else
      GetExcelVersion = 
"0"
   
End If
End Function

Private excelVersion As Integer

Private Sub Form1_Load(sender As System.Object, e As System.EventArgsHandles MyBase.Load
   excelVersion = 
CInt(GetExcelVersion("..\..\..\data\Test.xls"))
End Sub

#End Region

End Class

起動中の Excel のバージョンを取得するのは簡単ですが、使用する Excel.exe のバージョンとなるとこのような方法になるかと思います。
又、Com オブジェクトを使用していないので、解放処理等は必要ありませんし、Excel が無くても使用できます。
但し、使用する Excel のファイルの拡張子に合わせて使い分けて下さい。


2004/07/04
2005/09/28
2012/06/08

VBレスキュー(花ちゃん)

VB.NET2003/VB2005/VB2008/VB2010
Excel 2007/Excel 2010/Excel VBA