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