Excelのシート名を高速に且つ、順番を正しく取得する方法


日の丸  2006-11-19 00:00:13  No: 134210

こんにちわ
どなたか、良い方法をご存知の方がいましたら、教えていただけないでしょうか?

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


特攻隊長まるるう  2006-11-19 01:04:34  No: 134211

回答ではありません。
http://hanatyan.sakura.ne.jp/hazimeni.htm#1
> 1.サンプルご利用上の注意事項
>最近ここのサンプルをそのままコピーして他の掲示板にペーストして質問等される方が見
>受けられますが、当サイトに限らずそのような行為は違法となります。又、逆に私がその
>掲示板の書込みをパクッタと誤解されかねませんので、そのような行為はお断り致します

http://hanatyan.sakura.ne.jp/dotnet/Excel05.htm
> 本格的にADOを使用される場合は、ADO.NET の方をお使い下さい。


VBレスキュー(花ちゃん)  2006-11-19 02:55:29  No: 134212

特攻隊長まるるう さん  注意書きありがとうございます。

回答しても返事がなさそうなので、ご要望のように取得する方法は
あります。とだけ答えておきます。詳しく知りたければ....。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加