在autofilter之后使用条件语句来执行宏

时间:2014-05-28 15:06:03

标签: vba

我有一个创建的宏列表,它们都可以自行工作,如果按顺序运行,也可以工作。为了预防,我想将我的序列变成一个单独的宏,其中包含条件语句,以防数据不存在。

这是我对条件宏的尝试,它似乎没有给我想要的结果:

Sub KPIFull()

    Application.Run "RemoveFormatting"
    Application.Run "WorkBookSetUp"
    Application.Run "SeparateData"

If Sheets("RM Deliveries").Range("B2").Value = True Then
        Application.Run "RMDeliveriesOutput"
    Else: Next

If Sheets("RM TAT").Range("B2").Value = True Then
        Application.Run "RMTATOutput"
    Else: Next

If Sheets("FP Deliveries").Range("B2").Value = True Then
        Application.Run "FPDeliveriesOutput"
    Else: Next

If Sheets("FP TAT").Range("B2").Value = True Then
        Application.Run "FPTAToutput"
    Else: Next

End Sub

那么,为什么这对我不起作用......我使用autofilter。整个宏的目的是从数据库中获取数据,将其放入Excel中,然后运行此宏以获取完整的报告。我是如何做到这一点的,让分析师将数据库数据放入Sheet1,然后将其复制到Sheets 2& 3.表2和3自动过滤器具有明确的术语。

当我检查单元格B2中的值是否存在,并且B2可能被过滤掉时,我仍然运行代码,如果自动过滤后没有剩余行,则可能导致错误。

我想要的是采取并修改此代码以执行以下操作:

If Sheets("Sheet1").Range("B2:B").Contain="Term1, Term2, Term3"  Then
        Application.Run "RMDeliveriesOutput"
    Else: Next

我的问题是我不知道为 contains =“term1,term2,term3”写什么,这可能实际上是正确的VBA代码。

有没有人知道将这种类型的搜索作为条件的方法?


编辑:

根据与Xiaoy312的合作尝试以下内容:

Sub KPIFull()

    RemoveFormatting
    WorkBookSetUp
    SeparateData

    Dim abc As Integer
    Dim def As Integer

        Sheets("RM").Select
        Range("A1").Select
        Selection.CurrentRegion.Select
        abc = Selection.Rows.Count

            If abc > 2 Then
                RMDeliveriesOutput
                RMTATOutput
            End If

        Sheets("FP").Select
        Range("A1").Select
        Selection.CurrentRegion.Select
        def = Selection.Rows.Count

            If def > 2 Then
                FPDeliveriesOutput
                FPTATOutput
            End If

End Sub

FPDeliveriesOutput和FPTATOutput都来自FP!在完成他们的工作流程如果我可以在那个阶段终止工作流程,它可能会工作,尽管代码似乎仍在工作,尽管“如果”不满意。有什么建议吗?

----------------------------------------------- -------------------------------------------------- --------

EDIT2:

此代码似乎有效:

Sub KPIFull()

RemoveFormatting
WorkBookSetUp
SeparateData
RemoveHiddenRowsRM
RemoveHiddenRowsFP

Dim abc As Integer
Dim def As Integer

    Sheets("RM").Select
    Range("A1").Select
    Selection.CurrentRegion.Select
    abc = Selection.Rows.Count

    Sheets("FP").Select
    Range("A1").Select
    Selection.CurrentRegion.Select
    def = Selection.Rows.Count

        If abc > 2 Then

            RMDeliveriesOutput
            RMTATOutput

        End If

        If def > 2 Then

            FPDeliveriesOutput
            FPTATOutput

        End If

End Sub

在我删除了自动过滤页中的隐藏行后,它才有效。

1 个答案:

答案 0 :(得分:0)

  • 除非您想要做一些动态的事情,否则无需使用Application.Run。 只需调用不带括号的子程序。
  • 在条件中不必针对True测试变量。如果它等于true,因为它是真的。
  • Next关键字仅用于标记For循环的结束。
If (condition1) Then
    'do something if condition1
ElseIf (condition2) Then 'Keep in mind that this is optional
    'do something if condition2
'You can also add as many ElseIf below

Else 'This is also optional
    'do something if everything above fails
End If

这是您的代码修复

Sub KPIFull()
    RemoveFormatting
    WorkBookSetUp
    SeparateData

    'Unless you want to stop after 'RM Deliveries'!B2 contains something
    'Ill suggest you to replace the IF THEN....ELSEIF...THEN...END IF by
    'IF THEN ... END IF
    'IF THEN ... END IF
    'IF THEN ... END IF
    'IF THEN ... END IF
    If Not IsEmpty(Sheets("RM Deliveries").Range("B2")) Then
        RMDeliveriesOutput
    ElseIf Not IsEmpty(Sheets("RM TAT").Range("B2")) Then
        RMTATOutput
    ElseIf Not IsEmpty(Sheets("FP Deliveries").Range("B2")) Then
        FPDeliveriesOutput
    ElseIf Not IsEmpty(Sheets("FP TAT").Range("B2")) Then
        FPTAToutput
    End If
End Sub

如果要测试字符串是否包含在另一个字符串中,请使用InStr函数并测试结果是否为0. InStr将返回您要查找的位置。

instr(1, "QWEASDZXC", "ASD") <> 0

您可以尝试此操作来测试工作表是否包含除标题行

以外的数据
Sheets("FP TAT").UsedRange.SpecialCells(xlCellTypeConstants).Rows.Count > 2