Excel 重复宏,直到满足条件

Excel 重复宏,直到满足条件,excel,vba,macros,Excel,Vba,Macros,我正在做一个宏,为我做一个重复的任务。为了给您一个清晰的视图,我准备了下面的初始宏(vba)代码,以及它应该做什么的流程图: 下面是宏的叙述性描述: 检查K列中的所有单元格是否包含单词“MERGED” 如果宏发现单词“Merged”,它将调用另一个宏(macro_X) 调用宏后,它将再次检查K列中的所有单元格是否仍然包含单词“MERGED” 如果宏仍然找到单词“Merged”,它将再次调用宏X 该条件将仅在列K不包含单词“Merged”之前停止 如果宏在K列中没有找到任何“合并”单词,它现在将调

我正在做一个宏,为我做一个重复的任务。为了给您一个清晰的视图,我准备了下面的初始宏(vba)代码,以及它应该做什么的流程图:

下面是宏的叙述性描述:

  • 检查K列中的所有单元格是否包含单词“MERGED”
  • 如果宏发现单词“Merged”,它将调用另一个宏(macro_X)
  • 调用宏后,它将再次检查K列中的所有单元格是否仍然包含单词“MERGED”
  • 如果宏仍然找到单词“Merged”,它将再次调用宏X
  • 该条件将仅在列K不包含单词“Merged”之前停止
  • 如果宏在K列中没有找到任何“合并”单词,它现在将调用宏_Z

    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = Last To 1 Step -1
        If (Cells(i, "K").Value) = "Merged" Then
    
            Call macro_x
    
        End If
    Next I
    
  • K列截图


    我已经有了上面的代码,但它不工作。不知道为什么。您能帮我指出错误或建议一个更好的代码吗?

    您可以添加简单的布尔变量来检查是否找到“合并”一词

    Dim Word_Found as Boolean
    
    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = Last To 1 Step -1
        If (Cells(i, "K").Value) = "Merged" Then
            Call macro_x
    
            Word_Found = True
            i = LAST
    
        End If
    Next I
    
    If Not(Word_Found) Then Call macro_z
    
    上面的代码是可以从代码中修改的

    下面的代码是根据您的流程图编写的

    While Not (Columns("K").Find("Merged") Is Nothing)
        Call macro_x
    Wend
    Call macro_z
    

    您可以添加简单的布尔变量来检查是否找到单词“MERGED”

    Dim Word_Found as Boolean
    
    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = Last To 1 Step -1
        If (Cells(i, "K").Value) = "Merged" Then
            Call macro_x
    
            Word_Found = True
            i = LAST
    
        End If
    Next I
    
    If Not(Word_Found) Then Call macro_z
    
    上面的代码是可以从代码中修改的

    下面的代码是根据您的流程图编写的

    While Not (Columns("K").Find("Merged") Is Nothing)
        Call macro_x
    Wend
    Call macro_z
    

    您可以在宏X的末尾调用初始宏。 对于初始宏:

    Sub checker()
    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = 1 To Last Step -1
        If (Cells(i, "K").Value) = "Merged" Then
    
            Call macro_x
    
        End If
    Next I
    Call macro_z
    End Sub
    
    对于宏_x:

    Sub macro_x()
    'DO SOMETHING HERE
    
    Call checker
    End Sub
    
    编辑:


    您可以在宏X的末尾调用初始宏。 对于初始宏:

    Sub checker()
    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = 1 To Last Step -1
        If (Cells(i, "K").Value) = "Merged" Then
    
            Call macro_x
    
        End If
    Next I
    Call macro_z
    End Sub
    
    对于宏_x:

    Sub macro_x()
    'DO SOMETHING HERE
    
    Call checker
    End Sub
    
    编辑:

    我看到的第一件事是在你的单元格中“合并”并不是以大写字母开头,而是在你的代码中

    所以请换成这个

    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = Last To 1 Step -1
        If (Cells(i, "K").Value) = "merged" Then
    
            Call macro_x
    
        End If
    Next I
    
    我看到的第一件事是在你的单元格中“合并”并不是以大写字母开头,而是在你的代码中

    所以请换成这个

    Last = Cells(Rows.Count, "K").End(xlUp).Row
    For i = Last To 1 Step -1
        If (Cells(i, "K").Value) = "merged" Then
    
            Call macro_x
    
        End If
    Next I
    


    它怎么不起作用?你收到错误代码了吗?或者它输出不正确?什么都没有。什么都没有发生。没有输出。无错误。检查单词Merged是否键入Merged(区分大小写)。由于您没有使用Sheets()函数,请确保您正在检查的工作表已激活。谢谢@MutjayLee,我对工作表以及区分大小写没有任何问题。它是如何工作的?你收到错误代码了吗?或者它输出不正确?什么都没有。什么都没有发生。没有输出。无错误。检查单词Merged是否键入Merged(区分大小写)。由于您没有使用Sheets()函数,请确保您正在检查的工作表已激活。谢谢@MutjayLee,我对工作表以及区分大小写没有问题。谢谢@9i2的回答。不幸的是,它没有起到很好的作用。没有错误,但它调用宏_z时没有执行子_检查,这使得标准或条件不满足。除了我编辑的答案。如果您的单元格包含“合并”以外的字符。。您可以使用“*Merged*”谢谢@9i2的回答。不幸的是,它没有起到很好的作用。没有错误,但它调用宏_z时没有执行子_检查,这使得标准或条件不满足。除了我编辑的答案。如果您的单元格包含“合并”以外的字符。。您可以使用“*Merged*”我已经尝试了您的代码,但它只做了2到3次检查,只留下K列仍然有K列的单词“Merged”。当我再次运行它时,我得到错误“运行时错误13类型不匹配”宏x是否将K列中的值更改为“合并”?意思是在运行宏x之后,是否需要再次检查K列?是的。您可以参考流程图。框名为“调用宏x”的部分,在执行宏x之后,它将再次返回到名为“检查列K…”的框。我编写了另一个代码,它将完全执行流程图所做的操作。看看那个助手是否工作得很好!最后一个问题,如果它不考虑病例敏感性是可能的。我的意思是,单词“merged”可以用不同的方法编写,比如“merged”、“merged”、“merged”等等。我试过你的代码,但它只做了2到3次检查,只留下K列仍然有K列,即单词“merged”。当我再次运行它时,我得到错误“运行时错误13类型不匹配”宏x是否将K列中的值更改为“合并”?意思是在运行宏x之后,是否需要再次检查K列?是的。您可以参考流程图。框名为“调用宏x”的部分,在执行宏x之后,它将再次返回到名为“检查列K…”的框。我编写了另一个代码,它将完全执行流程图所做的操作。看看那个助手是否工作得很好!最后一个问题,如果它不考虑病例敏感性是可能的。我的意思是,“合并”这个词可以用不同的方法写,比如“合并”、“合并”、“合并”等等。。