Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化VBA程序_Vba_Excel - Fatal编程技术网

优化VBA程序

优化VBA程序,vba,excel,Vba,Excel,我创建了几个VBA函数和宏来自动化我的工作,但是随着更多的数据进入,我注意到在运行宏时会有更大的延迟。在我的代码中有什么我可以改变或改变的东西来提高它的效率吗 该计划的前提是: -“刷新”按钮在所有工作表中循环,根据完成情况更改颜色,并将“未完成/过期”表单的信息放入表中(速度最慢) 这个问题可能是最好的答案,但提高性能的一个简单方法是执行以下操作: '=============== 'Refresh Button on MASTER PAGE 'Functions: Updates color

我创建了几个VBA函数和宏来自动化我的工作,但是随着更多的数据进入,我注意到在运行宏时会有更大的延迟。在我的代码中有什么我可以改变或改变的东西来提高它的效率吗

该计划的前提是: -“刷新”按钮在所有工作表中循环,根据完成情况更改颜色,并将“未完成/过期”表单的信息放入表中(速度最慢)


这个问题可能是最好的答案,但提高性能的一个简单方法是执行以下操作:

'===============
'Refresh Button on MASTER PAGE
'Functions: Updates color of sheets, based on completion/incompletion
'           Removes inputs from MASTER page
'           Updates Expired Forms cells
'====================
Sub refresh_form()
Dim ws As Worksheet
Dim wsMaster As Worksheet: Set wsMaster = Worksheets("MASTER")
Dim wb As Workbook
Dim wsTEMP As String
Dim complete As Integer, incomplete As Integer, exp As Integer, default As Integer       'to store color index's
Dim lastRow As Long                      'to store row # for expired & incomplete form

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual

'CLEARS DATA FROM MAIN SHEET
 wsMaster.Range("C6:C10").ClearContents

complete = 4        'Green
incomplete = 44     'Orange
default = 2         'White
exp = 3             'Red
lastRow = 5        'Expired & Incomplete row starts at 5

For Each ws In ThisWorkbook.Worksheets                                                'Loops through all worksheets on click
    If ws.Name = wsMaster.Name Or ws.Name = "TEMPLATE" Then                           'For MASTER and TEMPLATE sheet, skip
        ws.Tab.ColorIndex = default
    ElseIf ws.Range("$M12").Value = True And ws.Range("$M$15").Value = True Then      'Applies "Exp" tab color to expired/incomp forms
        ws.Tab.ColorIndex = exp
        lastRow = lastRow + 1                                                         'increments lastRow by a value of 1
        wsMaster.Range("K" & lastRow).Value = ws.Range("$C$8").Value                  'GSA #
        wsMaster.Range("L" & lastRow).Value = ws.Range("$C$5").Value                  'Project name
        wsMaster.Range("M" & lastRow).Value = ws.Range("$C$9").Value                  'Expiration date
    ElseIf ws.Range("$M$12").Value = True Then                                        'Applies "Incomplete" tab color to incomplete forms
        ws.Tab.ColorIndex = incomplete
    ElseIf ws.Range("$M$12").Value = False And ws.Range("$N$12").Value = True Then    'Applies "Complete" tab color to complete forms
        ws.Tab.ColorIndex = complete
    Else                                                                              'Applies "Default" tab color to any untouched forms
        ws.Tab.ColorIndex = default
    End If
Next ws                                                                               'End Loop

Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

这个问题可能是最好的答案,但提高性能的一个简单方法是执行以下操作:

'===============
'Refresh Button on MASTER PAGE
'Functions: Updates color of sheets, based on completion/incompletion
'           Removes inputs from MASTER page
'           Updates Expired Forms cells
'====================
Sub refresh_form()
Dim ws As Worksheet
Dim wsMaster As Worksheet: Set wsMaster = Worksheets("MASTER")
Dim wb As Workbook
Dim wsTEMP As String
Dim complete As Integer, incomplete As Integer, exp As Integer, default As Integer       'to store color index's
Dim lastRow As Long                      'to store row # for expired & incomplete form

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual

'CLEARS DATA FROM MAIN SHEET
 wsMaster.Range("C6:C10").ClearContents

complete = 4        'Green
incomplete = 44     'Orange
default = 2         'White
exp = 3             'Red
lastRow = 5        'Expired & Incomplete row starts at 5

For Each ws In ThisWorkbook.Worksheets                                                'Loops through all worksheets on click
    If ws.Name = wsMaster.Name Or ws.Name = "TEMPLATE" Then                           'For MASTER and TEMPLATE sheet, skip
        ws.Tab.ColorIndex = default
    ElseIf ws.Range("$M12").Value = True And ws.Range("$M$15").Value = True Then      'Applies "Exp" tab color to expired/incomp forms
        ws.Tab.ColorIndex = exp
        lastRow = lastRow + 1                                                         'increments lastRow by a value of 1
        wsMaster.Range("K" & lastRow).Value = ws.Range("$C$8").Value                  'GSA #
        wsMaster.Range("L" & lastRow).Value = ws.Range("$C$5").Value                  'Project name
        wsMaster.Range("M" & lastRow).Value = ws.Range("$C$9").Value                  'Expiration date
    ElseIf ws.Range("$M$12").Value = True Then                                        'Applies "Incomplete" tab color to incomplete forms
        ws.Tab.ColorIndex = incomplete
    ElseIf ws.Range("$M$12").Value = False And ws.Range("$N$12").Value = True Then    'Applies "Complete" tab color to complete forms
        ws.Tab.ColorIndex = complete
    Else                                                                              'Applies "Default" tab color to any untouched forms
        ws.Tab.ColorIndex = default
    End If
Next ws                                                                               'End Loop

Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

将其添加到DIMs下方的代码开头

Application.calculation=xlcalculationmanual
application.screenupdating=false
application.displaystatusbar=false
application.enableevents=false
然后将其添加到代码末尾的end sub之前

Application.calculation=xlcalculationautomatic
application.screenupdating=true
application.displaystatusbar=true
application.enableevents=true

这将有助于加快代码速度。

将其添加到DIM下方的代码开头

Application.calculation=xlcalculationmanual
application.screenupdating=false
application.displaystatusbar=false
application.enableevents=false
然后将其添加到代码末尾的end sub之前

Application.calculation=xlcalculationautomatic
application.screenupdating=true
application.displaystatusbar=true
application.enableevents=true

这将有助于加快代码的速度。

大多数宏都没有执行任何非常密集的操作。Excel所做的最密集的操作是在工作表之间切换时更新UI。如果暂时禁用UI更新,您可能会看到显著的改进

在为每个循环输入
之前,请调用
Application.screenUpdate=False

在子程序退出之前,恢复屏幕更新
Application.ScreenUpdate=True


为了提高代码的性能,您可以做的事情不多。其他优化选项是将工作表的数量保持在最低限度,或者使用多个工作簿。

大多数宏都没有做任何非常密集的工作。Excel所做的最密集的操作是在工作表之间切换时更新UI。如果暂时禁用UI更新,您可能会看到显著的改进

在为每个
循环输入
之前,请调用
Application.screenUpdate=False

在子程序退出之前,恢复屏幕更新
Application.ScreenUpdate=True



为了提高代码的性能,您可以做的事情不多。其他优化选项是将工作表的数量保持在最低限度,或者使用多个工作簿。

我看不出有多少会减慢速度。也许您的公式正在查看
MASTER
——在这种情况下,我会在运行它之前禁用计算,然后再次启用它们。您也可以禁用屏幕更新,但这不会有太大的区别。顺便说一句,不应该
ThisWorkbook.Worksheets(“MASTER”).Ra…
真的阅读
ThisWorkbook.Worksheets(wsMaster).Ra…
?@CLR了解其中的一些。但是,前五个用法大约在'wsMASTER=“MASTER”'(注释中似乎指出,它不是一个工作表变量)之前,并且会导致错误。当声明变量时,如果您不包含'as String'或您想要的任何内容,它们默认声明为Variant,不确定这是否是您想要的,@Mistella-你说得对,
wsMaster
的分配需要提前进行。它们总是与
ThisWorkbook
相关,并且没有打开/创建其他工作簿,因此我认为可以安全地假设OP忽略了这一点,并添加了一个伪常量,以防他们决定在某个时候更改选项卡名称。我看不到有多少东西会让事情变慢。也许您的公式正在查看
MASTER
——在这种情况下,我会在运行它之前禁用计算,然后再次启用它们。您也可以禁用屏幕更新,但这不会有太大的区别。顺便说一句,不应该
ThisWorkbook.Worksheets(“MASTER”).Ra…
真的阅读
ThisWorkbook.Worksheets(wsMaster).Ra…
?@CLR了解其中的一些。但是,前五个用法大约在'wsMASTER=“MASTER”'(注释中似乎指出,它不是一个工作表变量)之前,并且会导致错误。当声明变量时,如果您不包含'as String'或您想要的任何内容,它们默认声明为Variant,不确定这是否是您想要的,@Mistella-你说得对,
wsMaster
的分配需要提前进行。它们总是与
ThisWorkbook
相关,并且没有打开/创建其他工作簿,因此我认为可以安全地假设OP忽略了这一点,并添加了一个伪常量,以防他们决定在某个时候更改选项卡名称。谢谢。这带来了明显的不同。谢谢。这带来了明显的不同。谢谢你的帮助。代码没有那么密集,但我正在添加越来越多的工作表,使其运行速度大大降低,因为它必须循环遍历每个工作表。谢谢您的帮助。代码没有那么密集,但我正在添加越来越多的工作表,使其运行速度大大降低,因为它必须循环遍历每个工作表。如果你问我,这是一个非常好的答案,你不仅禁用了所有合理的功能,而且还重构了OPs代码。干得好:-)我同意。谢谢你的回答@Xabier@Nikolajs不用担心,很高兴能为您提供帮助……:)如果你问我,这是一个非常好的答案,你不仅禁用了所有合理的东西,而且还重构了OPs代码。干得好:-)我同意。谢谢你的回答@Xabier@Nikolajs不用担心,很高兴能为您提供帮助……:)