こんにちわ
どなたか、良い方法をご存知の方がいましたら、教えていただけないでしょうか?
Excelのシートを高速で取得して、且つ、シートの取得する順番を、
Excelで管理しているシートの順番で取得したいです。
ADOを使って実験をしてみましたが、ADOを使った場合は、高速に取得できるのですが、取得するシートの順番が、ABC順(あいうえお順)になってしまいます。
一番、理想的なのは、ADOを使ってシート一覧を取得して、
シートの順番もExcelで管理している、シート順にしたいのです。
以下に実験で、使ったサンプルコードを記載します。
どなたが、良い方法がありましたら、是非教えてください。
よろしくおねがいします。
Public Class Form1
' プロジェクト→参照の追加→COM→Microsoft Excel *.* ObjectLibrary を参照して下さい
' プロジェクト→参照の追加→COM→Microsoft ActiveX Data Objects *.* Library を参照して下さい
' フォーム上に、以下のコントロールを貼り付けてください。
' btnAdo -> buttonコントロール
' btnAuto -> buttonコントロール
' listBox1 -> listBoxコントロール
' listBox2 -> listBoxコントロール
Private Sub btnAdo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdo.Click
'-------------------------------------------------------------------
' この方法では、ADOを使ってシート名一覧を取得する。
' やたら、早く取得できるが、シートの順番が、Excelで管理してる順番ではなくて、ABC順(あいうえお順)になってしまう。
'-------------------------------------------------------------------
Dim sw As New Stopwatch
sw.Start()
Dim CN As New ADODB.ConnectionClass, RS As New ADODB.RecordsetClass
Dim xlFileName As String
Dim SheetNeme As String
ListBox1.Items.Clear()
xlFileName = System.IO.Path.GetFullPath("c:\テストデータ.xls")
CN.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & xlFileName & ";Extended Properties=Excel 8.0;")
RS = CN.OpenSchema(ADODB.SchemaEnum.adSchemaTables)
Do Until RS.EOF
SheetNeme = RS.Collect("TABLE_NAME").ToString()
If SheetNeme.EndsWith("$") Or SheetNeme.EndsWith("'") Then
ListBox1.Items.Add(SheetNeme.Replace("$", ""))
End If
RS.MoveNext()
Loop
RS.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(RS)
RS = Nothing
CN.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(CN)
CN = Nothing
sw.Stop()
ListBox1.Items.Add(sw.ElapsedTicks / Stopwatch.Frequency)
End Sub
Private Sub btnAuto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAuto.Click
'-------------------------------------------------------------------
' この方法では、Excelを起動して、オートメーションにて、シート名一覧を取得する。
' 一度、Excelを開いているため、処理に時間がかかってしまう。
' そのかわり、取得するシートの順番は、Excelで管理している順番で取得できる。
'-------------------------------------------------------------------
Dim sw As New Stopwatch
sw.Start()
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlFilePath As String = "c:\テストデータ.xls"
Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
xlApp.Visible = False
ListBox2.Items.Clear()
Dim mySheet As Excel.Worksheet
For Each mySheet In xlSheets
ListBox2.Items.Add(mySheet.Name)
Next
MRComObject(mySheet)
MRComObject(xlSheets)
xlBook.Close(False)
MRComObject(xlBook)
MRComObject(xlBooks)
xlApp.Quit()
MRComObject(xlApp)
sw.Stop()
ListBox2.Items.Add(sw.ElapsedTicks / Stopwatch.Frequency)
End Sub
'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
Private Sub MRComObject(ByRef objCom As Object)
Try
'提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします
If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(objCom) Then
Dim I As Integer
Do
I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
Loop Until I <= 0
End If
Catch
Finally
'参照を解除する
objCom = Nothing
End Try
End Sub
End Class
回答ではありません。
http://hanatyan.sakura.ne.jp/hazimeni.htm#1
> 1.サンプルご利用上の注意事項
>最近ここのサンプルをそのままコピーして他の掲示板にペーストして質問等される方が見
>受けられますが、当サイトに限らずそのような行為は違法となります。又、逆に私がその
>掲示板の書込みをパクッタと誤解されかねませんので、そのような行為はお断り致します
http://hanatyan.sakura.ne.jp/dotnet/Excel05.htm
> 本格的にADOを使用される場合は、ADO.NET の方をお使い下さい。
特攻隊長まるるう さん 注意書きありがとうございます。
回答しても返事がなさそうなので、ご要望のように取得する方法は
あります。とだけ答えておきます。詳しく知りたければ....。
ツイート | ![]() |