VBA Excel -对单个工作簿中4个工作表上的一组列中的数据进行排序-子例程仅在第一页上有效

2w2cym1i  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(84)

我对VBA还很陌生,我真的很难让这个程序在不止一个工作表上工作。这个程序应该按从N14到N66的降序排列日期。程序在第一个工作表上按预期工作,但在其他3个工作表上不工作。指定的区域在所有4个工作表上都是相同的(N14 - N66),它需要排列的数据是所有四个工作表上的日期。
我尝试过为每一个单独的工作表放置代码,但结果都一样。我也尝试过为工作表2-4循环,但也不起作用。我也尝试过用不同的方式编写代码,但也不成功。我尝试了所有我能找到的修复方法;然而,我无法让它在所有四个工作表上工作。我也尝试过查看一个非常类似的问题(VBA-Excel macro only works on current sheet),但我一直得到“编译错误:无效或未限定的引用”错误。
目前,主程序作为子程序“OrderDates”(下面的程序)位于模块中。每个工作表(在“Microsoft Excel对象文件夹”中)都调用此子程序。使用此结构,程序仅在1个工作表上完美运行,但在其他3个工作表上不运行,尽管它必须在第一个工作表中执行相同的任务。
“OrderDates”子例程(在模块中)。

Sub OrderDates()
    On Error Resume Next
    If Not Intersect(Target, Range("N:N")) Is Nothing Then
        Range("N14").Sort key1:=Range("N66"), _
        Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=True, _
        Orientation:=xlTopToBottom
    End If
End Sub

当对工作表进行更改时调用子例程(这是为Microsoft Excel Objects文件夹中的每个工作表单独调用的)。

Private Sub Worksheet_Change(ByVal Target As Range)
    Call OrderDates
End Sub

非常感谢您提前回复。

ldfqzlk8

ldfqzlk81#

请尝试下一个经过修改的解决方案。该解决方案没有回答我的澄清问题,而是假设讨论中的四个表包含一个类似的Event代码,并且您希望被调用的Sub处理各自触发的事件表。被调用的公共Sub必须有一个参数来知道调用来自哪里:

Sub OrderDates(Target as Range)
    dim ws as Worksheet
    set ws = Target.parent
    If Not Intersect(Target, ws.Range("N:N")) Is Nothing Then
        ws.Range("N14").Sort key1:=ws.Range("N66"), _
        Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=True, _
        Orientation:=xlTopToBottom
    End If
End Sub

Range("N:N")引用了活动工作表,并且它必须是完全限定的。
Event代码应如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
    OrderDates Target
  Application.EnableEvents = True
End Sub

要“通知”被调用的子程序应处理的范围...

相关问题