投稿者 snowmansnow  (社会人) 投稿日時 2022/11/3 11:46:25

 こんにちは、魔界の仮面弁士様、るきお様
 諸事情で、お返事できず申し訳ございませんでした。

 >> 列挙順が変化するワークブック
 >> だったら良かったのですが、手元では変わりませんでした・・・
  >その場合、Excel の Worksheets コレクションでも変化しない状況でしょうか。
  はい、sheets(1).nameは、変わります。

  >1.0 との違いは、SubMatches が使えるかどうかです。
  .submatches(0)とか使った事がありますので、知らずに5.5を使っていたかもしれません。

 >Dictionary は登録順に列挙されるようですが、削除と追加を繰り返した場合の
 >列挙順は保証されていません。一方 Collection は列挙順が保証されているのですが、 
 >重複判定などは、Collection よりも Dictionary の方が便利だったりします。
 機会がありましたら、使ってみたいです。

  久しぶりにパソコン触れましたので、諸先輩方の例を参考にVB.NETでシート名羅列を作ってみました
 よろしかったら見てやって下さい
 (フォームにマルチラインのテキストボックスとボタン1個配置します)
  
Imports System.IO.Compression
Imports System.Text.RegularExpressions

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim zipFilePath As System.IO.Compression.ZipArchive = ZipFile.OpenRead("C:\Users\Y2\Desktop\excel2.xlsm")
        Dim zipInFile As System.IO.Compression.ZipArchiveEntry = zipFilePath.GetEntry("xl/workbook.xml")
        If zipInFile Is Nothing Then
            MessageBox.Show("workbook.xmlファイルは見つかりませんでした。")
        Else
            Dim sr As New System.IO.StreamReader(zipInFile.Open(),
                                                 System.Text.Encoding.GetEncoding("utf-8"))
            Dim TextBox1Text As String
            While sr.Peek >= 0
                TextBox1Text += sr.ReadLine
            End While
            Dim results As MatchCollection = Regex.Matches(TextBox1Text, "<sheets>.*</sheets>")
            Dim result1 As String
            For Each m As Match In results 
                Dim index As Integer = m.Index 
                Dim value As String = m.Value 
                result1 += value + vbCrLf
            Next
            Dim result2 As MatchCollection = Regex.Matches(result1, "<sheet\s.*?sheetId")
            Dim result3 As String
            For Each m As Match In result2 
                Dim index2 As Integer = m.Index 
                Dim value2 As String = m.Value 
                result3 += value2 + vbCrLf
                Me.TextBox1.Text += Replace(Mid(value2, 14, 100), """ sheetID""", 1, 100, CompareMethod.Text) + vbCrLf
            Next
            Console.WriteLine(result3)
            If sr IsNot Nothing Then
                sr.Close()
                sr.Dispose()
                sr = Nothing
                GC.Collect()
            End If
        End If
    End Sub
End Class
 

 よろしくお願いします。