【问题标题】:Excel VBA Sort when Inputting Data, Updated in All Other Sheet?输入数据时Excel VBA排序,在所有其他工作表中更新?
【发布时间】:2020-12-19 01:57:04
【问题描述】:

我是 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 保持一整行。

谢谢!

【问题讨论】:

    标签: excel vba sorting excel-2010


    【解决方案1】:

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

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

    指令是在Key1上对Range("A2:BN2" & lastRow)进行排序。要排序的范围从 A2 开始,到 BN 列中最后使用的行结束。应该包括所有行的所有列。但是 lastRow 是在第 1 列中确定的,也就是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多