【问题标题】:Import multiple sheets from workbook从工作簿导入多张工作表
【发布时间】:2020-06-17 14:59:20
【问题描述】:

我已经调整了这个post 以使用 Access 中的 VBA 从单个 Excel 文件将多个 Excel 工作表导入到多个表中。

它创建新表,正确命名它们,使用指定的范围,然后关闭工作簿...... 但每个新的 Access 表都有相同的内容(来自工作表 1)!

即 NewTable1 和 NewTable2 都包含 Worksheet1 的内容,尽管它们的名称不同。看起来代码正在运行,所以我不知道为什么这个错误不断发生。任何帮助表示赞赏。

我编辑的代码,改编自链接的帖子:

Function ImportData()
   ' Requires reference to Microsoft Office 11.0 Object Library.
   Dim fDialog As FileDialog
   Dim varFile As Variant

   ' Clear listbox contents.
   'Me.FileList.RowSource = ""

   ' Set up the File Dialog.
   Set fDialog = Application.FileDialog(3)

   With fDialog

      .AllowMultiSelect = False
      .Filters.Add "Excel File", "*.xlsx"
    .Filters.Add "Excel File", "*.xls"

      If .Show = True Then

         'Loop through each file selected and add it to our list box.
         For Each varFile In .SelectedItems
         ' Label3.Caption = varFile

         Const acImport = 0
         Const acSpreadsheetTypeExcel12Xml = 10

         ''This gets the sheets to new tables
         GetSheets varFile

         Next
         MsgBox ("Import data successful!")
         End If
End With
End Function


Function GetSheets(strFileName)
    'Requires reference to the Microsoft Excel x.x Object Library

    Dim objXL As New Excel.Application
    Dim wkb As Excel.Workbook
    Dim wks As Object

    'objXL.Visible = True

    Set wkb = objXL.Workbooks.Open(strFileName)

    For Each wks In wkb.Worksheets
        'MsgBox wks.Name
        Set TableName = wks.Cells(10, "B")
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
        TableName, strFileName, True, "14:150"
    Next

   'Tidy up
   objXL.DisplayAlerts = False
   wkb.Close
   Set wkb = Nothing
   objXL.Quit
   Set objXL = Nothing

End Function

【问题讨论】:

    标签: excel vba ms-access


    【解决方案1】:

    除非另有说明,否则 DoCmd.TransferSpreadsheet 只会从第一个工作表中提取。代替"14:150",使用:

    wks.Name & "$14:150"

    wks.Name & "!14:150"

    或者使用 wks.CodeName 来提取工作表索引而不是名称,以防名称构造出现问题。

    如果没有范围引用,则需要 $ 字符。

    【讨论】:

    • 传输电子表格似乎没有从活动工作表中拉出。将 wks.activate 添加到 getsheets 的顶部并不能修复错误。相反,它似乎默认为工作簿中的第一张工作表。
    • 我不建议添加 wks.activate。我提出的建议对我有用。
    • comment 应该已经阅读 docmd.transferspreadsheet 似乎默认从第一个工作表中提取,因为调用 wks.activate 来更改活动工作表并不能解决问题。
    • 哦,知道了,修改后的答案。
    • 感谢您的疑难解答。不幸的是,将:wks.Name & "$" 添加到 [range] 字段会导致运行时错误“3125”:“[WorksheetName]$”不是有效名称。确保它不包含无效字符或标点符号,并且不要太长。可能是因为我正在使用的工作表在每个选项卡中都有最大字符。你能解释一下 $ 字符的功能是什么吗?我是 VBA 的新手。另外,如果我错了,请纠正我,但我认为这个解决方案不会输出我想要的范围(14:150)。你知道如何合并这个吗?谢谢。
    【解决方案2】:

    或者,使用类似的字符串变量

     Dim strRange as string
    
     strRange = "sheetname!14:150"
    

    然后

     DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
        TableName, strFileName, True, stRrange
    

    【讨论】:

    • 谢谢瘾君子。不幸的是,我在应用此解决方案时遇到了错误。如果完全实现:Set Range = wks.Range("14:150")DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, TableName, strFileName, True, Range 我会得到“编译错误:参数不是可选的”。如果我改为尝试:WksRange = wks.Range("14:150")DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, TableName, strFileName, True, WksRange 我得到“运行时错误 '2498':您输入的表达式是其中一个参数的错误数据类型”。有什么想法吗?
    • 发现了错误并编辑了我的解决方案。希望现在对你有用
    • ...并且工作表名称中的空格应该不是问题。只需将它完全放在选项卡中的字符串中即可。我在快速测试中尝试了我的解决方案,它运行良好(虽然没有空格:-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多