【问题标题】:List all open excel sheets in a combobox在组合框中列出所有打开的 Excel 工作表
【发布时间】:2016-05-03 23:44:06
【问题描述】:

我想要一个组合框,列出当前在 excel 中打开的所有工作表名称。

我找到了一些可以列出所有打开的工作簿的代码,并对其进行了编辑以完成工作表。它似乎正确地循环浏览所有工作簿,但它只列出当前活动的 Excel 工作簿上的工作表。

当前代码如下。加载表单时调用此子程序。

    dt.Columns.Add("sheets")
    Try
        If IsNothing(app) Then
            app = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application)
        End If
        Dim bks = app.Workbooks
        Dim dks = app.Worksheets
        dt.Clear()
        For Each bk As Excel.Workbook In bks
            Debug.WriteLine(bk.Name)
            For Each dk As Excel.Worksheet In dks
                Debug.WriteLine(dk.Name)
                dt.Rows.Add(dk.Name.ToString())
            Next
        Next
        ComboBox1.DataSource = Nothing
        ComboBox1.Items.Clear()
        ComboBox1.DataSource = dt
        ComboBox1.DisplayMember = "sheets"
    Catch ex As Exception
        MsgBox(ex.ToString())
    End Try

【问题讨论】:

    标签: vb.net excel


    【解决方案1】:

    您正在循环之前阅读此内容:

    Dim dks = app.Worksheets
    

    Application.Worksheets 返回 活动 工作簿的工作表。

    当使用两个嵌套循环时,如果不使用外部循环的变量,一定有问题。
    试试这样:

        Dim bks = app.Workbooks
        'Dim dks = app.Worksheets
        dt.Clear()
        For Each bk As Excel.Workbook In bks
            For Each ws As Excel.Worksheet In bk.Worksheets
                dt.Rows.Add(bk.Name & ":" & ws.Name)
            Next
        Next
    

    【讨论】:

      【解决方案2】:

      我刚刚测试了下面的脚本,它似乎工作正常。试一试,看看你的想法。

      导入 System.Data.OleDb

      Public Class Form1
      
          Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
              Dim filePath As String = "C:\Users\xxx\YourFile.xlsm"
      
              Dim connString As String = String.Empty
              If filePath.EndsWith(".xlsx") Then            '2007 Format            
                  connString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", filePath)
              Else            '2003 Format            
                  connString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", filePath)
              End If         'Get the Sheets in Excel WorkBook        
              Dim connExcel As New OleDbConnection(connString)
              Dim cmdExcel As New OleDbCommand()
              Dim oda As New OleDbDataAdapter()
              cmdExcel.Connection = connExcel
              connExcel.Open()
              ComboBox1.DataSource = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
              ComboBox1.DisplayMember = "TABLE_NAME"
              ComboBox1.ValueMember = "TABLE_NAME"
              connExcel.Close()
          End Sub
      
      End Class
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-15
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多