需要VB代码来显示Excel文件中的工作表的列表,将其显示在Access窗体的列表框中

我在Access中创build一个窗体,允许用户select一个Excel文件,然后select一个工作表导入。 我有代码,允许用户select一个Excel文件,并将其存储在窗体上的控件的文件名。

现在我想显示该文件中的工作表的名称。 我知道如何进行导入,我不知道如何获取文件中的工作表名称,并将它们存储在表格或表单上的列表框中,以便用户可以select一个。 可悲的是,虽然所有的Excel文件都应该有工作表的标准名称,但一些表单已closures,这就是为什么我要显示它们。

我正在使用Office 2007。

Set oWkb = oXLApp.Workbooks.Open(FileName) For Each oSh In oWkb.Worksheets MsgBox oSh.Name Next 

oXLApp将是Excel应用程序的一个实例,您可以使用Set oXLApp = CreateObject("Excel.Application")获取该实例。

确保在完成工作表名称后closures工作簿。 我可能会将它们存储在一个集合或一个数组(而不是MsgBox oSh.Name )中,以便可以收集它们,closures工作簿并使用集合的内容将它们显示在窗体上。

在我的testing中,使用ADOX目录来检索工作表名称显然比打开Excel应用程序实例来枚举WorkSheets集合要WorkSheets

 Public Sub List_WorksheetsAdox(ByVal pWorkBook As String) Dim cat As Object 'ADOX.Catalog Dim cn As Object 'ADO.Connection Dim strConnect As String Dim tbl As Object 'ADOX.Table strConnect = "Provider=" & _ CurrentProject.Connection.Provider & ";" & _ "Data Source='" & pWorkBook & "';" & _ "Extended Properties=Excel 8.0;" Set cn = CreateObject("ADODB.Connection") cn.Open strConnect Set cat = CreateObject("ADOX.Catalog") Set cat.ActiveConnection = cn For Each tbl In cat.Tables Debug.Print tbl.Name Next tbl Set tbl = Nothing Set cat = Nothing cn.Close Set cn = Nothing End Sub 

这种方法将包括每个表名后的美元符号,这可能不是你想要的。 你可以很容易地剥离它。

我使用Excel 8.0testing了我的xls 2003格式工作簿。 看来Excel 2007格式将需要“Excel 12.0”作为扩展属性。 你可以在ConnectionStrings.comfind更多的细节。

和其他答案一样,除了Debug.Print之外,您还需要对tbl.Name做更有用的tbl.Name

注意这种方法将列出两个命名的范围和工作表。 如果这是您的问题,您可以根据名称是否在最后包含美元符号(“$”)来区分它们。 表有美元符号; 命名的范围不。

像这样的东西?

 Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Set wb = Excel.Workbooks.Open("C:\MyBook.xls") ' Or whatever For Each ws In wb.Worksheets Debug.Print ws.Name ' This prints the name in the Immediate window. ' You'll want to do something useful with them instead. Next ws 

要使用它,必须设置对Excel对象库的引用:工具>引用>设置复选标记旁边的Microsoft Excel xx.0对象库。