【问题标题】:excel VBA importing multiple worksheets is slowexcel VBA导入多个工作表很慢
【发布时间】:2017-03-14 16:17:35
【问题描述】:

我使用以下代码从另一个工作簿导入多个​​工作表并进行一些处理。导入时间过长。有人可以建议一种更有效的导入方式吗?我应该查看源文件中的更多信息以进行复制吗?

Sub SKR_Import()
    On Error GoTo errorhandler
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim Sht As Worksheet
    Set wb1 = ActiveWorkbook
    Dim fd As FileDialog
    Dim filechosen As Integer
    Dim filename As String
    Dim i As Long
    Set fd = Application.FileDialog(msoFileDialogOpen)
    fd.AllowMultiSelect = True
    fd.Title = "Select Excel workbooks to import all sheets"
    filechosen = fd.Show
    If filechosen = -1 Then
        For i = 1 To fd.SelectedItems.Count
            Set wb2 = Workbooks.Open(fd.SelectedItems(i))
            For Each Sht In wb2.Sheets
                Sht.Activate
                ActiveSheet.Copy after:=wb1.Sheets(wb1.Sheets.Count)
            Next Sht
            wb2.Close SaveChanges:=False
        Next i
    End If
    wb1.Activate
    Application.ScreenUpdating = True
    Exit Sub
errorhandler:
    msgBox Error, vbCritical, "Error"
    wb2.Close SaveChanges:=False
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

【问题讨论】:

  • 有必要Sht.Activate吗?你能不只是Sht.Copy吗?
  • 嗨,亚当,感谢您的宝贵时间。我希望 Sht.Activate 不是必需的,我直接使用了 Sht.copy ......仍然对时间没有影响......有什么猜测吗?
  • 如果你有工作代码,只是需要改进,那么你可能在这篇文章的错误地方。 Code Review 是他们处理现有/工作代码的地方,并在速度、安全性、可持续性和寿命方面尽最大努力改进它,包括最佳实践。试试看。他们很好!
  • 当然拉尔夫,我会试一试。我不是专业人士,刚开始使用 VBA...不过 Stack Overflow 帮了大忙!
  • 我找到了解决方案。秘密就在源文件工作表中。它们受到保护,并且有很多对其他工作表和工作簿的引用。我在复制中使用了一个简单的修改 - 在原始工作表中粘贴特殊内容,并将工作表复制到目标工作簿。关闭源书时,保存更改以提供 false。这就像一个魅力!

标签: excel vba import


【解决方案1】:

您可以尝试使用sheets 的复制方法(使用s)一次复制它们,而不是在wb2 的工作表上循环:

        Set wb2 = Workbooks.Open(fd.SelectedItems(i))
        ' For Each Sht In wb2.Sheets
        '     Sht.Activate
        '     ActiveSheet.Copy after:=wb1.Sheets(wb1.Sheets.Count)
        ' Next Sht
        wb2.Sheets.Copy after:=wb1.Sheets(wb1.Sheets.Count)
        wb2.Close SaveChanges:=False

这也将摆脱Activate 语句,这不是必需的,只是浪费了一些时间。

我似乎没有找到其他方法来进一步加速您的代码。

【讨论】:

  • 感谢您的建议 A.S.H.我尝试了您的建议:wb2.Sheets.Copy after:=wb1.Sheets(wb1.Sheets.Count)。当然这是一个更好的方法,但花费的时间仍然太长。不知道为什么。源表中还有其他猜测吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2018-07-14
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多