首页 > 解决方案 > 宏通过几个模块

问题描述

我再次征求您的意见...我有几个宏,如果某个单元格或范围在另一个工作表上发生更改,则应由 Worksheet_Calculate 激活它们。一切正常,但我注意到,一些宏不会在它们的“End Sub”处停止,而是跳转到另一个宏,这导致表中的列没有被排序。这是我所拥有的:Worksheet_Calculate

    Private Sub Worksheet_Calculate()
Static OldVal As Variant

If Range("AL2").Value <> OldVal Then
    OldVal = Range("AL2").Value
    Call RF

ElseIf Range("AM2").Value <> OldVal Then
    OldVal = Range("AM2").Value
    Call SEAL

ElseIf Range("AN2").Value <> OldVal Then
    OldVal = Range("AN2").Value
    Call SUVPCR

ElseIf Range("AO2").Value <> OldVal Then
    OldVal = Range("AO2").Value
    Call Segment

ElseIf Range("AU2").Value <> OldVal Then
    OldVal = Range("AU2").Value
    Call RRC

ElseIf Range("AW2").Value <> OldVal Then
    OldVal = Range("AW2").Value
    Call WG

ElseIf Range("AY2").Value <> OldVal Then
    OldVal = Range("AY2").Value
    Call dB

ElseIf Range("BA2").Value <> OldVal Then
    OldVal = Range("BA2").Value
    Call Noise_em


End If

End Sub

RF 的宏似乎很好,如果我按 F8 单独运行它,它会执行而无需去其他地方:

Sub RF()

On Error Resume Next
If Sheets("All_list").Range("AL2").Value = "No" Then
ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Add2 _
        Key:=Range("All[[#All],[RF]]"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

ElseIf Sheets("All_list").Range("AL2").Value = "Yes" Then
ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Add2 _
        Key:=Range("All[[#All],[RF]]"), SortOn:=xlSortOnValues, Order:= _
        xlDescending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

ElseIf Sheets("All_list").Range("AL2").Value = "All" Then
ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Clear
End If

End Sub

但是这个(段)也可以单独工作,但不能在 Worksheet_calculate 中,由于某种原因它会跳转到 RF 后记。

   Sub Segment()

Dim x() As Variant

With Sheets("All_list")

.Range("AP2:AP10").Clear
.Range("AO2:AO10" & .Cells(.Rows.Count, "AO").End(xlUp).Row).Copy
.Range("AP2").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

x = Application.Transpose(Sheets("All_list").Range("AP2:AP10").Value)

ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort.SortFields.Add2 _
        Key:=Range("All[Segment]"), SortOn:=xlSortOnValues, Order:=xlAscending, _
        CustomOrder:=Join(x, ","), DataOption:=xlSortNormal

End With

    With ActiveWorkbook.Worksheets("All_list").ListObjects("All").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xl`enter code here`TopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With


End Sub

这基本上意味着像 RF(Seal,SUVPCR)这样的宏可以一起运行,甚至是 Segment,但是在 Segment 之后似乎没有任何排序,一切都在它上面。当我将其替换为类似的示例 RRC 时,该 RRC 起作用,但在它之后又什么都没有。很感谢任何形式的帮助。谢谢

标签: excelvbasortingworksheet-function

解决方案


好的,谢谢大家支持,已经搞定了

Private Sub Worksheet_Calculate()
Static OldVal As Variant
Static OldVal2 As Variant
Static OldVal3 As Variant
Static OldVal4 As Variant
Static OldVal5 As Variant
Static OldVal6 As Variant
Static OldVal7 As Variant
Static OldVal8 As Variant

Application.EnableEvents = False

If Range("AL2").Value <> OldVal Then
    OldVal = Range("AL2").Value
    Call RF

ElseIf Range("AM2").Value <> OldVal2 Then
    OldVal2 = Range("AM2").Value
    Call SEAL

ElseIf Range("AN2").Value <> OldVal3 Then
    OldVal3 = Range("AN2").Value
    Call SUVPCR


ElseIf Range("AO2").Value <> OldVal4 Then
    OldVal4 = Range("AO2").Value
    Call Segment

ElseIf Range("AU2").Value <> OldVal5 Then
    OldVal5 = Range("AU2").Value
    Call RRC

ElseIf Range("AW2").Value <> OldVal6 Then
    OldVal6 = Range("AW2").Value
    Call WG

ElseIf Range("AY2").Value <> OldVal7 Then
    OldVal7 = Range("AY2").Value
    Call dB

ElseIf Range("BA2").Value <> OldVal8 Then
    OldVal8 = Range("BA2").Value
    Call Noise_em

End If

Application.EnableEvents = True

End Sub

我忘记将 OldVal 分别分配给每个范围,这个技巧让我很开心。正如您所建议的,我还包括了安全的关闭/开启事件,尽管在这种情况下它似乎根本没有效果。再次感谢支持


推荐阅读