输入数据时 Excel VBA 排序,在所有其他工作表中更新?

问题描述

我是 VBA Excel 的新手。

我想为每个月创建一个数据库,其中有 1 个“主工作表”作为姓名列表,当我输入数据以及更新另一张工作表时,“主工作表”上的列表将自动排序为一行.

我找到了这个代码,它只在输入的工作表中更新/排序(假设是“主工作表”)。如果输入的数据和排序在所有其他工作表中自动更新,这可能吗?

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Column = 1 Then
    
        Dim lastRow As Long
        lastRow = Cells(Rows.Count,1).End(xlUp).Row
        Range("A2:BN2" & lastRow).sort key1:=Range("A2:A" & lastRow),order1:=xlAscending,Header:=xlNo
    
    End If
End Sub

我尝试引用/粘贴每个月名称链接(从 A2 开始),但我不知道将 A2 旁边的列(B2、C2 等)与 A2 保持为整行。

谢谢!

解决方法

查看您代码的这一部分,了解如何解决您的问题。

Range("A2:BN2" & lastRow).Sort Key1:=Range("A2:A" & lastRow)

指令是对 Key1 上的 Range("A2:BN2" & lastRow) 进行排序。要排序的范围从 A2 开始,以列 BN 中最后使用的行结束。应包括所有行的所有列。但是 lastRow 是在第一列中确定的,也就是 A 列。我们希望所有的列都具有相同的长度。请注意,我们不知道范围位于哪个选项卡上。默认情况下,如果未指定工作表,Excel 将假定为 ActiveSheet。代码位于工作表事件过程中这一事实证明了这一点。当然,此代码链接到其代码模块所在的工作表。当另一个工作表处于活动状态时它不会运行。

但是,为特定工作表指定范围的语法如下所示。

With Worksheets("MySheet")
    lastRow = .Cells(.Rows.Count,1).End(xlUp).Row
    Set MyRange = .Range("A2:BN2" & lastRow)
End With

请注意所有领先期间,每个期间都将其前面的语句链接到 With 语句中指定的工作表。想象一个循环,其中的工作表名称在每一轮都会更改,从而在每个实例的不同工作表上定义相同的范围。

Sort 方法的 Key 参数指定要排序的列。它被称为“键”而不是“列”,因为有工作表列和范围列。在您的情况下,工作表行与范围行不同,因为您的范围从第 2 行开始,但范围列与工作表列相同。无论如何, Key1:=Range("A2:A" & lastRow) 不是指向要排序的列的很好的指针。 1 个单元格就足够了,例如 Key1:=Range("A2") - 或我喜欢的 Key1:=Cells(2,1)

如您所见,这部分要简单得多。唯一需要注意的重点是指定Key 的单元格必须在要排序的范围内。这也意味着您不能在 ActiveSheet 上为另一个选项卡上的排序范围指定 Key。因此,在构建循环时,您需要从正确定义的排序范围中取出一个单元格作为 Key