对于特定组合,VBA代码执行的时间比平时长

时间:2016-08-23 13:10:07

标签: vba optimization

我有以下VBA代码,当我仅为特定区域(圣地亚哥)执行它时需要很长时间。

所有其他地区的代码运行顺畅。

    Sub Test()
    Range("A8:AQ1800").Clear

    Application.ScreenUpdating = False

   If Sheet4.Range("C1795").Value = False And Sheet4.Range("C1796").Value = True And Sheet4.Range("C1797").Value = True Then

Sheet1.Activate
    Range("F1").Select
    ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=5, Criteria1:=Array( _
        "Clinic", "Medical Group", "Outpatient Surgi Center", "Owner Subsidiary", "="), _
        Operator:=xlFilterValues

     Range("B1").Select
    ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=6, Criteria1:= _
    Sheet2.Range("B1").Value
    Range("A2:D2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheet2.Activate
    ActiveSheet.Select
    Range("B8").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A8").Select
    Selection.End(xlToLeft).Select
    Range("D8").Select
    Selection.End(xlDown).Select
    Selection.End(xlUp).Select
    Range("A8").Select
    Selection.End(xlUp).Select
    Sheet1.Activate
    ActiveSheet.Range("G2:AR2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheet2.Activate
    ActiveSheet.Select
    Range("F8").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("F8").Select
    Selection.End(xlToLeft).Select
    Range("H8").Select
    Selection.End(xlDown).Select
    Selection.End(xlUp).Select
    Range("B8").Select
    Selection.End(xlUp).Select

    End If

sheet2 的前端如下所示。旁边的复选框 医院 ASC 其他 对应于代码中的TRUE / FALSE选项

If Sheet4.Range("C1795").Value = True And Sheet4.Range("C1796").Value = False And Sheet4.Range("C1797").Value = False Then

Sheet 2

Sheet1 的前端如下所示。

enter image description here

只有当我取消一个位置(加利福尼亚州圣地亚哥)医院(False-True-True组合)旁边的框时,代码才需要很长时间才能运行。

我不明白这是否是优化问题,因为任何其他地区都不会发生这种情况。

提前多多感谢。

P.S。如果我提供了足够的信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

陈述:

Range("A2:D2").Select
Range(Selection, Selection.End(xlDown)).Select

具有选择范围从“A2:D2”到“A”列的第一个非空 可见单元格的效果“在当前活动的工作表中(即Sheet1)。

因此,应该结合:

ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=5, Criteria1:=Array( _
    "Clinic", "Medical Group", "Outpatient Surgi Center", "Owner Subsidiary", "="), _
    Operator:=xlFilterValues

ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=6, Criteria1:= _
Sheet2.Range("B1").Value

过滤没有行然后选择所有行到最后一行

站在上面,以下陈述:

Sheet1.Activate .... ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=6, Criteria1:= _ Sheet2.Range("B1").Value

将在其"A1:AR1818"(“地区”)列中过滤工作表Sheet1的范围"F",其内容为Sheet2单元格"B1"

根据您的示例,后者的当前值是“San Diego,CA”,而"F"的列Sheet1似乎充满了数字(例如:“83”)......

假设列Sheet1中的其余部分(但"F"图片中没有可见)没有任何“San Diego,CA”值,那么这些后续声明:

Range("A2:D2").Select
Range(Selection, Selection.End(xlDown)).Select

具有在列A中选择单元格的效果:D从第2行到表格中的最后一行!

我想Sheet4包含用户在Sheet2单元格"B1"下拉列表中选择的值的某些编码到一些代码中

如果是这种情况则替换:

 ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=3, Criteria1:= _
    Sheet2.Range("B1").Value`

使用:

 ActiveSheet.Range("$A$1:$AR$1818").AutoFilter Field:=3, Criteria1:= _
    Sheet4.Range("xn").Value` 

您必须将"xn"更改为正确的Sheet4单元格引用