打开工作簿下带有 VBA 代码的慢速 Excel

时间:2021-05-19 15:01:10

标签: excel vba

所以我有一个 Excel 工作簿,其中在打开此文件时向用户显示用户表单。在用户窗体(下拉列表)中,用户必须选择选择后将显示(可见)的不同工作表,其他工作表将被隐藏。不幸的是,打开一个工作簿并显示这个下拉列表需要很多时间,有什么办法可以加快这个过程吗?

这是打开的工作簿中的代码的样子,它只是调用主代码所在的模块:

Private Sub Workbook_Open()

Call openexcel

End Sub

这里是带有 openexcel 部分的模块:

Sub openexcel()

Dim xlApp As Application

Set xlApp = Excel.Application

xlApp.Visible = False

Call OpenForm.Show

End Sub

并且每个电子表格有 5 个模块可以显示或隐藏,每个模块都有以下代码,例如:

Sub spreadsheet1()
Dim xlApp As Application
Dim xlBook As Workbook

Set xlApp = Excel.Application
Set xlBook = ThisWorkbook


With xlBook
    .Sheets("1.1").Visible = True
    .Sheets("1.2").Visible = True
    .Sheets("2.1").Visible = xlVeryHidden
    .Sheets("2.2").Visible = xlVeryHidden
    .Sheets("3.1").Visible = xlVeryHidden
    .Sheets("3.2").Visible = xlVeryHidden
    .Sheets("4.1").Visible = xlVeryHidden
    .Sheets("4.2").Visible = xlVeryHidden
    .Sheets("5.1").Visible = xlVeryHidden
    .Sheets("5.2").Visible = xlVeryHidden
End With

OpenForm.Hide
xlApp.Visible = True


End Sub

那么我怎样才能加快速度呢?也许我不应该将每个选项卡的代码拆分到一个新模块中,而是将所有内容都放在一个模块中?

1 个答案:

答案 0 :(得分:1)

#1 如果您使用 Excel 作为主机,则永远不需要创建新的 Application 对象。

只需使用:

Application.Visible = False
...
Application.Visible = True

#2 您不需要具有相同代码的 5 个不同模块。这违反了“不要重复自己”的编码法则。任何时候复制和粘贴代码时,您都应该认为“这是一个需要动态的新过程”。

示例:

Public Sub UnhideSpreadSheets(ByVal sheetName As String)
    On Error GoTo finally
    Application.ScreenUpdating = False
    
    Dim thisSheet As Worksheet
    For Each thisSheet In ThisWorkbook.Sheets
        If thisSheet.Name Like sheetName & "*" Then
            thisSheet.Visible = xlSheetVisible
        Else
            thisSheet.Visible = xlVeryHidden
        End If
    Next thisSheet

finally:
    Application.ScreenUpdating = True
    OpenForm.Hide
    Application.Visible = True
End Sub

#3 我同意 Mat。问题不在于您的代码,而在于您的工作簿。有多种方法可以优化 Excel 工作簿。请阅读有关该主题的这篇 MS 文章,因为太长无法在此处发布: https://docs.microsoft.com/en-us/office/vba/excel/concepts/excel-performance/excel-tips-for-optimizing-performance-obstructions